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.