Как запустить задачу, когда переменная не определена в недоступном?

116

Я ищу способ выполнить задачу, когда доступная переменная не регистрируется / не определена, например

-- 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
sakhunzai
источник

Ответы:

215

Из доступных документов : Если необходимая переменная не была установлена, вы можете пропустить или не выполнить тест, определенный 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 == ''
сработало
5
Вы также можете комбинировать это с другими условиями:when: item.sudo is defined and item.sudo == true
czerasz
5
Не делайте того, что сделал я, и заключайте в фигурные скобки foo when: foo is defined(например, это не работает:when: {{ foo }} is defined
Дэвид
2
@ Дэвид Я столкнулся с той же проблемой, что и ты. вставка фигурных скобок при нарушении условий. Чтобы это сработало, вам нужно добавить скобки вокруг условного выражения. например when: ({{ foo }} in undefined)
Tarun
7
Использование фигурных скобок для условных выражений в Ansible не рекомендуется. Кроме того, оператор Ansible не может начинаться с расширения переменной (например, {{ foo }}). Это не из-за Ansible, но Yaml интерпретирует это как объект. Если вам нужно начать с расширения переменной, просто заключите все это в двойные кавычки (например, "{{ foo }}"), чтобы Yaml увидел ее как строку и передал как есть в Ansible.
Виктор Шредер,
13

Согласно последней версии 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

Строго говоря, вы должны проверить все следующее: определено, не пусто И не нет.

Для "обычных" переменных имеет значение, определены ли они и установлены или нет. См. 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
wolfrevo
источник