Ansible: configurando o nome do host sobre o inventário

5

Eu sou novo no Ansible, mas há muito tempo programador, também trabalhei um pouco com o fantoche.

Aqui está a situação, eu preciso inicializar alguns dispositivos de rede, eles não falam bash, então estou usando o módulo raw e até agora está tudo bem nesse sentido. Mas estou tendo problemas para obter comandos diferentes para serem executados em hosts diferentes. Eu posso ter um número variável de hosts para definir o nome do host, de 1 - N, onde N é menor que 10. O prefixo do nome do host é sempre o mesmo como prefixo _ . Quero adicionar um sufixo de uma lista:

ctr_suffixes:  "[ 'A', 'B', 'C', 'D', 'E']

suffix_list deve sempre ter elementos suficientes para fornecer um sufixo exclusivo (isto é, uma lista de magnitude 10 fornecerá sufixos de 1 a 10 hosts especificados, mas se apenas 3 forem especificados, então A, B, C será usado, mas não mais.)

Portanto, se eu tiver três hosts no meu inventário, quero criar um manual que forneça os seguintes nomes de host

prefix_A
prefix_B
prefix_C

o comando que precisa ser executado em cada host é

set hostname prefix_{{item}}

em que {{item}} deve ser preenchido com A para o primeiro host, B para o segundo host, etc.

Infelizmente, tudo que eu tentei aplicará o comando set hostname em todo e qualquer host no inventário e, no final, todos os hosts serão chamados de prefix_C

Isso é o que eu tenho até agora que não funciona direito:

---
-   hosts: controllers_test
    gather_facts: no
    remote_user:  admin
    vars:
#       ctr_suffixes: [ 'A', 'B', 'C', 'D', 'E' ]
      ctr_suffixes: [ 'A', 'B']

    tasks:
      - name: Assign names to the Controllers
        raw:  "set hostname ctr-TEST-{{item|quote}}"
        with_items: ctr_suffixes

Meu arquivo ansible_hosts possui:

[controllers_test]
10.144.38.137
10.144.38.139

O resultado que obtenho é:

TASK: [Assign names to the Controllers]
***************************************  ok: [10.144.38.139] => (item=A) => {"item": "A", "rc": 0, "stderr": "", "stdout": ""} ok: [10.144.38.137] => (item=A) => {"item": "A", "rc": 0, "stderr": "", "stdout": ""} ok: [10.144.38.137] => (item=B) => {"item": "B", "rc": 0, "stderr": "", "stdout": ""} ok: [10.144.38.139] => (item=B) => {"item": "B", "rc": 0, "stderr": "", "stdout": ""}

PLAY RECAP
******************************************************************** 
10.144.38.137              : ok=2    changed=0    unreachable=0    failed=0   
10.144.38.139              : ok=2    changed=0    unreachable=0    failed=0

Eu tentei with_together e algumas outras coisas, mas todas elas parecem querer aplicar toda a lista de prefixos para cada um dos hosts. Eu me contentaria em manter listas da mesma magnitude que o número de hosts, se isso torna o código mais fácil.

Eu suspeito que preciso usar algum tipo de modelo.

    
por l0r3zz 10.02.2015 / 01:44

1 resposta

8

Você pode fazer isso com variáveis de host de modo que seu arquivo ansible_hosts tem:

[controllers_test]
10.144.38.137   hostname_suffix=A
10.144.38.139   hostname_suffix=B

E então o seu manual se torna:

---
- hosts: controllers_test
  gather_facts: no
  remote_user:  admin
  tasks:
    - name: Assign names to the Controllers
      raw:  "set hostname ctr-TEST-{{hostname_suffix|quote}}"
    
por 07.05.2015 / 15:11

Tags