Ansible – inventario dinâmico VMWare – Alterando padrão de hostnames
Resumo
Essa postagem é continuação do texto Ansible – inventario dinâmico VMWare. A postagem aborda como alterar o padrão de hostnames quando é usado inventário dinâmico VMWare com a ferramenta de automação Ansible.
Motivação
O padrão do inventário dinâmico do VMWare no Ansible é apresentar os hostnames como sendo a nome da vm concatenado com uuid da VM. Essa abordagem é boa para evitar que haja conflitos de nome. Caso tenha VMs com e mesmo nome em pastas separadas, não correrá o risco de ter dois ativos no inventário com o mesmo nome, uma vez que o uuid é único dentro do vcenter.
Por outro lado, essa abordagem é ruim na hora de definir os alvos do seu playbook, uma vez que é necessário saber de antemão qual o uuid da VM para incluir no campo hosts do seu playbook. Isso fica especialmente ruim quando um novo ambiente está sendo criado numa esteira de entrega.
Felizmente o plugin de inventário dinâmico VMWare permite alterar o padrão dos hostnames.
Requisitos
- Possuir conhecimentos básicos de Ansible
- Possuir conhecimentos básicos de vCenter da VMWare
Cenário usado
Para validar essa postagem eu usei o seguinte ambiente:
- vCenter 6.7
- Ubuntu 22.04 minimal
- Ansible 2.14 (ppa)
Instalando
Verifique os passos em Ansible – inventario dinâmico VMWare
Configurando
Usando o nome da VM
No arquivo de configuração do plugin o parâmetro usado para definir o hostname é o hostnames. O hostnames recebe uma lista de templates de nomes. O primeiro template que o plugin conseguir usar para compor o hostname, é o que será usado.
Para alterar o hostname contendo apenas o nome da VM, é necessário criar um arquivo inventory.vmware.yml com o seguinte conteúdo
---
plugin: community.vmware.vmware_vm_inventory
strict: false
hostname: <fqdn ou ip do vcenter>
username: <usuario para acesso ao vcenter>
password: <senha do usuario para acesso ao vcenter>
validate_certs: false
hostnames:
- config.name
Teste com o comando
$ ansible-inventory -i inventory.vmware.yaml --graph
A saída ficará assim
@all:
|--@ungrouped:
|--@ubuntu64Guest:
| |--VM-k8dn-duzv
| |--VM-4spa-jh6g
| |--zabbix-sandbox
| |--VM-2ztj-4ndb
| |--dhcp-sandbox
| |--VM-onsa-rlsp
|--@poweredOff:
| |--VM-k8dn-duzv
|--@poweredOn:
| |--VM-4spa-jh6g
| |--zabbix-sandbox
| |--VM-2ztj-4ndb
| |--dhcp-sandbox
| |--VM-onsa-rlsp
| |--radius
|--@windows9Server64Guest:
| |--radius
Agora é possível usar o hostname como target do seu playbook
---
- name: Update ubuntu servers
hosts: zabbix-sandbox
remote_user: root
tasks:
...
Cuidado. Alterando o hostname dessa forma, sempre que for manipular o objeto no vcenter com os módulos vmware, não faça referência usando o nome da VM, pois pode haver conflito. Faça sempre usando o uuid ou moid. Dentro de um playbook usando inventário exclusivamente vmware é possível obter o uuid da VM usando {{ config.uuid}}
. Essa variável já estará disponível. É adicionada ao hostvars pelo plugin de inventário dinâmico.
Outras composições
É possível compor o nome do host com outras informações da vm, como, por exemplo, usar o endereço IP no nome da VM.
---
plugin: community.vmware.vmware_vm_inventory
strict: false
hostname: <fqdn ou ip do vcenter>
username: <usuario para acesso ao vcenter>
password: <senha do usuario para acesso ao vcenter>
validate_certs: false
hostnames:
- 'config.name+":"+guest.ipAddress'
produzindo a saída
@all:
|--@ungrouped:
|--@ubuntu64Guest:
| |--VM-k8dn-duzv
| |--VM-4spa-jh6g:172.18.202.26
| |--zabbix-sandbox:172.18.202.54
| |--VM-2ztj-4ndb:172.18.202.89
| |--dhcp-sandbox:172.18.202.10
| |--VM-onsa-rlsp:172.18.202.41
|--@poweredOff:
| |--VM-k8dn-duzv
|--@poweredOn:
| |--VM-4spa-jh6g:172.18.202.26
| |--zabbix-sandbox:172.18.202.54
| |--VM-2ztj-4ndb:172.18.202.89
| |--dhcp-sandbox:172.18.202.10
| |--VM-onsa-rlsp:172.18.202.41
| |--radius:172.18.3.38
|--@windows9Server64Guest:
| |--radius:172.18.3.38
O plugin aceita uma lista de “templates” de informações. Quando o uso de uma template resulta num nome vazio, ele tenta usar a próxima template. Outro ponto importante é que o atributo usado pela template precisar ser carregado pelo campo properties. A documentação informa quais são os atributos padrão, mas é possível carregar qualquer um da lista de atributos vmware. Ao alterar o atributo properties, é necessário lembrar de colocar todos os atributos que você possa usar mais para frente, como, por exemplo, o config.uuid.
No exemplo abaixo criamos três templates, tomando o cuidado de carregar todos os atributos necessários
---
plugin: community.vmware.vmware_vm_inventory
strict: false
hostname: <fqdn ou ip do vcenter>
username: <usuario para acesso ao vcenter>
password: <senha do usuario para acesso ao vcenter>
validate_certs: false
properties:
- config.name
- config.guestId
- config.uuid
- config.annotation
- guest.ipAddress
- summary.runtime.powerState
hostnames:
- config.annotation
- guest.ipAddress
- config.name
Resultando na seguinte saída:
@all:
|--@ungrouped:
|--@ubuntu64Guest:
| |--VM-k8dn-duzv
| |--172.18.202.26
| |--Servidor de testes com monitoramento ativo
| |--172.18.202.89
| |--172.18.202.10
| |--172.18.202.41
|--@poweredOff:
| |--VM-k8dn-duzv
|--@poweredOn:
| |--172.18.202.26
| |--Servidor de testes com monitoramento ativo
| |--172.18.202.89
| |--172.18.202.10
| |--172.18.202.41
| |--172.18.3.38
|--@windows9Server64Guest:
| |--172.18.3.38
Conclusão
Usando o parâmetro hostname do plugin de inventário dinâmico você pode dar mais previsibilidade aos nomes do inventário, facilitando criar playbooks para VMs específicas, sem se preocupar com qual uuid a VM receberá no momento que for criada dentro do vCenter.
Postagens relacionadas
- https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware
- https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware-usando-tags
Referências:
- https://docs.ansible.com/ansible/latest/collections/community/vmware/docsite/vmware_scenarios/vmware_inventory.html
- https://docs.ansible.com/ansible/latest/collections/community/vmware/vmware_vm_inventory_inventory.html
- https://docs.ansible.com/ansible/latest/collections/community/vmware/docsite/vmware_scenarios/vmware_inventory_vm_attributes.html
- https://www.ansiblepilot.com/articles/how-to-install-ansible-in-ubuntu-22.04-ansible-install/ https://github.com/vmware/vsphere-automation-sdk-python