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

Cenário usado

Para validar essa postagem eu usei o seguinte ambiente:

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

Referências: