작업 / 역할의 하위 집합 만 실행하는 데 사용할 수있는 태그를 사용할 수 있습니다. 이는 기본적으로 모든 작업이 실행되며 일부 작업이 실행되는 것을 막을 수 있음을 의미합니다.
"foo"태그가 지정된 경우 에만 작업 실행을 제한 할 수 있습니까 ? when
작업 섹션 에서 현재 태그를 사용할 수 있습니까 ?
작업 / 역할의 하위 집합 만 실행하는 데 사용할 수있는 태그를 사용할 수 있습니다. 이는 기본적으로 모든 작업이 실행되며 일부 작업이 실행되는 것을 막을 수 있음을 의미합니다.
"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
untagged
이것을 달성 하기 위해 사용할 수도 있습니다 :- set_fact: untagged_run=true
tags: untagged
커맨드 라인 변수 ( --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
.
thorough | default('no') | bool
.
when: thorough is defined and thorough
이 구문을 선호하는 경우
is defined and
합니다. 구문을 더 좋아하십시오 . 내가 느끼지 못하는 여러 파이프보다 직관적입니다.
태그를 지정하지 않으면 달리 실행되는 실수로 실행되는 작업으로부터 보호하기 위해 조건 을 사용할 수 있습니다 . 이 방법의주의 사항은 추가 변수를 정의하지 않으면 재생이 오류가 발생하고 실패한다는 것입니다.
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)
...
thorough | default("false") | match("true")
. 기본값은 false
일치하지 않아도 true
되지만 가독성이 향상됩니다.
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
ansible-playbook
옵션을 사용하여 동작을 수행 할 수 있지만 OP는 ansible-playbook
명령 에 특정 태그를 명시 적으로 추가하지 않으면 작업에 주석을 달 수있는 방법을 요구한다고 생각합니다 .
특별한 태그 "never" 가 있는데, 태그가 특별히 요청되지 않으면 작업이 실행되지 않습니다.
tasks:
- debug: msg='{{ showmevar}}'
tags: [ 'never', 'debug' ]
when 절은 태그의 존재를 평가할 수 없습니다. 이 문제를 해결하기 위해 변수와 태그를 함께 사용하여 해당 태그 / 변수에 특정한 작업을 실행합니다.
예 : 플레이 북과 인벤토리를 상상해보십시오
재고 [개발자] 192.168.1.1 # site.yml -호스트 : dev 역할 : -{역할 : 공통} 그리고 common / tasks / main.yml에서 역할 / 공통 / 작업 /main.yaml -이름 : 링크 설치 적절한 : 이름 = 링크 상태 = 현재 -포함 : uninstall.yml 언제 : uninstall_links가 정의되었습니다 태그 : - 제거 # 역할 /common/tasks/uninstall.yml -이름 : 링크 제거 적절한 : 이름 = 링크 상태 = 없음
이 방법을 사용하면 태그를 사용하여 uninstall.yml의 작업 만 선택하지만 'uninstall_links'변수를 사용하도록 설정해야합니다. 따라서 매개 변수없이 플레이 북을 실행하면 기본적으로 설치 작업이 실행됩니다. 제거하려면 태그 'uninstall'을 플레이 북 (또는 cmdline)으로 설정하고 변수를 설정 해야 합니다. 태그를 설정하지 않으면 모든 순서 (설치 및 제거)가 순서대로 실행되므로 전체 프로세스를 테스트하는 것이 좋습니다.
모든 것을 실행하는 방법 (설치 및 제거) :
$ ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true"
dev 그룹에서 '제거'태그 만 실행하는 방법
$ ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true" -t uninstall
따라서 변수와 태그가 site.yml / inventory 파일에있을 수 있으므로 SCM에 커밋하고 의도를 기록 할 수 있습니다.
nootal이 맞아 내 접근 방식 이 작동하지 않습니다. 무시하십시오. (이제 " w : myvar이 정의되어있을 때"명령 줄 스위치 "-e"myvar = X "를 사용하여 명시 적으로 요청 된 경우에만 작업을 실행하십시오.
더 쉽다 (적어도 2.1.1.0 이상) :
- name: do something only when tag 'foo' is provided
when: tags is defined
tags: foo
-> 태그가 제공되고 태그에 "foo"가 포함 된 경우에만 실행됩니다.
켜짐 Ansible 2.3.2.0
, 문제는 여기에 내 솔루션입니다 :
---
- hosts: localhost
gather_facts: no
vars:
in_tag: yes
tasks:
- set_fact: in_tag=no
- fail:
msg: "recently_added is set and you're using blah tag"
when: ( in_tag | bool )
tags:
- blah
- debug:
msg: "always remember"
로 설정 in_tag
하여 True
시작한 후 from을 지정하지 않으면 set_fact
다시 설정 됩니다 .False
tags
ansible-playbook
당신이 태그를 지정 할 때, in_tag
에서 유지 True
하고 fail
작업을 실행합니다.
추신 : 당신은 당신이 원하는 모든 작업에 논리를 추가 할 수 있습니다
PS2 : 로직을 확장하고 보유하고 set_fact: in_tag_blah=True
있는 모든 태그를 tags: ["blah"]
물론 하드 코딩 할 수도 있습니다 .