在Ansible中引用主机作为variables的正确方法是什么?

对于Ansible来说,我是相当新的,对于这个特定脚本的stream程,我们处于一个两难的境地。 我们有一个我们想要部署到每个主机的证书列表; 这些是每个主机独特的,所以1:1传输。

# hostfile [prod] host_a host_b host_c 

目前,我正在做这个作为我的angular色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 

然后在一个任务中引用这个:

 - 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 

这工作正常,但我不喜欢它。 我主要不喜欢它,因为它迫使你记住在两个地方更新主机(hostfile和vars文件)。 我考虑的是将主机定义为group_vars中的group_vars ,但是我不完全相信我可以在文件中引用variables? 所以像这样:

 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 

而当我进入这个任务时,这会让事情进一步复杂化。 我假设我可以更改我的任务,为每个主机分别创build一个副本,例如使用when: {{ inventory_host }} == {{ hosts.host_a}}然后将每个文件复制到自己的部分中。 虽然这对我来说似乎同样丑陋。

有没有更好,更直观的方法可以解决这个问题?

最好的做法是使用主机variables。 主机variables与组variables完全相同,但是为每个主机定义variables。

所以你可以有一个文件host_vars/host_a的内容

 cert: a.my.endpoint.com.pem 

…并将cert用作您的任务中的variables。

但是你的问题保持不变:

我主要不喜欢它,因为它迫使你记住在两个地方更新主机(hostfile和vars文件)。

但是你也可以定义库存中的主variables。 如果你有更多的variables来定义,这会变得很难看,但是如果这是唯一的variables,你的目标是在一个地方pipe理所有的定义,你可以这样做:

 # 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 

在这两种情况下你的任务会减less到这个:

 - name: upload haproxy server certificates copy: src: "{{ cert }}" dest: "/etc/haproxy/ssl/{{ cert }}" backup: yes notify: - restart haproxy tags: - haproxy