Ansible 最佳实践不重复常见角色

标签 ansible roles ansible-playbook organization

在 Ansible 最佳实践页面上:http://docs.ansible.com/ansible/playbooks_best_practices.html#top-level-playbooks-are-separated-by-role它显示了一个示例,其中主 playbook site.yml 包含几个其他顶级 playbook webservers.yml 和 dbservers.yml。在这些剧本中,它们每个都包含共同的角色。一些库存文件我的所有组都在一台主机上运行。另一个 list 文件我每组有一个主机。对于任何组位于一台主机上的情况,如果我运行 site.yml,您会看到共同角色被扮演了两次,一次用于 webservers.yml,一次用于 dbservers.yml。

有什么办法可以避免这种情况?我想你可以从 webservers.yml 和 dbservers.yml 中取出公共(public)角色,而是在 site.yml 中有一个针对公共(public)角色的任务。但是我不能单独配置一个 webserver 或 dbserver 。

最佳答案

和其他人一样,我也有这个问题,即使角色是幂等的,执行也需要时间,所以我们可能只想执行一次。

我使用了与 @Vor 类似的方法但我选择facts而不是创建文件。

提醒:

Facts survive between plays during an Ansible run, but will not be saved across executions even if you use a fact cache.



例子

site.yml

---
- hosts: all
  roles: [common]
- include: db.yml
- include: web.yml

db.yml

---
- hosts: db
  roles:
    - { role: common, when: isdef_common_role is not defined }
    - db

web.yml

---
- hosts: web
  roles:
    - { role: common, when: isdef_common_role is not defined }
    - web

roles/common/tasks/main.yml

---
- debug: 'msg="{{ inventory_hostname }} common"'
- set_fact: isdef_common_role=1

这确实有点多余(因为您必须每次都进行条件包含),但具有以下优点:
  • 适用于我能想到的大多数情况(ansible-playbook site.ymlansible-playbook site.yml -l commonansible-playbook site.yml -l dbansible-playbook db.yml,...)
  • 让您决定是否要重复执行常见的

  • 如果不想重复 { role: common, when: isdef_common_role is not defined } ,您可以使用以下命令将条件放入 common 角色中:

    site.yml : 没有变化

    db.yml , web.yml :从角色中删除条件

    roles/common/tasks/main.yml

    ---
    - include: tasks.yml
      when: isdef_common_role is not defined
    - set_fact: isdef_common_role=1
    

    roles/common/tasks/tasks.yml

    ---
    - debug: 'msg="{{ inventory_hostname }} common"'
    

    关于Ansible 最佳实践不重复常见角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32783852/

    相关文章:

    ubuntu - "apt"模块在 Ansible 中停止

    linq - 如何将用户表正确连接到成员资格表,或者您是否应该这样做?

    c# - ASP.net MVC 获取从 url 检索到的特定 id 的用户角色

    ansible - pause ansible playbook 以供用户确认,是否运行休息任务

    error-handling - 当救援 block 在文件中时,"ansible_failed_task"& "ansible_failed_result"变量未定义

    ansible - 递增变量值时出现 Unicode 错误

    docker - 部署包含 docker-compose.yml 的 Ansible 项目

    python - os_network 的参数列表上的 ansible 抛出错误

    azure - 仅在 Cosmos DB 中为特定容器添加权限

    elasticsearch - 重启vagrant box后如何自动启动服务?