Ansible Роли с тэгами, не относящимися к тэгу, Вместо этого играются все определенные вкусы

Вот моя книга игр:

- name: Install MySQL with replication
  hosts: mysql-master:mysql-slave
  user: root
  sudo: false
  roles:
    - common
    - admin-users
    - generic-directories
    - { role: iptables, tags: [ 'mysql-iptables'] }
    - mysql

У меня есть задачи таблиц IP для разных портов, я хочу, чтобы запустить задачу в зависимости от группы серверов.

Я отметил тег iptables на основе группы. Когда я запускал игровую книгу вместо выполнения помеченной задачи, она выполняла все задачи, определенные в роли iptables.

Пожалуйста, дайте мне знать, если я делаю что-то не так здесь.

2 ответа

На практике роли не должны содержать код / ​​конфигурацию, используемые только вами. Постарайтесь разрабатывать роли, например, если вы собираетесь их публиковать, тем самым вы создадите более общие / полезные роли.

С ролью iptable, в конце концов, вы хотите открыть порт / изменить конфигурацию брандмауэра. Роль должна содержать задачи, которые разрешают настройку в playbook:

---
- name: iptables | Open ports
  command: 'open port {{item.protocol}} {{item.port}} 
  with_items: 'iptable_conf'
  tags:
   - iptables

тогда ты пьес

- name: Install MySQL with replication
  hosts: mysql-master:mysql-slave
  user: root
  sudo: false
  vars:
    - iptables_conf: 
       - {protocol: tcp, port: 3307}
       - {protocol: tcp, port: 3306}
  roles:
    - common
    - admin-users
    - generic-directories
    - iptables
    - mysql

Надеюсь, вам понравится самоуверенное программное обеспечение: https://github.com/ansible/ansible/issues/3283.

Если я правильно читаю, вы испытываете особенность, когда все в этой роли помечено для вас, а ваша спецификация тега CLI впоследствии соответствует всем этим задачам. Я ненавижу эту функцию. Это глупо. "Применение" против "выбора" в отношении тегов является очевидным первым вопросом, когда вы изначально подвергаетесь воздействию тегов Ansible. У него должен быть более гибкий ответ или, по крайней мере, кивок в документах.

Я бы предложил другой способ организации универсальной роли iptables. Во-первых, подумайте о том, чтобы не иметь роли, если она охватывает очень редкое количество задач. Я бы рекомендовал, чтобы роли имели для вас значение, а не были модулями-адаптерами. Поэтому, возможно, роль sql может обрабатывать специфичные для sql правила в отдельном файле задач.

В противном случае, параметр роли, который затем можно использовать для динамической загрузки переменных (например, список правил брандмауэра). Вот как это будет выглядеть, заглушено:

Playbook:

---
- hosts: loc
  roles:
    - { role: does-too-much, focus_on: 'specific-kind' }

Ролевые задачи /main.yml:

---
 - include_vars: "{{ focus_on }}.yml"
 - debug:
     msg: "ok - {{ item }}"
   with_items: stuff

Переменные vars/specific-kind.yml:

---
stuff:
 - b
 - c
Другие вопросы по тегам