Як виконати завдання, коли змінна не визначена в ansible?


115

Я шукаю спосіб виконання завдання, коли ansible змінна не реєструється / не визначається, наприклад

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

З довідкових документів : Якщо потрібна змінна не встановлена, ви можете пропустити або відмовитись, використовуючи визначений тестом 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
Не робіть того, що я робив, і вставте фігурні дужки навколо колонтитула when: foo is defined(наприклад, це не працює:when: {{ foo }} is defined
Девід

2
@David Я зіткнувся з тією ж проблемою, що і ти. надягаючи фігурні брекети, коли порушується умовне. Щоб зробити це робочим, вам слід додати дужки навколо умовного. напр. when: ({{ foo }} in undefined)
Тарун

7
Використання фігурних дужок для умовних умов у Ansible застареле. Крім того, жоден оператор Ansible не може починатися зі змінного розширення (як {{ foo }}). Це не через Ansible, але Yaml трактує це як об'єкт. Якщо вам потрібно почати зі змінного розширення, просто оточіть всю річ подвійними лапками (як "{{ foo }}"), щоб змусити Ямл бачити це як рядок і передавати його як-значить Ansible.
Віктор Шредер

11

Згідно з останньою версією версії 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

Відповідна документація


5

Строго зазначено, що ви повинні перевірити всі наступні: визначені, не порожні І ні.

Для "нормальних" змінних це має значення, якщо вони визначені та встановлені чи не встановлені. Дивіться fooта barв прикладі нижче. Обидва визначені, але лише 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.