Я новичок в 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