我对 Ansible 还很陌生,对于这个特定脚本的流程,我有点进退两难。我们有一个要部署到每个主机的证书列表;这些对于每个主机都是唯一的,因此 1:1 传输。
# hostfile
[prod]
host_a
host_b
host_c
Run Code Online (Sandbox Code Playgroud)
目前,我正在这样做,作为group_vars我角色的一部分:
haproxy:
prod:
certs:
host_a: a.my.endpoint.com.pem
host_b: b.my.endpoint.com.pem
host_c: c.my.endpoint.com.pem
Run Code Online (Sandbox Code Playgroud)
然后在任务中引用它:
- name: upload haproxy server certificates
copy:
src: "{{haproxy[env].certs[inventory_hostname]}}"
dest: "/etc/haproxy/ssl/{{haproxy[env].certs[inventory_hostname]}}"
backup: yes
notify:
- restart haproxy
tags:
- haproxy
Run Code Online (Sandbox Code Playgroud)
这很好用,但我不喜欢它。我主要不喜欢它,因为它迫使您记住在两个地方(hostfile 和 vars 文件)更新主机。我考虑的是将主机定义为 var in group_vars,但我不完全确定我可以在文件中引用 vars 吗?所以像:
hosts:
host_a
host_b
host_c
haproxy:
prod:
certs:
{{ hosts.host_a }}: a.my.endpoint.com.pem
{{ hosts.host_b }}: b.my.endpoint.com.pem
{{ hosts.host_c }}: c.my.endpoint.com.pem
Run Code Online (Sandbox Code Playgroud)
然后当我开始这项任务时,这让事情变得更加复杂。我假设我可以更改我的任务为每个主机都有一个单独的副本,就像 a 一样when: {{ inventory_host }} == {{ hosts.host_a}},只需将每个文件复制到它自己的部分。不过,这对我来说似乎同样丑陋。
有没有更好、更直观的方法可以解决这个问题?
最佳实践是使用主机变量。主机变量的工作方式与组变量完全相同,但为每个主机定义变量。
所以你可以有一个host_vars/host_a包含内容的文件
cert: a.my.endpoint.com.pem
Run Code Online (Sandbox Code Playgroud)
...并cert用作任务中的变量。
但是您的问题保持不变:
我主要不喜欢它,因为它迫使您记住在两个地方(hostfile 和 vars 文件)更新主机。
但是您也可以在清单中定义主机变量。如果您要定义更多变量,这会变得很难看,但如果这是唯一的变量,并且您的目标是在一个地方管理所有定义,您可以这样做:
# hostfile
[prod]
host_a cert=a.my.endpoint.com.pem
host_b cert=b.my.endpoint.com.pem
host_c cert=c.my.endpoint.com.pem
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,您的任务都会减少到这样:
- name: upload haproxy server certificates
copy:
src: "{{ cert }}"
dest: "/etc/haproxy/ssl/{{ cert }}"
backup: yes
notify:
- restart haproxy
tags:
- haproxy
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9178 次 |
| 最近记录: |