Ansible Roles标签不尊重标签,而是播放所有定义的标签

时间:2015-04-07 19:02:18

标签: ansible ansible-playbook

这是我的剧本:

- 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 个答案:

答案 0 :(得分:2)

在实践中,角色不应包含仅由您使用的代码/配置。尝试开发角色,如果你要发布它们,这样做你将创建更多通用/有用的角色

使用iptable角色,您最终想要的是打开端口/更改防火墙配置。 该角色应包含允许在剧本中进行配置的任务:

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

答案 1 :(得分:1)

希望您一直喜欢固执己见的软件:https://github.com/ansible/ansible/issues/3283

如果我正确阅读,您将体验到一项功能,该角色中的所有内容都会为您标记,您的CLI标记规范随后会匹配所有这些任务。我讨厌这个功能。这很愚蠢。 "用途"与#34;选择"当你最初暴露给Ansible标签时,w / r / t到标签是一个明显的第一个问题。它应该有一个更灵活的答案,或至少在文档中点头。

我建议采用不同的方式来组织多功能 iptables 角色。首先,如果它包含非常少量的任务,则考虑不具备该角色。 我建议角色对你有意义,而不是模块适配器。因此,sql角色可以在单独的任务文件中处理特定于sql的规则。

否则,可以使用角色参数动态加载变量(例如防火墙规则列表)。这就是看起来的样子,抄写:

剧本:

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

Variables vars / specific-kind.yml:

---
stuff:
 - b
 - c