在 Ansible 中将主机引用为变量的正确方法是什么?

在 Ansible 中将主机引用为变量的正确方法是什么?

我对 Ansible 还不太熟悉,对于这个特定脚本的流程有些困惑。我们有一个要部署到每个主机的证书列表;这些证书对于每个主机都是唯一的,因此需要 1:1 传输。

# hostfile
[prod]
host_a
host_b
host_c

目前,我正在履行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

这很好用,但我不喜欢它。我不喜欢它的主要原因是它迫使你记住在两个地方更新主机(主机文件和变量文件)。我考虑过将主机定义为 中的变量group_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

然后当我开始执行任务时,事情就变得更加复杂了。我假设我可以更改我的任务,为每个主机创建一个单独的副本,就像使用 awhen: {{ inventory_host }} == {{ hosts.host_a}}并只复制每个文件在其自己的部分中一样。但这对我来说似乎同样丑陋。

有没有更好、更直观的方法来解决这个问题?

答案1

最佳实践是使用主机变量。主机变量的工作方式与组变量完全相同,但每个主机定义变量。

host_vars/host_a因此你可以得到一个包含内容的文件

cert: a.my.endpoint.com.pem

...并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

在这两种情况下,你的任务都会减少到:

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

相关内容