在 ansible 中,我们尝试根据变量访问不同的模板。
我们有以下模板文件,例如:
templates
app1.conf.j2
app2.conf.j2
app3.conf.j2
taks
app.yml
在任务中,我们需要根据应用程序名称复制模板文件。例如:我们将为 app1 或 app2 或 app3 指定一个名为“instance_name”的变量。
现在根据变量我们需要将应用程序文件复制到 /opt/(( instance_name }}/conf.d/。
我们创建了如下的 ansbile 任务但它不起作用。
- name: 'Copy {{ instance_name }} file to /opt/conf.d/ Directory'
template:
src: "{{ instance_name }}.conf.j2"
dest: "/opt/{{ instance_name }}/conf.d/"
owner: root
group: root
mode: 0644
当我们将“src”硬编码到app1.conf.j2时,它适用于app1。
来自此网址https://docs.ansible.com/ansible/latest/modules/template_module.html#parameter-src它指定的值可以是相对路径或绝对路径。
请让我们知道这种方法是否可行?我们有大约 20 个应用程序,简化 ansible playbook 以仅指定变量的最佳方法是什么。
答案1
没有最佳实践,只有关于某个特定问题的解决方案有多优雅的意见。对于 Ansible 来说尤其如此,因为它具有灵活性,可以让你按照自己想要的方式做事。
角色很棒。可以为每个应用程序组创建一个角色,每个角色都包含所需的配置模板,例如 roles/app1/templates/app1.conf.j2
它可能有多个任务和模板,例如如果应用程序通过服务管理器启动某个进程,确保主机防火墙允许它,并且还通过某个服务网格连接起来。
app1defaults/main.yml
可能包含
instance_name: app1
然后可以使用tasks/main.yml
(为了简洁起见,省略了一些参数,也许它们被移动到了模块默认值在一个街区上。
- name: 'Copy config to /opt/conf.d/'
template:
src: "{{ instance_name }}.conf.j2"
dest: "/opt/{{ instance_name }}/conf.d/"
如果所有这些都和你的剧本一起放在一棵树上(不是必需的,特别是角色可以存储在其他地方),它可能看起来像文档中的内容组织示例:
playbook.yml
roles/
app1/
tasks/
main.yml
templates/
app1.conf.j2
app2/
tasks/
main.yml
templates/
app2.conf.j2
然后剧本只需列出它们:
roles:
- app1
- app2
此类角色的实现可能会重复,因为每个角色都需要做同样的事情。如果角色仅在几个变量上有所不同,请创建一个通用角色并使用不同的角色参数多次调用它。
roles:
- role: appgeneric
vars:
instance_name: app1
- role: appgeneric
vars:
instance_name: app2
模块参数的变量很棒,你的问题的答案是肯定的。然而, 变量任务名称实际上不起作用。任务名称是全局的并且已提前解析,因此可能是--extra-vars
cli 参数但不是循环迭代或主机特定变量。
那么,如果您有一个通用命名角色和一个通用命名任务,需要进行 20 次应用部署,该怎么办?错误应该是有用的,如果模板无法加载文件,它会告诉您哪个文件名。稍微增加详细程度有助于 ansible-playbook -vv
了解发生了什么,但很混乱和冗长。考虑在 Ansible 之上使用剧本日志记录软件,如 ARA 或 AWX/Tower。这些报告显示了哪些执行加载了哪些变量,可以提供上下文。