gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:40:09 25 4
gpt4 key购买 nike

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com