가능 : 태그가 지정된 경우에만 작업 실행


76

작업 / 역할의 하위 집합 만 실행하는 데 사용할 수있는 태그를 사용할 수 있습니다. 이는 기본적으로 모든 작업이 실행되며 일부 작업이 실행되는 것을 막을 수 있음을 의미합니다.

"foo"태그가 지정된 경우 에만 작업 실행을 제한 할 수 있습니까 ? when작업 섹션 에서 현재 태그를 사용할 수 있습니까 ?


2
그것은 당신이 필요로하는 것처럼 limit_to_tags : foo와 같은 일부 작업 설정이 존재하지 않으며 지금은 가능하지 않다고 생각합니다. 또한 향후 구현에는 해당 태그를 함께 AND 또는 OR할지에 대한 계획이 있어야합니다.
dgh

- "기본 / 명시 태그 Ansible"내 anwser 살펴보세요 stackoverflow.com/questions/28789912/...
sirkubax

답변:


38

Ansible 2.5에는 특수 태그 never와가 포함되어 always있습니다. never이 목적으로 태그 를 정확하게 사용할 수 있습니다. 예 :

tasks:
  - debug: msg='{{ showmevar}}'
    tags: [ 'never', 'debug' ]

이 예에서 작업은 debug(또는 never) 태그가 명시 적으로 요청 된 경우에만 실행됩니다 . [확실한 문서에 대한 참조]


20

이것은 로터리 솔루션이지만 작동합니다.

작업 목록 안에 정상적인 실행이 실행될 때 변수를 등록합니다. 그런 다음 태그가 지정된 작업에 해당 변수를 확인하는 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
Pyzo

이것에 대해 좀 더 설명해 주시겠습니까? 실제 예?
Quintin Par

17

커맨드 라인 변수 ( --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.


5
를 사용하여 동일하게 달성 할 수 있습니다 thorough | default('no') | bool.
Costi Ciudatu

2
또는 when: thorough is defined and thorough이 구문을 선호하는 경우
KCD

감사 is defined and합니다. 구문을 더 좋아하십시오 . 내가 느끼지 못하는 여러 파이프보다 직관적입니다.
Elijah Lynn

10

태그를 지정하지 않으면 달리 실행되는 실수로 실행되는 작업으로부터 보호하기 위해 조건 을 사용할 수 있습니다 . 이 방법의주의 사항은 추가 변수를 정의하지 않으면 재생이 오류가 발생하고 실패한다는 것입니다.

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)
...

2
"전체"를 정의하지 않은 경우 오류를 피하려면을 사용하십시오 thorough | default("false") | match("true"). 기본값은 false일치하지 않아도 true되지만 가독성이 향상됩니다.
Tom Wilson

4

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   

2

예. --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

7
"작업에 태그를 지정한다는 것은이 태그가 ansible-playbook 명령에 명시 적으로 전달 될 때만 해당 작업이 실행됨을 의미합니다."
gimboland

1
둘째, 진술은 사실이 아닙니다.
Chris

10
예, 항상 올바른 ansible-playbook옵션을 사용하여 동작을 수행 할 수 있지만 OP는 ansible-playbook명령 에 특정 태그를 명시 적으로 추가하지 않으면 작업에 주석을 달 수있는 방법을 요구한다고 생각합니다 .
dgh

4
예, 이것은 OP의 질문에 대답하지 않습니다.
Allen Luce

태그를 지정하지 않으면 태그가 있거나 태그가없는 모든 작업이 실행됩니다. 태그는 실행할 작업을 제외 할 수 없으며 포함 만합니다. 추가 필터를 제외하고 술어 논리는 없습니다.
bbaassssiiee


0

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에 커밋하고 의도를 기록 할 수 있습니다.


0

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"가 포함 된 경우에만 실행됩니다.


0

켜짐 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다시 설정 됩니다 .Falsetagsansible-playbook

당신이 태그를 지정 할 때, in_tag에서 유지 True하고 fail작업을 실행합니다.

추신 : 당신은 당신이 원하는 모든 작업에 논리를 추가 할 수 있습니다

PS2 : 로직을 확장하고 보유하고 set_fact: in_tag_blah=True있는 모든 태그를 tags: ["blah"]물론 하드 코딩 할 수도 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.