Ansible – inventario dinâmico VMWare – Usando tags

Resumo

Essa postagem é continuação do texto Ansible – inventario dinâmico VMWare e Ansible – inventario dinâmico VMWare – Alterando padrão de hostnames. Nele mostro como usar categorias e tags do vCenter com inventário dinâmico Ansible. Eu uso essas categorias para agrupar/separar as VMs criadas de acordo com a natureza delas. Uso categorias como Producao, Homologacao, TesteEspecifico, e assim por diante. Dentro dessas categorias eu crio tags padronizadas como basico, zabbix_server, zabbix_agent, upgrade, certificado e assim por diante. Dessa forma eu consigo aplicar meus playbooks em uma categoria de máquinas (ex. Homologacao) sem atingir as máquinas de outra categoria (ex. Producao).

Requisitos

Cenário usado

Para validar essa postagem eu usei o seguinte ambiente:

Instalando

Instalando o Ansible via apt no Ubuntu.

$ sudo apt update
$ sudo apt install software-properties-common
$ sudo add-apt-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible-core

Essa instalação foi feita em um Ubuntu minimal recém instalado, que não possuía o Ansible instalado. Caso a sua instalação já possua um Ansible instalado, remova com sudo apt remove ansible

Instalando as bibliotecas adicionais para comunicação com vCenter.

$ sudo apt install pip
$ sudo apt install git
$ pip install pyvmomi
$ pip install --upgrade git+https://github.com/vmware/vsphere-automation-sdk-python.git
$ ansible-galaxy collection install community.vmware

O pacote git é instalado apenas para instalar o pacote vsphere-automation-sdk-python. Caso não queira instalar o git, use formas alternativas de instalação encontradas em https://github.com/vmware/vsphere-automation-sdk-python

Configurando

No vCenter

Não é o foco dessa postagem ensinar a gerenciar o vcenter, logo não irei entrar nos detalhes. Para esse exemplo funcionar é necessário criar no vCenter a Categoria Homologacao e as tags zabbix_agent, zabbix_server e basic. Crie as tags com underscore e não com traço. Caso use traço, será convertido para underscore e pode gerar confusão no futuro.

No Ansible

Crie 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
with_tags: true
keyed_groups:
- key: "tag_category.Homologacao"
  prefix: ""
  separator: ""
- key: "summary.runtime.powerState"
  separator: ""
  prefix: ""
filters:
- "'Homologacao' in tag_category"

Esse arquivo é usado para agrupar as VMs da categoria “Homologacao”. Importantes diferenças em relação aos artigos anteriores: with_tags: true só funciona se o pacote vsphere-automation-sdk-python estiver instalado. O atributo filters serve para que apenas as VMs que possuem uma tag da categoria Homologacao seja retornada. As demais VMs existentes no ambiente serão ignoradas. Caso não use esse campo, as demais VMs virão no grupo ungrouped O agrupamento ocorre pelo atributo keyed_groups usando a chave tag_category.NomeDaCategoria. Com isso os grupos serão equivalentes as tags da categoria escolhida. É possível criar um arquivo desse para cada “ambiente”. Lembre-se apenas que o arquivo precisa terminar com .vmware.yml ou .vmware.yaml. Exemplo:

A saída do comando ansible-inventory agora fica assim:

@all:
  |--@ungrouped:
  |--@basic:
  |  |--radius
  |  |--VM-onsa-rlsp
  |--@poweredOn:
  |  |--radius
  |  |--VM-4spa-jh6g
  |  |--zabbix-server
  |  |--VM-2ztj-4ndb
  |  |--dhcp-sandbox
  |  |--VM-onsa-rlsp
  |--@zabbix_agent:
  |  |--VM-k8dn-duzv
  |  |--VM-4spa-jh6g
  |  |--VM-2ztj-4ndb
  |  |--dhcp-sandbox
  |--@poweredOff:
  |  |--VM-k8dn-duzv
  |--@zabbix_server:
  |  |--zabbix-server
  |--@Upgrade:
  |  |--VM-onsa-rlsp

Com essa forma de trabalhar é possível criar playbook de instalação do agente zabbix e colocar como target zabbix_agent. Se uma nova VM precisar do agente zabbix instalado, basta adicionar a tag correspondente à VM no vCenter e rodar novamente o seu playbook. Abaixo tem um exemplo de playbook de instalação do agente zabbix usando essa ideia:

- name: Agente zabbix
  hosts: zabbix_agent
  gather_facts: True
  strategy: free
  become: yes

  pre_tasks:
    - name: Definindo IP do servidor zabbix
      set_fact:
        zabbix_server: "{{ hostvars['zabbix-server'].guest.ipAddress }}"

  roles:
   - zabbix-agent

Note que a pre_task vai atrás de buscar o IP do servidor zabbix. Essa variável será usada pela role para usar na template de configuração do agente zabbix. Logo, se existir mais de um “ambiente” definido por categorias, é admissível ter múltiplos servidores zabbix (um para cada ambiente) e ao rodar seu playbook em um ambiente, os agentes zabbix serão configurados para atender o servidor do ambiente.

Conclusão

Com as categorias e tags do vCenter é possível agrupar as VMs em diferentes ambientes. Alterando os arquivos de configuração os playbooks serão executados apenas para o grupo específico de VM. Permitindo testar playbooks em grupos de máquinas de forma isolada.

Postagens relacionadas

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://www.ansiblepilot.com/articles/how-to-install-ansible-in-ubuntu-22.04-ansible-install/ https://github.com/vmware/vsphere-automation-sdk-python