Как и другие языки, '& amp;' является логическим побитовым оператором, тогда как '& amp; & amp;' является логической операцией.
Например (прошу простить мой синтаксис).
Если A = [True True False True] B = False
A & amp; B = [False False False False]
.. или если B = True A & amp; B = [True True False True]
Для «& amp; & amp;» правый операнд вычисляется только в том случае, если левый операнд имеет значение true, а результат представляет собой одно булево значение.
x = (b ~ = 0) & amp; & amp; (a / b> 18.5)
Надеюсь, это ясно.
Я думал, что оператор when будет запускать только задание IF, если statresult существует.
Он может это сделать, но вам нужно обработать ваше условное выражение, например, его Python.
when: 'domainexists' in item
Обновление. Итак, при втором просмотре вашей пьесы, я вижу некоторые другие проблемы, которые вам нужно будет исправить, прежде чем это сработает.
- создается впечатление, что вы лечите
with_items
, как будто предоставляете доступ к глобальной переменнойitems
, которую затем изменяете и пытаетесь использовать в будущих задачах. Это не так. Любые петли стиляwith_X
- это то, что он зациклирует задачу с любым списком, который вы ему даете. Кроме того, документация Ansible рекомендует не использовать петлиwith_X
, так какloop
стал рекомендуемым способом петли с Ansible 2.5.- В вашей первой игре Don 't сохранить ваш результат stat в
item
. Храните его в своей собственной переменной, так какitem
- специальная переменная, используемая для циклов. Это может быть любое другое имя, которое вы хотите. Кроме того, не стоит беспокоиться о сохранении его с помощью собственного ключа, просто укажите ему простое имя переменной, напримерexistant_domain_list
, а неexistant_domain_list.statresult
.- Вы зарегистрировались на
item.statresult
, но никогда не используете это снова в вашем плейбуке. Возможно, это потому, что вы делаете # 1. Когда вы регистрируете результат, он доступен для нисходящих задач в playbook автоматически (пока вы используете свое собственное имя переменной).Кроме этого, это намного лучше, чем я сделал моя первая игра-головоломка Ansible лет назад! У вас есть хорошее представление о предполагаемой функциональности инструмента.
Вот как выглядит ваша playbook:
---
- hosts: all
become: yes
gather_facts: no
tasks:
- name: Check that domains exist
stat:
path: /path/to/the/domain/{{ item }}
loop:
- path1
- path2
- path3
register: my_stat
- name: Ensure symlinks are created for bin on existing domain machines
file:
src: /path/new/symlink_bin_link
dest: /path/to/the/domain/{{ item }}/bin
state: link
loop: "{{ my_stat.results | selectattr('stat.exists') | map(attribute='item') | list }}"
- name: Ensure symlinks are created for config on existing domain machines
file:
src: /path/new/symlink_config_link
dest: /path/to/the/domain/{{ item }}/config
state: link
loop: "{{ my_stat.results | selectattr('stat.exists') | map(attribute='item') | list }}"
Объяснение:
register: item.statresult
- это бессмысленная конструкция в Ansible, вы должны предоставить имя переменной в качестве параметра selectattr
и map
), чтобы получить список путей, которые существуют (только) Также: src
и dest
должны быть определены в обратном направлении для символических ссылок, чем в вашем коде.
Далее , вы можете объединить последние две задачи в одну, добавив фильтр product
к итерабельному определению.