问题描述
我们正在考虑使用AWX / Tower自动执行剧本运行,以执行初始配置并确保清单中每个主机上的状态持续不断。这将通过两种方式(不同的触发器)实现自动化:
- 在预配置计算机后(由Foreman或Cobbler)进行初始回调,即对AWX进行API调用(回调),以针对主机运行剧本并对其进行配置以供使用。
- 为每个主机运行常规(也许每晚)的剧本以确保状态
当前,主机是根据其预期用途分组的,例如,我们有“基本”服务器,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_servers
和servers
库存组中。层数越多,主机需要加入的组就越多。
缺点:
选项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 (将#修改为@)