У меня есть следующий сценарий с развертыванием Ansible:
common-mta
и еще несколько ролейcommon-mta
а также роль package-postfix
В common-mta
роль копирует файл (если вы догадались, это /etc/postfix/main.cf
), но я хочу ограничить это в зависимости от того, есть ли у хоста роль из package-postfix
, а не просто ограничение по имени хоста, как сейчас, например:
when: not group_names == "mail"
Я бы хотел что-то вроде:
when: not role_names == "package-postfix"
Я думаю, это было бы намного чище и позволяло мне произвольно добавлять package-postfix
роль на другие хосты без изменения common-mta
роль вообще.
Это возможно?
Изменить: предложение Наверна не работает для этого конкретного варианта использования; список ролей не зависит от списка групп, и, хотя я могу сделать это через группу, это грязнее. Подумайте, это моя настоящая строка задачи:
- name: install postfix generic config if we aren't an mx, mail, or luna host
template: src=main.cf.j2 dest=/etc/postfix/main.cf
when: "'luna' not in group_names and 'mx' not in group_names and 'mail' not in group_names"
Я бы хотел заменить это на:
- name: install postfix generic config if we don't have the postfix role
template: src=main.cf.j2 dest=/etc/postfix/main.cf
when: "'package-postfix' not in role_names"
Тем не мение, role_names
не является допустимой переменной, и пока в документации я не могу найти переменную, содержащую список роли находится хост, а не его группы. Это может показаться одним и тем же, но в моем случае это не так, поскольку все три группы, которые я упомянул, имеют package-postfix
роль. Надеюсь, это имеет смысл, и я правильно использую Ansible.
На самом деле у нас есть role_names
переменная в Ansible с конца 2013 года. Подтверждено с помощью Ansible 1.9.2. Таким образом, вы можете просто написать такое условие:
when: "'package-postfix' not in role_names"
Это можно сделать следующим образом (цитата из документации на ansible.com):
Кроме того, group_names - это список (массив) всех групп, в которых находится текущий хост. Его можно использовать в шаблонах с синтаксисом Jinja2 для создания исходных файлов шаблонов, которые зависят от членства в группе (или роли) хоста:
{% if 'package-postfix' not in group_names %}
# some part of a configuration file that only applies to not package-postfix
{% endif %}
Хорошо, на основе ваших обновлений: я бы преобразовал это в определение группы, потому что роль связана с группой, и это более логично. Вы должны создать группу, состоящую из группы mx, mail и host luna, а затем использовать предложенную вещь. Или вы можете определить конкретные host_vars / group_vars, которые будут говорить true или false.
Например: use group_vars: mx будет содержать: use_postfix: "False"
group_vars для почты будет содержать use_postfix: "False"
а host_var для luna будет содержать host_vars use_postfix: "False"
тогда ты просто делаешь
when use_postifx != "False"
Извините за английский, надеюсь, я ясно выразился.