Как запустить задачу, когда переменная не определена в ansible?
Я ищу способ выполнить задачу, когда переменная ansible не является регистром / неопределенным e.g
-- name: some task
command: sed -n '5p' "{{app.dirs.includes}}/BUILD.info" | awk '{print }'
when: (! deployed_revision) AND ( !deployed_revision.stdout )
register: deployed_revision
3 ответов
С ansible docs: Если требуемая переменная не была установлена, вы можете пропустить или потерпеть неудачу, используя определенный тест 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
должно работать
в соответствии с последней версией 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
строго указано, что вы должны проверить все следующее: определено, не пусто и не нет.
для "нормальных" переменных это имеет значение, если определено и установлено или не установлено. См.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