Qual é a maneira correta de fazer referência a hosts como variáveis no Ansible?

3

Sou relativamente novo no Ansible, e estou em um dilema com nosso fluxo para esse script em particular. Temos uma lista de certificados que queremos implantar em cada host; estes são exclusivos para cada host, portanto, transferência 1: 1.

# hostfile
[prod]
host_a
host_b
host_c

Atualmente, estou fazendo isso como parte do group_vars do meu papel:

haproxy:
  prod:
    certs:
      host_a:  a.my.endpoint.com.pem
      host_b:  b.my.endpoint.com.pem
      host_c:  c.my.endpoint.com.pem

E, em seguida, fazendo referência a isso em uma tarefa:

- 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

Isso funciona bem, mas eu não gosto disso. Eu principalmente não gosto porque isso força você a lembrar de atualizar os hosts em dois lugares (o hostfile e o arquivo vars). O que eu considerava era definir os hosts como um var em group_vars , mas não tenho certeza se posso fazer referência a vars dentro do arquivo? Então, algo como:

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

E isso complica ainda mais as coisas quando entro na tarefa. Eu suponho que eu poderia mudar minha tarefa para ter uma cópia separada para cada host, como com um when: {{ inventory_host }} == {{ hosts.host_a}} e apenas copiar cada arquivo em sua própria seção. Isso parece igualmente feio para mim.

Existe uma maneira melhor e mais intuitiva que eu possa fazer sobre isso?

    
por MrDuk 09.03.2016 / 17:41

1 resposta

5

A melhor prática seria usar o host-vars. host-vars funciona exatamente da mesma forma que group-vars mas define variáveis por host.

Você pode ter um arquivo host_vars/host_a com o conteúdo

cert: a.my.endpoint.com.pem

... e use cert como a variável na sua tarefa.

Mas o seu problema continua o mesmo:

I primarily don't like it because it forces you to remember to update hosts in two places (the hostfile and the vars file).

Mas você também pode definir vars de host em seu inventário. Isso fica feio se você tem mais variáveis para definir, mas se essa é a única e seu objetivo é gerenciar todas as definições em um só lugar, você pode fazer assim:

# 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

Em ambos os casos, sua tarefa reduziria para isso:

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

Tags