ansible에서 변수가 정의되지 않은 경우 작업을 실행하는 방법은 무엇입니까?


115

ansible 변수가 레지스터 / undefined가 아닐 때 작업을 수행하는 방법을 찾고 있습니다.

-- name: some task
   command:  sed -n '5p' "{{app.dirs.includes}}/BUILD.info" | awk '{print  $2}'
   when: (! deployed_revision) AND ( !deployed_revision.stdout )
   register: deployed_revision

답변:


213

로부터 ansible 문서 : 필요한 변수가 설정되어 있지 않은 경우, 당신은 건너 뛰거나 Jinja2의 정의 된 테스트를 사용하여 실패 할 수 있습니다. 예를 들면 :

tasks:

- shell: echo "I've got '{{ foo }}' and am not afraid to use it!"
  when: foo is defined

- fail: msg="Bailing out. this play requires 'bar'"
  when: bar is not defined

따라서 귀하의 경우에는 when: deployed_revision is not defined작동해야합니다.


4
이것은 나를 위해 일한 덕분에when: deployed_revision is not defined or deployed_revision.stdout is not defined or deployed_revision.stdout == ''
sakhunzai

5
다른 조건과 결합 할 수도 있습니다.when: item.sudo is defined and item.sudo == true
czerasz

5
내가 한 일을하지 말고 foo 안에 중괄호를 넣습니다 when: foo is defined(예 : 작동하지 않음 :when: {{ foo }} is defined
David

2
@David 나는 당신과 같은 문제에 직면했습니다. 조건부를 깨뜨릴 때 중괄호를 넣습니다. 이 작업을 수행하려면 조건부 주위에 괄호를 추가해야합니다. 예 when: ({{ foo }} in undefined)
Tarun

7
Ansible의 조건에 대한 중괄호 사용은 더 이상 사용되지 않습니다. 또한 Ansible 문은 변수 확장 (예 :)으로 시작할 수 없습니다 {{ foo }}. 이것은 Ansible 때문이 아니지만 Yaml은 이것을 객체로 해석합니다. 변수 확장으로 시작해야하는 경우 전체를 큰 따옴표 (예 "{{ foo }}":)로 묶어 Yaml이 문자열로 인식하고 그대로 Ansible에 전달하도록합니다.
빅터 슈뢰더

11

최신 Ansible 버전 2.5에 따라 변수가 정의되어 있는지 확인하고 이에 따라 작업을 실행하려면 다음을 사용하십시오. undefined 키워드를 .

tasks:
    - shell: echo "I've got '{{ foo }}' and am not afraid to use it!"
      when: foo is defined

    - fail: msg="Bailing out. this play requires 'bar'"
      when: bar is undefined

Ansible 문서


5

엄밀히 말하면 정의 됨, 비어 있지 않음 및 없음 없음을 모두 확인해야합니다.

"정상"변수의 경우 정의되고 설정되거나 설정되지 않으면 차이가 있습니다. 참조 foobar아래의 예이다. 둘 다 정의되었지만 foo설정 만 되어 있습니다.

다른 쪽에서 등록 된 변수는 실행 명령의 결과로 설정되며 모듈마다 다릅니다. 대부분 json 구조입니다. . 당신은 아마 당신이 볼에 관심이있는 하위 요소 확인해야 xyz하고 xyz.msg예 아래에를 :

cat > test.yml <<EOF
- hosts: 127.0.0.1

  vars:
    foo: ""          # foo is defined and foo == '' and foo != None
    bar:             # bar is defined and bar != '' and bar == None

  tasks:

  - debug:
      msg : ""
    register: xyz    # xyz is defined and xyz != '' and xyz != None
                     # xyz.msg is defined and xyz.msg == '' and xyz.msg != None

  - debug:
      msg: "foo is defined and foo == '' and foo != None"
    when: foo is defined and foo == '' and foo != None

  - debug:
      msg: "bar is defined and bar != '' and bar == None"
    when: bar is defined and bar != '' and bar == None

  - debug:
      msg: "xyz is defined and xyz != '' and xyz != None"
    when: xyz is defined and xyz != '' and xyz != None
  - debug:
      msg: "{{ xyz }}"

  - debug:
      msg: "xyz.msg is defined and xyz.msg == '' and xyz.msg != None"
    when: xyz.msg is defined and xyz.msg == '' and xyz.msg != None
  - debug:
      msg: "{{ xyz.msg }}"
EOF
ansible-playbook -v test.yml
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.