我正在学习 ansible awx,在测试期间我想解决一种情况,所以我正在寻找想法和可能的解决方案。
文件结构来自这里,最佳实践 — Ansible 文档 > “目录结构”。
为了简化这个问题,我有两个剧本,每个剧本都应该针对执行一个角色的预配置 Linux 映像运行。一个角色用于桌面,另一个角色用于服务器。
部署的桌面数量可能有数百或数千个,因此我确实需要一个无需太多人工交互即可扩展的简单解决方案。
我想有些桌面用户需要进行自定义更改。虽然桌面使用了 99% 的标准角色配置,但他们可能需要使用特定的背景图片或为他们的帐户设置时区(仅作为示例)或其他需要在该桌面上锁定的内容。
我不想为超出标准配置的每台机器创建一个剧本结构,那么有没有办法说,运行标准剧本,但也运行另一组任务,但只针对标准剧本之后在 AWX 中匹配的主机/组名,或者甚至是在标准角色任务作业的中间?
例如,在任务 / main.yml 中,我是否可以包含另一个 yml 文件,该文件在主机与 AWX 组匹配时导入并运行?这样,标准角色就保持相当干净,只需导入另一个文件,该文件可能会根据主机匹配导入另一个文件,该文件应与 AWX 中的组名匹配?
我正在考虑的概念,不确定是否可行或类似的东西?我需要做的就是添加一个测试custom.yml
并创建一个包含该主机/组的自定义任务的新文件。
In tasks / main.yml
- name: install app
...
#end of tasks declarations
# At bottom of the file
include custom.yml
#file custom.yml
host: user_machine_123
import user_machine_123_custom_tasks.yml
#file user_machine_123_custom_tasks.yml
- name: install special app for user_machine_123
...
答案1
如果用户可以在 ansible 之外进行自定义,则无需将所有例外情况都纳入剧本。另外,请注意不要让剧本太大太复杂,您可以拥有多个剧本。
也就是说,每个组和每个主机的值和操作都是可能的。
将所有值定义为变量以允许覆盖。例如,在角色默认级别,时区为,tz: UTC
但在 group_vars/desktop 中可以是tz: America/Chicago
任何其他值。在所有主机上运行的通用角色中,使用时区模块:
- timezone:
name: "{{tz}}"
可选的每个主机任务有点棘手。尝试使用 first_found 查找进行静态包含。首先查找包含 inventory_hostname 的最具体文件名,然后查找(可能为空的)默认文件。
- name: per host tasks
include: "{{lookup('first_found', params)}}"
vars:
params:
files:
- '{{inventory_hostname}}.yml'
- default.yml
paths:
- 'tasks'
如果您发现自己正在尝试这种模式,请考虑限制其使用。它仅适用于已被游戏定位的主机,并且任务目录中特定于主机的行为不太直观。
角色是包含任务和变量的更易于管理的单元,并且可以针对任意数量的主机重复使用。让 Ansible 用户贡献角色,如果您愿意,可以将其与您的剧本分开维护。然后将它们映射到剧本中的主机:
---
- name: Server common
hosts: servers
roles:
- common
- name: Web servers common
hosts: web
roles:
- webserver
- name: Widget inventory app
hosts: widget
roles:
- widgetapp
- name: special snowflake
hosts: user123
roles:
- custom123