Назад | Перейти на главную страницу

Как правильно ссылаться на хосты как на переменные в 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

Это нормально работает, но мне это не нравится. Мне в первую очередь это не нравится, потому что это заставляет вас не забывать обновлять хосты в двух местах (файл хоста и файл vars). Я решил определить хосты как var в 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

И это еще больше усложняет ситуацию, когда я вхожу в задачу. Я предполагаю, что могу изменить свою задачу, чтобы иметь отдельную копию для каждого хоста, например, с when: {{ inventory_host }} == {{ hosts.host_a}} и просто скопируйте каждый файл в отдельный раздел. Хотя мне это кажется столь же уродливым.

Есть ли лучший, более интуитивный способ сделать это?

Лучше всего использовать host-vars. host-vars работают точно так же, как group-vars, но определяют переменные для каждого хоста.

Итак, у вас может быть файл host_vars/host_a с содержанием

cert: a.my.endpoint.com.pem

... и использовать cert в качестве переменной в вашей задаче.

Но ваша проблема остается прежней:

В первую очередь мне это не нравится, потому что это заставляет вас не забывать обновлять хосты в двух местах (файл хоста и файл 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