gpt4 book ai didi

Ansible:分层应用角色模板

转载 作者:行者123 更新时间:2023-12-02 10:11:29 25 4
gpt4 key购买 nike

我计划使用 Ansible 来管理相当大的一组 Linux 服务器,其中有很多变化。

主机将被分组为具有层次结构的角色,其中有一个common角色,其他所有角色都依赖于该角色,子角色依赖于common,并且可能存在依赖于它们的孙子角色,并且依赖深度没有限制。

common
|___ role1
|___ role2
|___ role3
|___ role3.1

每个角色都有自己的系统配置文件模板子集。

roles/
common/
templates/
etc/
hosts
resolv.conf
tasks/
main.yml
system-settings.yml # imported in main.yml
role1/
templates/
etc/
hosts # role-specific version, overrides 'common'
httpd/
conf/
httpd.conf
tasks/
main.yml
system-settings.yml # imported in main.yml
role2/
role3/
role3.1/

棘手的部分是我想分层应用这些模板,类似于 Ansible 解析变量范围的方式。因此,对于给定的子角色,将应用模板文件的最具体版本,如果该角色中不存在模板,则应用父级的版本,向上搜索到根级别。

我(在某种程度上)通过将以下内容放入每个角色的 system-settings.yml 中来实现这一目标:

- name: Create directories
file:
path: /{{ item.path }}
state: directory
mode: '{{ item.mode }}'
with_filetree: templates/
when: item.state == 'directory'

- name: Template files
template:
src: '{{ item.src }}'
dest: /{{ item.path }}
mode: '{{ item.mode }}'
with_filetree: templates/
when: item.state == 'file'

- name: Recreate symlinks
file:
src: '{{ item.src }}'
dest: /{{ item.path }}
state: link
force: yes
mode: '{{ item.mode }}'
with_filetree: templates/
when: item.state == 'link'

它可以工作,但不幸的是它应用了所有父角色的模板,然后应用了所有子角色的模板。这是一种工作浪费,而且万一 playbook 执行由于某种原因中止也是危险的,因为主机可能会留下系统文件的通用版本。

因此,对于上面的示例树,当将 role1 应用于一组 Ansible 主机时:

  1. common 角色应用 /etc/hosts/etc/resolv.conf
  2. role1 角色应用 /etc/hosts/etc/httpd/conf/httpd.conf

但我希望它能做到:

  1. common 角色应用 /etc/resolv.conf
  2. role1 角色(最具体的版本)应用 /etc/hosts
  3. role1 角色应用 /etc/httpd/conf/httpd.conf

由于管理开销,模板文件不应在任务/剧本中专门列出,当添加新文件或特定于角色的版本来覆盖通用版本时,我们不想更改任何剧本或其他配置。

这可以通过 Ansible 实现吗?

我可以看到使用外部脚本的可能解决方案(如 https://docs.ansible.com/ansible/2.4/playbooks_loops.html#iterating-over-the-results-of-a-program-execution 中所述),但我不确定如何将角色层次结构传递到脚本中。

最佳答案

我的想法:

第一选择:将“通用”文件任务更改为“通用”处理程序。我选择处理程序的原因是我们可以有条件地包含处理程序。我们还有角色前/后处理程序。通知角色中未完成的所有任务以及必须完成的任务可以在角色前处理程序中完成。

第二个选择:有条件地包含任务,我认为需要付出很多努力才能将标签附加到包含的文件上。例如:

---
-name: task inclusion
Hosts: localhost
Gether_facts: false
Tasks:
Include: common.yaml
When: item | bool
A_list:
-true
-false

希望这有帮助。

问候苏达卡

关于Ansible:分层应用角色模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51215654/

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