작업 / 역할의 하위 집합 만 실행하는 데 사용할 수있는 태그를 사용할 수 있습니다. 이는 기본적으로 모든 작업이 실행되며 일부 작업이 실행되는 것을 막을 수 있음을 의미합니다.
“foo”태그가 지정된 경우 에만 작업 실행을 제한 할 수 있습니까 ? when
작업 섹션 에서 현재 태그를 사용할 수 있습니까 ?
답변
Ansible 2.5에는 특수 태그 never
와가 포함되어 always
있습니다. never
이 목적으로 태그 를 정확하게 사용할 수 있습니다. 예 :
tasks:
- debug: msg='{{ showmevar}}'
tags: [ 'never', 'debug' ]
이 예에서 작업은 debug
(또는 never
) 태그가 명시 적으로 요청 된 경우에만 실행됩니다 . [확실한 문서에 대한 참조]
답변
이것은 로터리 솔루션이지만 작동합니다.
작업 목록 안에 정상적인 실행이 실행될 때 변수를 등록합니다. 그런 다음 태그가 지정된 작업에 해당 변수를 확인하는 when 조건을 추가하십시오.
- shell: /bin/true
register: normal_task_list
- name: Only run when tag is specified
shell: /bin/echo "Only running because of specified tag"
when: normal_task_list is not defined
tags: specified
답변
커맨드 라인 변수 ( --extra-vars
) 사용을 제안하는 답변에 대해 찬성하거나 의견을 제시 할만큼 평판이 좋지 않지만 추가해야 할 내용이 있습니다.
이 방법의주의 사항은 추가 변수를 정의하지 않으면 재생이 오류가 발생하고 실패한다는 것입니다.
--extra-vars
플레이 북 자체에서 기본값을 정의 하여 정의가 없는 경우 재생 실패를 방지 할 수 있습니다 .
---
- hosts: ...
# ↓↓↓
vars:
thorough: false
# ↑↑↑
tasks:
- name: apt - install nfs-common only when thorough is true
when: thorough | bool
apt:
cache_valid_time: 86400
force: yes
pkg:
- nfs-common
--extra-vars
명령 행에 정의 된 변수가 다른 모든 정의보다 우선하므로 via 를 대체 해도 여전히 작동합니다.
결과는 명령 행에서로 thorough
변경되지 않은 경우 오류없이 재생이 실행됩니다 true
.
답변
태그를 지정하지 않으면 달리 실행되는 실수로 실행되는 작업으로부터 보호하기 위해 조건 을 사용할 수 있습니다 . 이 방법의주의 사항은 추가 변수를 정의하지 않으면 재생이 오류가 발생하고 실패한다는 것입니다.
extra-vars 인수를 사용하면 조건부 실행을 트리거 할 수 있습니다.
플레이 북 –help :
-e EXTRA_VARS, --extra-vars=EXTRA_VARS
set additional variables as key=value or YAML/JSON
예:
ansible-playbook test.yaml -e "thorough=true"
test.yaml :
...
- name: apt - install nfs-common only when thorough is true
apt:
cache_valid_time: 86400
force: yes
pkg:
- nfs-common
when: thorough | default(False)
...
답변
Ansible 2.1.1.0에서는 ‘tags’변수 확인이 작동하지 않습니다. 테스트는 아래를 참조하십시오. Ansible 1.9.X 및 2.XY 모두에서 작동하는 태그가 정의 된 경우에만 작업을 실행하는 다른 아이디어가 있습니다.
- set_fact: foo=true
tags: bar
- set_fact: foo=false
- name: do something when 'bar' tag is defined
debug: var=foo
when: foo
tags: bar
이를 통해 태그없이 플레이 북을 실행할 때 ‘foo’변수는 true로 설정되고 false로 설정되므로 아무 것도 실행되지 않습니다. ‘bar’태그를 추가하면 첫 번째 설정 만 적용되므로 ‘foo’변수가 true가되면 작업이 실행됩니다. 즐겨!
Ansible 2.1.1.0의 ‘tags’변수에 대한 테스트는 다음과 같습니다.
플레이 북은 다음과 같습니다.
- hosts: localhost
connection: local
tasks:
- name: display tags variable
debug: var=tags
tags: foo
- name: do something only when tag 'foo' is provided
debug: var=tag
when: tags is defined
tags: foo
그리고 출력은 다음과 같습니다.
$ ansible-playbook --version ; ansible-playbook ./test.yml -t foo
ansible-playbook 2.1.1.0
config file = /home/nootal/projects/ivy/src/ansible/ansible.cfg
configured module search path = Default w/o overrides
PLAY [localhost] ***************************************************************
TASK [display tags variable] ***************************************************
ok: [localhost] => {
"tags": "VARIABLE IS NOT DEFINED!"
}
TASK [do something only when tag 'foo' is provided] ****************************
PLAY RECAP *********************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0
답변
예. --tags foo
플래그가 있는 재생 가능한 플레이 북을 실행하면 태그가 지정된 작업 만 foo
실행됩니다. 예를 들어 example.yml이라는 플레이 북이 있다고 가정합니다.
tasks:
- yum: name={{ item }} state=installed
with_items:
- httpd
- memcached
tags:
- packages
- name: some other task
..
tags:
- some other tag
달리는:
ansible-playbook example.yml --tags "packages"
yum 작업 만 실행되도록합니다.
따라서 실제로 섹션에서 조건부로 작업을 실행하기 위해 태그를 사용할 필요는 없습니다. 플레이 북 / 역할의 복잡성에 따라 –tags 및 –skip-tags 조합을 사용하여 실행할 작업을 제어해야 할 수도 있습니다. 예를 들어 포함 작업에 ‘foo’태그가 있고 포함 된 플레이 북 내의 일부 작업에 ‘bar’태그가 있고
ansible-playbook --tags "foo"
내부 작업 ( ‘bar’로만 태그 지정됨)이 실행됩니다. ‘bar’로 태그가 지정된 모든 내부 작업이 실행되지 않도록하려면 다음 명령을 실행해야합니다.
ansible-playbook --tags foo --skip-tags bar
답변
특별한 태그 “never” 가 있는데, 태그가 특별히 요청되지 않으면 작업이 실행되지 않습니다.
tasks:
- debug: msg='{{ showmevar}}'
tags: [ 'never', 'debug' ]