Ansible角色/剧本结构

问题描述

我们正在考虑使用AWX / Tower自动执行剧本运行,以执行初始配置并确保清单中每个主机上的状态持续不断。这将通过两种方式(不同的触发器)实现自动化:

  1. 在预配置计算机后(由Foreman或Cobbler)进行初始回调,即对AWX进行API调用(回调),以针对主机运行剧本并对其进行配置以供使用。
  2. 为每个主机运行常规(也许每晚)的剧本以确保状态

当前,主机是根据其预期用途分组的,例如,我们有“基本”服务器,Web服务器,samba服务器,台式机等。

对于任何给定类型/组的主机,我们希望能够针对该组(例如web_servers)运行单个剧本,这将放置服务器所需的所有常用配置(因为Web服务器)具有服务器的所有常见配置,ssh密钥,ntp,auth等),但顶部还有其他特定于web_server的任务。

请记住,假设在web_server顶部也可能存在一个或几个其他配置层(例如,Nginx或apache web_server添加了进一步的特定配置-实际上,这可能不是最好的处理方式,但是关键是在通用基本配置之上的灵活性/分层功能-我仅以web_servers为例提供一些上下文)。

我们有一个自定义的动态广告资源插件,可以从数据库提取数据(包括主机的预期用途)并将其分配给正确的广告资源组。

示例结构:

roles
  common
    role_1
    role_2
    role_3
  server
  web_server
server_playbook.yaml
web_server_playbook.yaml

到目前为止,我想出了一些想法/选择...

选项1

在每本剧本中都重复了常见角色,例如,

server_playbook.yaml

- name: server playbook
  hosts: servers
  roles:
    - common/role_1
    - common/role_2
    - common/role_3
    - server

web_server.playbook.yaml

- name: web_server playbook
  hosts: web_servers
  roles:
    - common/role_1
    - common/role_2
    - common/role_3
    - server
    - web_server

缺点:

  • 删除/添加常用角色时,要更新不同的剧本需要大量维护费用。

选项2

角色包括其他角色。

roles / server / main.yaml

- include_role:
    name: "{{ item }}"
  loop:
    - common/role_1
    - common/role_2
    - common/role_3

# ... other server specific tasks

server_playbook.yaml

- name: server playbook
  hosts: servers
  roles:
    - server

web_server_playbook.yaml

- name: web_server playbook
  hosts: web_servers
  roles:
    - server
    - web_server

缺点:

  • 角色依赖似乎是一个非常糟糕的主意

选项3

服务器剧本中存在常见角色,这些角色又被导入到web_server剧本中

server_playbook.yaml

- name: server playbook
  hosts: servers
  roles:
    - common/role_1
    - common/role_2
    - common/role_3
    - server

web_server_playbook.yaml

- import_playbook: server_playbook.yaml

- name: web_server playbook
  hosts: web_servers
  roles:
    - web_server

注意事项:

  • Web服务器主机需要同时存在web_serversservers库存组中。层数越多,主机需要加入的组就越多。

缺点:

  • 导入剧本不允许动态导入或循环播放,因此我们需要手动定义这些内容/不能从主机所属的广告资源组中自动定义这些内容
  • 需要注释/删除行才能运行特定于web_server的任务(也无需耗时的基本服务器配置)

选项4

根据选项3,但不导入,以使剧本脱钩。

server_playbook.yaml

- name: server playbook
  hosts: servers
  roles:
    - common/role_1
    - common/role_2
    - common/role_3

web_server_playbook.yaml

- name: web_server playbook
  hosts: web_servers
  roles:
    - web_server

缺点:

  • 运行多个剧本,每个剧本一个。对于夜间运行的剧本很好,可以在特定时间安排每个剧本,但对于从头到尾配置主机的配置回调(从单个回调进行基本服务器配置和Web服务器配置...)而言,不是一个明显的解决方案 li>

我不确定哪种方法最好,或者我们是否在这里遗漏了什么,还有没有更简单/更好的方法?查阅Ansible最佳实践/技巧和窍门指南并没有涉及太多细节,但我认为这肯定是一件很普通的事情。

预先感谢

P.S。上面的剧本在编写时是临时编写的,未经测试,因此应将其视为伪代码(我敢肯定其中会有错误

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)