Назад | Перейти на главную страницу

Ansible условное выражение, основанное на других ролях?

У меня есть следующий сценарий с развертыванием Ansible:

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

Извините за английский, надеюсь, я ясно выразился.