<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Blog do Ulysses Almeida</title>
    <link>https://bolha.blog/ulysses-almeida/</link>
    <description>Postagens aleatórias</description>
    <pubDate>Thu, 16 Apr 2026 13:13:18 +0000</pubDate>
    <item>
      <title>Eletrifique a cerca</title>
      <link>https://bolha.blog/ulysses-almeida/eletrifique-a-cerca</link>
      <description>&lt;![CDATA[Cenário&#xA;Recentemente eu passei por dois incidentes críticos no meu ambiente de trabalho. Quando digo crítico, é crítico mesmo. Derrubou o ambiente virtual inteiro (90% da operação). Começa que o DNS está lá, e a falta do DNS inutiliza praticamente 100% do ambiente para o usuário final (cerca 600 usuários diretos, sem contar os indiretos). &#xA;&#xA;No primeiro deles, o incidente durou cerca de 16 horas. Iniciou às 11:30 da manhã e finalizou por volta das 03:00am do dia seguinte quando a equipe que tratou o incidente conseguiu levantar as primeiras VMs críticas para o funcionamento do negócio. A sorte desse dia é que era Copa do Mundo e, como regra no Brasil, todos os usuários estavam deixando o trabalho exatamente no início do incidente para assistir o jogo da seleção e iriam voltar somente no dia seguinte. Pouca gente percebeu o problema. Com exceção da equipe que tratou o incidente que sabia muito bem da gravidade dele.&#xA;&#xA;No segundo, o incidente durou menos tempo. Cerca de 3 a 4 horas. E apesar de não ser dia de expediente normal, existia uma grande quantidade de colegas trabalhando, com hora extra autorizada. O incidente foi de menor duração porém o impacto foi maior. Afetou bastante a organização que pagou hora extra para funcionários que não trabalharam porque &#34;os sistemas estavam indisponíveis&#34;.&#xA;&#xA;O que esses dois incidentes têm em comum? Ambos foram causados por mim. Sim. Eu. Com mais de 20 anos de experiência em gestão de infraestrutura de TI. Com bastante conhecimento em redes e configurações de ativos. Enfim, um técnico bastante confiável (modéstia a parte). Porém, num momento de distração causado por cansaço e excesso de confiança, dei conta de errar na configuração de switch, na hora de atribuir VLAN a uma porta. O resultado foi a interrupção de comunicação entre os controladores do cluster, causando queda de do ambiente virtualizado, criando o caos na infraestrutura.&#xA;&#xA;Iniciativa&#xA;&#xA;O livro The Visible Ops Handbook (Spafford, Kim and Behr) me trouxe o conceito de eletrificar a cerca em volta dos seus ativos mais críticos. E isso faz todo sentido. Se eu já tivesse eletrificado a cerca em volta desses switches, esses incidentes dificilmente teriam ocorridos. A organização teria processos mais bem definidos para alterar uma configuração tão crítica como essa.&#xA;&#xA;Para eletrificar a cerca na prática decidimos por usar um conjunto de ferramentas, principalmente Ansible e Git. Os ativos de rede possuem módulos Ansible para a sua configuração. A ideia é que toda a configuração fique em playbooks Ansible e versionados no Git. Os administradores não terão mais credencial de acesso direto a esses ativos de rede, somente ao repositório Git. Farão alterações em uma branch, seguido de um Merge Request. Esse Merge Request será revisado por um par. Somente após a revisão e o aceite do Merge Request é que uma pipe-line de integração contínua vai aplicar, de forma automática, a alteração proposta. Somente o integrador terá acesso de administração ao ativo.&#xA;&#xA;Conclusão&#xA;&#xA;Com a cerca eletrificada a gente evita que um descuido gere um incidente de grandes proporções, principalmente por conta da revisão e por um processo mais bem definido. Além disso, passamos a ter o histórico de alteração da configuração dos ativos, o que ajuda muito na investigação de um incidente, saber o que foi alterado nos últimos tempos. A iniciativa promete deixar o ambiente bem mais estável.&#xA;&#xA;Isso não deixa o processo mais burocrático? Pois é, nem toda burocracia é ruim! Assim que tiver os resultados volto a escrever sobre isso.&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<h2 id="cenário">Cenário</h2>

<p>Recentemente eu passei por dois incidentes críticos no meu ambiente de trabalho. Quando digo crítico, é crítico mesmo. Derrubou o ambiente virtual inteiro (90% da operação). Começa que o DNS está lá, e a falta do DNS inutiliza praticamente 100% do ambiente para o usuário final (cerca 600 usuários diretos, sem contar os indiretos).</p>

<p>No primeiro deles, o incidente durou cerca de 16 horas. Iniciou às 11:30 da manhã e finalizou por volta das 03:00am do dia seguinte quando a equipe que tratou o incidente conseguiu levantar as primeiras VMs críticas para o funcionamento do negócio. A sorte desse dia é que era Copa do Mundo e, como regra no Brasil, todos os usuários estavam deixando o trabalho exatamente no início do incidente para assistir o jogo da seleção e iriam voltar somente no dia seguinte. Pouca gente percebeu o problema. Com exceção da equipe que tratou o incidente que sabia muito bem da gravidade dele.</p>

<p>No segundo, o incidente durou menos tempo. Cerca de 3 a 4 horas. E apesar de não ser dia de expediente normal, existia uma grande quantidade de colegas trabalhando, com hora extra autorizada. O incidente foi de menor duração porém o impacto foi maior. Afetou bastante a organização que pagou hora extra para funcionários que não trabalharam porque “os sistemas estavam indisponíveis”.</p>

<p>O que esses dois incidentes têm em comum? Ambos foram causados por mim. Sim. Eu. Com mais de 20 anos de experiência em gestão de infraestrutura de TI. Com bastante conhecimento em redes e configurações de ativos. Enfim, um técnico bastante confiável (modéstia a parte). Porém, num momento de distração causado por cansaço e excesso de confiança, dei conta de errar na configuração de switch, na hora de atribuir VLAN a uma porta. O resultado foi a interrupção de comunicação entre os controladores do cluster, causando queda de do ambiente virtualizado, criando o caos na infraestrutura.</p>

<h2 id="iniciativa">Iniciativa</h2>

<p>O livro The Visible Ops Handbook (Spafford, Kim and Behr) me trouxe o conceito de <strong>eletrificar a cerca</strong> em volta dos seus ativos mais críticos. E isso faz todo sentido. Se eu já tivesse eletrificado a cerca em volta desses switches, esses incidentes dificilmente teriam ocorridos. A organização teria processos mais bem definidos para alterar uma configuração tão crítica como essa.</p>

<p>Para <strong>eletrificar a cerca na prática</strong> decidimos por usar um conjunto de ferramentas, principalmente Ansible e Git. Os ativos de rede possuem módulos Ansible para a sua configuração. A ideia é que toda a configuração fique em playbooks Ansible e versionados no Git. Os administradores <em>não terão</em> mais credencial de acesso direto a esses ativos de rede, somente ao repositório Git. Farão alterações em uma branch, seguido de um Merge Request. Esse Merge Request será <em>revisado</em> por um par. Somente após a revisão e o aceite do Merge Request é que uma pipe-line de integração contínua vai aplicar, de forma automática, a alteração proposta. Somente o integrador terá acesso de administração ao ativo.</p>

<h2 id="conclusão">Conclusão</h2>

<p>Com a <strong>cerca eletrificada</strong> a gente evita que um descuido gere um incidente de grandes proporções, principalmente por conta da revisão e por um processo mais bem definido. Além disso, passamos a ter o histórico de alteração da configuração dos ativos, o que ajuda muito na investigação de um incidente, saber o que foi alterado nos últimos tempos. A iniciativa promete deixar o ambiente bem mais estável.</p>

<p>Isso não deixa o processo mais burocrático? Pois é, <strong>nem toda burocracia é ruim!</strong> Assim que tiver os resultados volto a escrever sobre isso.</p>
]]></content:encoded>
      <guid>https://bolha.blog/ulysses-almeida/eletrifique-a-cerca</guid>
      <pubDate>Mon, 26 Feb 2024 14:01:59 +0000</pubDate>
    </item>
    <item>
      <title>Transferindo WhatsApp e WhatsApp Business do Android para o iPhone com histórico.</title>
      <link>https://bolha.blog/ulysses-almeida/transferindo-whatsapp-e-whatsapp-business-do-android-para-o-iphone-com</link>
      <description>&lt;![CDATA[Consegui transferir ambos WhatsApp (normal e Business) do Android para o iPhone com histórico de conversas e mídias, sem necessidade de um iPhone extra. Deu um trabalho e exigiu paciência.&#xA;&#xA;O Problema&#xA;O WhatsApp tem uma característica irritante que não consigo encontrar justificativa. No iPhone só é possível fazer backup no iCloud. No Android, só é possível fazer backup no Google Drive. Não é possível passar o backup de uma plataforma para a outra. Ou seja... o usuário que quiser migrar de uma plataforma para outra preservando o histórico irá viver um inferno.&#xA;&#xA;Para migrar o WhatsApp do Android para o iPhone já é possível de maneira &#34;oficial&#34; através do aplicativo Migrar para iOS. Existem alguns blogs e vídeos no youtube que mostram como fazer passo-a-passo. Eu indico esse aqui: https://www.youtube.com/watch?v=ivDcMKdvz0&#xA;&#xA;O problema é que serve apenas para o Aplicativo WhatsApp e não serve para o WhatsApp Business.&#xA;&#xA;O desafio&#xA;Minha esposa usa os dois WhatsApp (normal e business) no mesmo aparelho. Um para assuntos pessoais, outro para assuntos de sua clínica de psicanálise. Após 4 anos tentando se adaptar ao universo Android, ela resolveu migrar de volta para o iOS (o que não julgo).&#xA;&#xA;Tendo o WhatsApp como sua principal plataforma de comunicação, é obvio que ela queria migrar as duas aplicações para o novo smartphone levando junto seu histórico. Não tendo possibilidade de fazer isso de forma simples (ex. WhatsApp no iPhone poderia buscar backup no GoogleDrive), foi necessário uma trabalhosa solução de contorno, conforme abaixo.&#xA;&#xA;Requisitos&#xA;Paciência&#xA;Espaço no iCloud suficiente para fazer backup dos dois WhatsApp&#xA;Espaço no Google drive para fazer backup dos dois WhatsApp (não é realmente necessário, mas é recomendado)&#xA;Tempo (dependendo do históricos a migração pode levar várias horas)&#xA;&#xA;Passo-a-passo&#xA;&#xA;No Android: Antes de começar qualquer passo, forcei um backup nos dois WhatsApp. Não serão utilizados agora, mas servem como uma segurança a mais para &#34;voltar atrás&#34; caso necessário.&#xA;Com iPhone padrão de fábrica foi feito a transferência do WhatsApp normal do Android para o iPhone, conforme instruções do vídeo https://www.youtube.com/watch?v=ivDcMKdvz0. Nesse primeiro passo, foque apenas na transferência do WhatsApp. Nem se preocupe com os demais dados que você queira transferir.&#xA;No iPhone: Ao finalizar a recuperação de dados no iPhone, entrei no WhatsApp e fiz um backup no iCloud. Alguns erros podem ocorrer nesse momento da migração (ocorreram aqui). Dê uma olhada nos comentários do vídeo que tem bastante dica de como resolver. Certifique-se que o backup no iCloud foi feito com sucesso.&#xA;No iPhone: Resetei o iPhone para padrão de fábrica. (Sim, foi necessário fazer tudo novamente).&#xA;No Android. Eu forcei parada do Whatsapp e removi todos os dados (pode ser feito removendo o whatsapp e instalando novamente).&#xA;No Android: Eu entrei no WhtasApp Business e forcei um backup. Sim, fiz isso novamente para ter um backup mais recente.&#xA;No Android: Eu entrei no WhatsApp normal e informei o número vinculado ao WhatsApp Business. Recuperei o backup (nesse passo vem todo o histórico de mensagens e mídias, mas perde-se os dados específicos do WB como resposta automática e catálogos).&#xA;Novamente iniciei o processo de migração de dados do iPhone para transferir o whatsapp novamente. Agora com o histórico do Business. Dessa vez, marque os demais dados que você queira levar do Android para o iOS. Com sorte, não vai precisar fazer isso novamente.&#xA;No iPhone: Abri o WhatsApp (normal) e informei o número do WhatsApp Business para finalizar a migração de histórico.&#xA;No iPhone: Instalei o WhatsApp Business e entrei com o número vinculado ao Business. Foi feita a migração das conversas do Whatsapp normal para o WhatsApp Business.&#xA;No iPhone: Desinstalei o WhatsApp normal.&#xA;No iPhone: Fiz um backup do WhatsApp Business para a iCloud.&#xA;No iPhone: Instalei novamente o WhatsApp normal e entrei com o número original dele. Após registrar, restaurei backup que já tinha feito no iCloud.&#xA;Pronto os dois WhatsApp foram migrados com todo o histórico de conversas e mídias.&#xA;&#xA;Conclusão&#xA;O WhatsApp é péssimo. Inimigo da facilidade.&#xA;&#xA;Nessa migração é perdida todas as funções específicas do WhatsApp Business como respostas automáticas ou catálogo de produtos.]]&gt;</description>
      <content:encoded><![CDATA[<p>Consegui transferir ambos WhatsApp (normal e Business) do Android para o iPhone com histórico de conversas e mídias, sem necessidade de um iPhone extra. Deu um trabalho e exigiu paciência.</p>

<h2 id="o-problema">O Problema</h2>

<p>O WhatsApp tem uma característica irritante que não consigo encontrar justificativa. No iPhone só é possível fazer backup no iCloud. No Android, só é possível fazer backup no Google Drive. Não é possível passar o backup de uma plataforma para a outra. Ou seja... o usuário que quiser migrar de uma plataforma para outra preservando o histórico irá viver um inferno.</p>

<p>Para migrar o WhatsApp do Android para o iPhone já é possível de maneira “oficial” através do aplicativo <a href="https://play.google.com/store/apps/details?id=com.apple.movetoios" rel="nofollow">Migrar para iOS</a>. Existem alguns blogs e vídeos no youtube que mostram como fazer passo-a-passo. Eu indico esse aqui: <a href="https://www.youtube.com/watch?v=ivDcM_Kdvz0" rel="nofollow">https://www.youtube.com/watch?v=ivDcM_Kdvz0</a></p>

<p>O problema é que serve apenas para o Aplicativo WhatsApp e não serve para o WhatsApp Business.</p>

<h2 id="o-desafio">O desafio</h2>

<p>Minha esposa usa os dois WhatsApp (normal e business) no mesmo aparelho. Um para assuntos pessoais, outro para assuntos de sua clínica de psicanálise. Após 4 anos tentando se adaptar ao universo Android, ela resolveu migrar de volta para o iOS (o que não julgo).</p>

<p>Tendo o WhatsApp como sua principal plataforma de comunicação, é obvio que ela queria migrar as duas aplicações para o novo smartphone levando junto seu histórico. Não tendo possibilidade de fazer isso de forma simples (ex. WhatsApp no iPhone poderia buscar backup no GoogleDrive), foi necessário uma trabalhosa solução de contorno, conforme abaixo.</p>

<h2 id="requisitos">Requisitos</h2>
<ul><li>Paciência</li>
<li>Espaço no iCloud suficiente para fazer backup dos dois WhatsApp</li>
<li>Espaço no Google drive para fazer backup dos dois WhatsApp (não é realmente necessário, mas é recomendado)</li>
<li>Tempo (dependendo do históricos a migração pode levar várias horas)</li></ul>

<h2 id="passo-a-passo">Passo-a-passo</h2>
<ul><li><strong>No Android:</strong> Antes de começar qualquer passo, forcei um backup nos dois WhatsApp. Não serão utilizados agora, mas servem como uma segurança a mais para “voltar atrás” caso necessário.</li>
<li><strong>Com iPhone padrão de fábrica</strong> foi feito a transferência do WhatsApp normal do Android para o iPhone, conforme instruções do vídeo <a href="https://www.youtube.com/watch?v=ivDcM_Kdvz0" rel="nofollow">https://www.youtube.com/watch?v=ivDcM_Kdvz0</a>. Nesse primeiro passo, foque apenas na transferência do WhatsApp. Nem se preocupe com os demais dados que você queira transferir.</li>
<li><strong>No iPhone:</strong> Ao finalizar a recuperação de dados no iPhone, entrei no WhatsApp e <strong>fiz um backup no iCloud</strong>. Alguns erros podem ocorrer nesse momento da migração (ocorreram aqui). Dê uma olhada nos comentários do vídeo que tem bastante dica de como resolver. Certifique-se que o backup no iCloud foi feito com sucesso.</li>
<li><strong>No iPhone:</strong> Resetei o iPhone para padrão de fábrica. (Sim, foi necessário fazer tudo novamente).</li>
<li><strong>No Android.</strong> Eu forcei parada do Whatsapp e removi todos os dados (pode ser feito removendo o whatsapp e instalando novamente).</li>
<li><strong>No Android:</strong> Eu entrei no WhtasApp Business e forcei um backup. Sim, fiz isso novamente para ter um backup mais recente.</li>
<li><strong>No Android:</strong> Eu entrei no WhatsApp normal e informei o número vinculado ao WhatsApp Business. Recuperei o backup (nesse passo vem todo o histórico de mensagens e mídias, mas perde-se os dados específicos do WB como resposta automática e catálogos).</li>
<li>Novamente iniciei o processo de migração de dados do iPhone para transferir o whatsapp novamente. Agora com o histórico do Business. Dessa vez, marque os demais dados que você queira levar do Android para o iOS. Com sorte, não vai precisar fazer isso novamente.</li>
<li><strong>No iPhone:</strong> Abri o WhatsApp (normal) e informei o número do WhatsApp Business para finalizar a migração de histórico.</li>
<li><strong>No iPhone:</strong> Instalei o WhatsApp Business e entrei com o número vinculado ao Business. Foi feita a migração das conversas do Whatsapp normal para o WhatsApp Business.</li>
<li><strong>No iPhone:</strong> Desinstalei o WhatsApp normal.</li>
<li><strong>No iPhone:</strong> Fiz um backup do WhatsApp Business para a iCloud.</li>
<li><strong>No iPhone:</strong> Instalei novamente o WhatsApp normal e entrei com o número original dele. Após registrar, restaurei backup que já tinha feito no iCloud.
Pronto os dois WhatsApp foram migrados com todo o histórico de conversas e mídias.</li></ul>

<h2 id="conclusão">Conclusão</h2>

<p>O WhatsApp é péssimo. Inimigo da facilidade.</p>

<p>Nessa migração é perdida todas as funções específicas do WhatsApp Business como respostas automáticas ou catálogo de produtos.</p>
]]></content:encoded>
      <guid>https://bolha.blog/ulysses-almeida/transferindo-whatsapp-e-whatsapp-business-do-android-para-o-iphone-com</guid>
      <pubDate>Mon, 19 Feb 2024 11:05:22 +0000</pubDate>
    </item>
    <item>
      <title>Ansible - inventario dinâmico VMWare - Usando tags</title>
      <link>https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware-usando-tags</link>
      <description>&lt;![CDATA[Resumo&#xA;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, zabbixagent, 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).&#xA;&#xA;Requisitos&#xA;Possuir conhecimentos básicos de Ansible&#xA;Possuir conhecimentos básicos de vCenter da VMWare&#xA;&#xA;Cenário usado&#xA;Para validar essa postagem eu usei o seguinte ambiente:&#xA;&#xA;vCenter 6.7&#xA;Ubuntu 22.04 minimal&#xA;Ansible 2.14 (ppa)&#xA;&#xA;Instalando&#xA;Instalando o Ansible via apt no Ubuntu.&#xA;$ sudo apt update&#xA;$ sudo apt install software-properties-common&#xA;$ sudo add-apt-repository --yes --update ppa:ansible/ansible&#xA;$ sudo apt install ansible-core&#xA;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 &#xA;Instalando as bibliotecas adicionais para comunicação com vCenter.&#xA;$ sudo apt install pip&#xA;$ sudo apt install git&#xA;$ pip install pyvmomi&#xA;$ pip install --upgrade git+https://github.com/vmware/vsphere-automation-sdk-python.git&#xA;$ ansible-galaxy collection install community.vmware&#xA;&#xA;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&#xA;&#xA;Configurando&#xA;No vCenter&#xA;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 zabbixagent, zabbixserver 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.&#xA;&#xA;No Ansible&#xA;Crie um arquivo inventory.vmware.yml com o seguinte conteúdo&#xA;---&#xA;plugin: community.vmware.vmwarevminventory&#xA;strict: false&#xA;hostname: fqdn ou ip do vcenter&#xA;username: usuario para acesso ao vcenter&#xA;password: senha do usuario para acesso ao vcenter&#xA;validatecerts: false&#xA;withtags: true&#xA;keyedgroups:&#xA;key: &#34;tagcategory.Homologacao&#34;&#xA;  prefix: &#34;&#34;&#xA;  separator: &#34;&#34;&#xA;key: &#34;summary.runtime.powerState&#34;&#xA;  separator: &#34;&#34;&#xA;  prefix: &#34;&#34;&#xA;filters:&#xA;&#34;&#39;Homologacao&#39; in tagcategory&#34;&#xA;Esse arquivo é usado para agrupar as VMs da categoria &#34;Homologacao&#34;. Importantes diferenças em relação aos artigos anteriores:&#xA;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&#xA;O agrupamento ocorre pelo atributo keyed\groups usando a chave tagcategory.NomeDaCategoria. Com isso os grupos serão equivalentes as tags da categoria escolhida.&#xA;É possível criar um arquivo desse para cada &#34;ambiente&#34;. Lembre-se apenas que o arquivo precisa terminar com .vmware.yml ou .vmware.yaml. Exemplo:&#xA;&#xA;producao.vmware.yml&#xA;homologacao.vmware.yaml&#xA;sandbox.vmware.yml&#xA;novaImagem.vmware.yml&#xA;&#xA;A saída do comando ansible-inventory agora fica assim:&#xA;@all:&#xA;  |--@ungrouped:&#xA;  |--@basic:&#xA;  |  |--radius&#xA;  |  |--VM-onsa-rlsp&#xA;  |--@poweredOn:&#xA;  |  |--radius&#xA;  |  |--VM-4spa-jh6g&#xA;  |  |--zabbix-server&#xA;  |  |--VM-2ztj-4ndb&#xA;  |  |--dhcp-sandbox&#xA;  |  |--VM-onsa-rlsp&#xA;  |--@zabbixagent:&#xA;  |  |--VM-k8dn-duzv&#xA;  |  |--VM-4spa-jh6g&#xA;  |  |--VM-2ztj-4ndb&#xA;  |  |--dhcp-sandbox&#xA;  |--@poweredOff:&#xA;  |  |--VM-k8dn-duzv&#xA;  |--@zabbixserver:&#xA;  |  |--zabbix-server&#xA;  |--@Upgrade:&#xA;  |  |--VM-onsa-rlsp&#xA;&#xA;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:&#xA;name: Agente zabbix&#xA;  hosts: zabbixagent&#xA;  gatherfacts: True&#xA;  strategy: free&#xA;  become: yes&#xA;&#xA;  pretasks:&#xA;    name: Definindo IP do servidor zabbix&#xA;      setfact:&#xA;        zabbixserver: &#34;{{ hostvars[&#39;zabbix-server&#39;].guest.ipAddress }}&#34;&#xA;&#xA;  roles:&#xA;   zabbix-agent&#xA;Note que a pretask 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 &#34;ambiente&#34; 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.&#xA;&#xA;Conclusão&#xA;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.&#xA;&#xA;Postagens relacionadas&#xA;https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware&#xA;https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware-alterando-padrao-de-hostnames&#xA;&#xA;Referências:&#xA;https://docs.ansible.com/ansible/latest/collections/community/vmware/docsite/vmwarescenarios/vmwareinventory.html&#xA;https://docs.ansible.com/ansible/latest/collections/community/vmware/vmwarevminventoryinventory.html&#xA;https://www.ansiblepilot.com/articles/how-to-install-ansible-in-ubuntu-22.04-ansible-install/&#xA;https://github.com/vmware/vsphere-automation-sdk-python]]&gt;</description>
      <content:encoded><![CDATA[<h2 id="resumo">Resumo</h2>

<p>Essa postagem é continuação do texto <a href="https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware" rel="nofollow">Ansible – inventario dinâmico VMWare</a> e <a href="https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware-alterando-padrao-de-hostnames" rel="nofollow">Ansible – inventario dinâmico VMWare – Alterando padrão de hostnames</a>. 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).</p>

<h2 id="requisitos">Requisitos</h2>
<ul><li>Possuir conhecimentos básicos de Ansible</li>
<li>Possuir conhecimentos básicos de vCenter da VMWare</li></ul>

<h3 id="cenário-usado">Cenário usado</h3>

<p>Para validar essa postagem eu usei o seguinte ambiente:</p>
<ul><li>vCenter 6.7</li>
<li>Ubuntu 22.04 minimal</li>
<li>Ansible 2.14 (ppa)</li></ul>

<h2 id="instalando">Instalando</h2>

<h3 id="instalando-o-ansible-via-apt-no-ubuntu">Instalando o Ansible via apt no Ubuntu.</h3>

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

<p><em>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 <code>sudo apt remove ansible</code></em></p>

<h3 id="instalando-as-bibliotecas-adicionais-para-comunicação-com-vcenter">Instalando as bibliotecas adicionais para comunicação com vCenter.</h3>

<pre><code>$ 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

</code></pre>

<p><em>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 <a href="https://github.com/vmware/vsphere-automation-sdk-python" rel="nofollow">https://github.com/vmware/vsphere-automation-sdk-python</a></em></p>

<h2 id="configurando">Configurando</h2>

<h3 id="no-vcenter">No vCenter</h3>

<p>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 <strong>Homologacao</strong> e as tags <strong>zabbix_agent</strong>, <strong>zabbix_server</strong> e <strong>basic</strong>. Crie as tags com <em>underscore</em> e não com <em>traço</em>. Caso use traço, será convertido para underscore e pode gerar confusão no futuro.</p>

<h3 id="no-ansible">No Ansible</h3>

<p>Crie um arquivo inventory.vmware.yml com o seguinte conteúdo</p>

<pre><code class="language-yaml">---
plugin: community.vmware.vmware_vm_inventory
strict: false
hostname: &lt;fqdn ou ip do vcenter&gt;
username: &lt;usuario para acesso ao vcenter&gt;
password: &lt;senha do usuario para acesso ao vcenter&gt;
validate_certs: false
with_tags: true
keyed_groups:
- key: &#34;tag_category.Homologacao&#34;
  prefix: &#34;&#34;
  separator: &#34;&#34;
- key: &#34;summary.runtime.powerState&#34;
  separator: &#34;&#34;
  prefix: &#34;&#34;
filters:
- &#34;&#39;Homologacao&#39; in tag_category&#34;
</code></pre>

<p>Esse arquivo é usado para agrupar as VMs da categoria “Homologacao”. Importantes diferenças em relação aos artigos anteriores:
<code>with_tags: true</code> só funciona se o pacote <em>vsphere-automation-sdk-python</em> estiver instalado.
O atributo <em>filters</em> serve para que apenas as VMs que possuem uma tag da categoria <em>Homologacao</em> seja retornada. As demais VMs existentes no ambiente serão ignoradas. Caso não use esse campo, as demais VMs virão no grupo <em>ungrouped</em>
O agrupamento ocorre pelo atributo <em>keyed_groups</em> 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 <strong>precisa</strong> terminar com <em>.vmware.yml</em> ou <em>.vmware.yaml</em>. Exemplo:</p>
<ul><li>producao.vmware.yml</li>
<li>homologacao.vmware.yaml</li>
<li>sandbox.vmware.yml</li>
<li>novaImagem.vmware.yml</li></ul>

<p>A saída do comando <em>ansible-inventory</em> agora fica assim:</p>

<pre><code>@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
</code></pre>

<p>Com essa forma de trabalhar é possível criar playbook de instalação do agente zabbix e colocar como target <em>zabbix_agent</em>. 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:</p>

<pre><code class="language-yaml">- 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: &#34;{{ hostvars[&#39;zabbix-server&#39;].guest.ipAddress }}&#34;

  roles:
   - zabbix-agent
</code></pre>

<p>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.</p>

<h2 id="conclusão">Conclusão</h2>

<p>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.</p>

<h2 id="postagens-relacionadas">Postagens relacionadas</h2>
<ul><li><a href="https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware" rel="nofollow">https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware</a></li>
<li><a href="https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware-alterando-padrao-de-hostnames" rel="nofollow">https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware-alterando-padrao-de-hostnames</a></li></ul>

<h2 id="referências">Referências:</h2>

<p><a href="https://docs.ansible.com/ansible/latest/collections/community/vmware/docsite/vmware_scenarios/vmware_inventory.html" rel="nofollow">https://docs.ansible.com/ansible/latest/collections/community/vmware/docsite/vmware_scenarios/vmware_inventory.html</a>
<a href="https://docs.ansible.com/ansible/latest/collections/community/vmware/vmware_vm_inventory_inventory.html" rel="nofollow">https://docs.ansible.com/ansible/latest/collections/community/vmware/vmware_vm_inventory_inventory.html</a>
<a href="https://www.ansiblepilot.com/articles/how-to-install-ansible-in-ubuntu-22.04-ansible-install/" rel="nofollow">https://www.ansiblepilot.com/articles/how-to-install-ansible-in-ubuntu-22.04-ansible-install/</a>
<a href="https://github.com/vmware/vsphere-automation-sdk-python" rel="nofollow">https://github.com/vmware/vsphere-automation-sdk-python</a></p>
]]></content:encoded>
      <guid>https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware-usando-tags</guid>
      <pubDate>Sat, 22 Jul 2023 15:39:33 +0000</pubDate>
    </item>
    <item>
      <title>Ansible - inventario dinâmico VMWare - Alterando padrão de hostnames</title>
      <link>https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware-alterando-padrao-de-hostnames</link>
      <description>&lt;![CDATA[Resumo&#xA;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.&#xA;&#xA;Motivação&#xA;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.&#xA;&#xA;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.&#xA;&#xA;Felizmente o plugin de inventário dinâmico VMWare permite alterar o padrão dos hostnames.&#xA;&#xA;Requisitos&#xA;Possuir conhecimentos básicos de Ansible&#xA;Possuir conhecimentos básicos de vCenter da VMWare&#xA;&#xA;Cenário usado&#xA;Para validar essa postagem eu usei o seguinte ambiente:&#xA;&#xA;vCenter 6.7&#xA;Ubuntu 22.04 minimal&#xA;Ansible 2.14 (ppa)&#xA;&#xA;Instalando&#xA;Verifique os passos em Ansible – inventario dinâmico VMWare&#xA;&#xA;Configurando&#xA;Usando o nome da VM&#xA;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.&#xA;&#xA;Para alterar o hostname contendo apenas o nome da VM, é necessário criar um arquivo inventory.vmware.yml com o seguinte conteúdo&#xA;---&#xA;plugin: community.vmware.vmwarevminventory&#xA;strict: false&#xA;hostname: fqdn ou ip do vcenter&#xA;username: usuario para acesso ao vcenter&#xA;password: senha do usuario para acesso ao vcenter&#xA;validatecerts: false&#xA;hostnames:&#xA;  config.name&#xA;&#xA;Teste com o comando&#xA;$ ansible-inventory -i inventory.vmware.yaml --graph&#xA;&#xA;A saída ficará assim&#xA;@all:&#xA;  |--@ungrouped:&#xA;  |--@ubuntu64Guest:&#xA;  |  |--VM-k8dn-duzv&#xA;  |  |--VM-4spa-jh6g&#xA;  |  |--zabbix-sandbox&#xA;  |  |--VM-2ztj-4ndb&#xA;  |  |--dhcp-sandbox&#xA;  |  |--VM-onsa-rlsp&#xA;  |--@poweredOff:&#xA;  |  |--VM-k8dn-duzv&#xA;  |--@poweredOn:&#xA;  |  |--VM-4spa-jh6g&#xA;  |  |--zabbix-sandbox&#xA;  |  |--VM-2ztj-4ndb&#xA;  |  |--dhcp-sandbox&#xA;  |  |--VM-onsa-rlsp&#xA;  |  |--radius&#xA;  |--@windows9Server64Guest:&#xA;  |  |--radius&#xA;&#xA;Agora é possível usar o hostname como target do seu playbook&#xA;---&#xA;name: Update ubuntu servers&#xA;  hosts: zabbix-sandbox&#xA;  remoteuser: root&#xA;&#xA;  tasks:&#xA;...&#xA;&#xA;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 &#xA;Outras composições&#xA;É 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.&#xA;&#xA;---&#xA;plugin: community.vmware.vmwarevminventory&#xA;strict: false&#xA;hostname: fqdn ou ip do vcenter&#xA;username: usuario para acesso ao vcenter&#xA;password: senha do usuario para acesso ao vcenter&#xA;validatecerts: false&#xA;hostnames:&#xA;  &#39;config.name+&#34;:&#34;+guest.ipAddress&#39;&#xA;&#xA;produzindo a saída&#xA;@all:&#xA;  |--@ungrouped:&#xA;  |--@ubuntu64Guest:&#xA;  |  |--VM-k8dn-duzv&#xA;  |  |--VM-4spa-jh6g:172.18.202.26&#xA;  |  |--zabbix-sandbox:172.18.202.54&#xA;  |  |--VM-2ztj-4ndb:172.18.202.89&#xA;  |  |--dhcp-sandbox:172.18.202.10&#xA;  |  |--VM-onsa-rlsp:172.18.202.41&#xA;  |--@poweredOff:&#xA;  |  |--VM-k8dn-duzv&#xA;  |--@poweredOn:&#xA;  |  |--VM-4spa-jh6g:172.18.202.26&#xA;  |  |--zabbix-sandbox:172.18.202.54&#xA;  |  |--VM-2ztj-4ndb:172.18.202.89&#xA;  |  |--dhcp-sandbox:172.18.202.10&#xA;  |  |--VM-onsa-rlsp:172.18.202.41&#xA;  |  |--radius:172.18.3.38&#xA;  |--@windows9Server64Guest:&#xA;  |  |--radius:172.18.3.38&#xA;&#xA;O plugin aceita uma lista de &#34;templates&#34; 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.&#xA;&#xA;No exemplo abaixo criamos três templates, tomando o cuidado de carregar todos os atributos necessários&#xA;---&#xA;plugin: community.vmware.vmwarevminventory&#xA;strict: false&#xA;hostname: fqdn ou ip do vcenter&#xA;username: usuario para acesso ao vcenter&#xA;password: senha do usuario para acesso ao vcenter&#xA;validatecerts: false&#xA;properties:&#xA;  config.name&#xA;  config.guestId&#xA;  config.uuid&#xA;  config.annotation&#xA;  guest.ipAddress&#xA;  summary.runtime.powerState&#xA;hostnames:&#xA; config.annotation&#xA; guest.ipAddress&#xA;  config.name&#xA;&#xA;Resultando na seguinte saída:&#xA;@all:&#xA;  |--@ungrouped:&#xA;  |--@ubuntu64Guest:&#xA;  |  |--VM-k8dn-duzv&#xA;  |  |--172.18.202.26&#xA;  |  |--Servidor de testes com monitoramento ativo&#xA;  |  |--172.18.202.89&#xA;  |  |--172.18.202.10&#xA;  |  |--172.18.202.41&#xA;  |--@poweredOff:&#xA;  |  |--VM-k8dn-duzv&#xA;  |--@poweredOn:&#xA;  |  |--172.18.202.26&#xA;  |  |--Servidor de testes com monitoramento ativo&#xA;  |  |--172.18.202.89&#xA;  |  |--172.18.202.10&#xA;  |  |--172.18.202.41&#xA;  |  |--172.18.3.38&#xA;  |--@windows9Server64Guest:&#xA;  |  |--172.18.3.38&#xA;&#xA;Conclusão&#xA;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.&#xA;&#xA;Postagens relacionadas&#xA;https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware&#xA;https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware-usando-tags&#xA;&#xA;Referências:&#xA;https://docs.ansible.com/ansible/latest/collections/community/vmware/docsite/vmwarescenarios/vmwareinventory.html&#xA;https://docs.ansible.com/ansible/latest/collections/community/vmware/vmwarevminventoryinventory.html&#xA;https://docs.ansible.com/ansible/latest/collections/community/vmware/docsite/vmwarescenarios/vmwareinventoryvm_attributes.html&#xA;https://www.ansiblepilot.com/articles/how-to-install-ansible-in-ubuntu-22.04-ansible-install/&#xA;https://github.com/vmware/vsphere-automation-sdk-python]]&gt;</description>
      <content:encoded><![CDATA[<h2 id="resumo">Resumo</h2>

<p>Essa postagem é continuação do texto <a href="https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware" rel="nofollow">Ansible – inventario dinâmico VMWare</a>. A postagem aborda como alterar o padrão de hostnames quando é usado inventário dinâmico VMWare com a ferramenta de automação Ansible.</p>

<h2 id="motivação">Motivação</h2>

<p>O padrão do inventário dinâmico do VMWare no Ansible é apresentar os hostnames como sendo a <em>nome da vm</em> concatenado com <em>uuid</em> 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.</p>

<p>Por outro lado, essa abordagem é ruim na hora de definir os <em>alvos</em> do seu playbook, uma vez que é necessário saber de antemão qual o uuid da VM para incluir no campo <em>hosts</em> do seu playbook. Isso fica especialmente ruim quando um novo ambiente está sendo criado numa esteira de entrega.</p>

<p>Felizmente o plugin de inventário dinâmico VMWare permite alterar o padrão dos hostnames.</p>

<h2 id="requisitos">Requisitos</h2>
<ul><li>Possuir conhecimentos básicos de Ansible</li>
<li>Possuir conhecimentos básicos de vCenter da VMWare</li></ul>

<h3 id="cenário-usado">Cenário usado</h3>

<p>Para validar essa postagem eu usei o seguinte ambiente:</p>
<ul><li>vCenter 6.7</li>
<li>Ubuntu 22.04 minimal</li>
<li>Ansible 2.14 (ppa)</li></ul>

<h2 id="instalando">Instalando</h2>

<p>Verifique os passos em <a href="https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware" rel="nofollow">Ansible – inventario dinâmico VMWare</a></p>

<h2 id="configurando">Configurando</h2>

<h3 id="usando-o-nome-da-vm">Usando o nome da VM</h3>

<p>No arquivo de configuração do plugin o parâmetro usado para definir o hostname é o <em>hostnames</em>. O hostnames recebe uma lista de <em>templates</em> de nomes. O primeiro template que o plugin conseguir usar para compor o hostname, é o que será usado.</p>

<p>Para alterar o hostname contendo apenas o nome da VM, é necessário criar um arquivo inventory.vmware.yml com o seguinte conteúdo</p>

<pre><code class="language-yaml">---
plugin: community.vmware.vmware_vm_inventory
strict: false
hostname: &lt;fqdn ou ip do vcenter&gt;
username: &lt;usuario para acesso ao vcenter&gt;
password: &lt;senha do usuario para acesso ao vcenter&gt;
validate_certs: false
hostnames:
  - config.name
</code></pre>

<p>Teste com o comando</p>

<pre><code>$ ansible-inventory -i inventory.vmware.yaml --graph
</code></pre>

<p>A saída ficará assim</p>

<pre><code>@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
</code></pre>

<p>Agora é possível usar o hostname como target do seu playbook</p>

<pre><code class="language-yaml">---
- name: Update ubuntu servers
  hosts: zabbix-sandbox
  remote_user: root

  tasks:
...
</code></pre>

<p><strong>Cuidado</strong>. 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 <code>{{ config.uuid}}</code>. Essa variável já estará disponível. É adicionada ao hostvars pelo plugin de inventário dinâmico.</p>

<h3 id="outras-composições">Outras composições</h3>

<p>É 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.</p>

<pre><code class="language-yaml">---
plugin: community.vmware.vmware_vm_inventory
strict: false
hostname: &lt;fqdn ou ip do vcenter&gt;
username: &lt;usuario para acesso ao vcenter&gt;
password: &lt;senha do usuario para acesso ao vcenter&gt;
validate_certs: false
hostnames:
  - &#39;config.name+&#34;:&#34;+guest.ipAddress&#39;
</code></pre>

<p>produzindo a saída</p>

<pre><code>@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
</code></pre>

<p>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 <em>properties</em>. A documentação informa quais são os atributos padrão, mas é possível carregar qualquer um da lista de <a href="https://docs.ansible.com/ansible/latest/collections/community/vmware/docsite/vmware_scenarios/vmware_inventory_vm_attributes.html" rel="nofollow">atributos vmware</a>. Ao alterar o atributo properties, é necessário lembrar de colocar todos os atributos que você possa usar mais para frente, como, por exemplo, o <em>config.uuid</em>.</p>

<p>No exemplo abaixo criamos três templates, tomando o cuidado de carregar todos os atributos necessários</p>

<pre><code class="language-yaml">---
plugin: community.vmware.vmware_vm_inventory
strict: false
hostname: &lt;fqdn ou ip do vcenter&gt;
username: &lt;usuario para acesso ao vcenter&gt;
password: &lt;senha do usuario para acesso ao vcenter&gt;
validate_certs: false
properties:
  - config.name
  - config.guestId
  - config.uuid
  - config.annotation
  - guest.ipAddress
  - summary.runtime.powerState
hostnames:
 - config.annotation
 - guest.ipAddress
  - config.name
</code></pre>

<p>Resultando na seguinte saída:</p>

<pre><code>@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
</code></pre>

<h2 id="conclusão">Conclusão</h2>

<p>Usando o parâmetro <em>hostname</em> 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.</p>

<h2 id="postagens-relacionadas">Postagens relacionadas</h2>
<ul><li><a href="https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware" rel="nofollow">https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware</a></li>
<li><a href="https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware-usando-tags" rel="nofollow">https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware-usando-tags</a></li></ul>

<h2 id="referências">Referências:</h2>
<ul><li><a href="https://docs.ansible.com/ansible/latest/collections/community/vmware/docsite/vmware_scenarios/vmware_inventory.html" rel="nofollow">https://docs.ansible.com/ansible/latest/collections/community/vmware/docsite/vmware_scenarios/vmware_inventory.html</a></li>
<li><a href="https://docs.ansible.com/ansible/latest/collections/community/vmware/vmware_vm_inventory_inventory.html" rel="nofollow">https://docs.ansible.com/ansible/latest/collections/community/vmware/vmware_vm_inventory_inventory.html</a></li>
<li><a href="https://docs.ansible.com/ansible/latest/collections/community/vmware/docsite/vmware_scenarios/vmware_inventory_vm_attributes.html" rel="nofollow">https://docs.ansible.com/ansible/latest/collections/community/vmware/docsite/vmware_scenarios/vmware_inventory_vm_attributes.html</a></li>
<li><a href="https://www.ansiblepilot.com/articles/how-to-install-ansible-in-ubuntu-22.04-ansible-install/" rel="nofollow">https://www.ansiblepilot.com/articles/how-to-install-ansible-in-ubuntu-22.04-ansible-install/</a>
<a href="https://github.com/vmware/vsphere-automation-sdk-python" rel="nofollow">https://github.com/vmware/vsphere-automation-sdk-python</a></li></ul>
]]></content:encoded>
      <guid>https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware-alterando-padrao-de-hostnames</guid>
      <pubDate>Sat, 22 Jul 2023 14:17:50 +0000</pubDate>
    </item>
    <item>
      <title>Certificados SSL - Gerando arquivo p12 usando openssl</title>
      <link>https://bolha.blog/ulysses-almeida/certificados-ssl-gerando-arquivo-p12-usando-openssl</link>
      <description>&lt;![CDATA[Resumo&#xA;Certificados SSL estão em nossos cotidianos. A forma mais comum de manipulá-los é com o trio chave privada, certificado assinado, cadeia de certificado da CA. Para simplificar, diversos sistemas preferem trabalhar com arquivos pkcs12 (.p12). Esse artigo mostra como gerar esses arquivos a partir do trio citado.&#xA;Requisitos&#xA;Possuir a chave privada do certificado (arquivo .key)&#xA;Possuir o certificado assinado pela Autoridade Certificadora (arquivo .crt ou .pem)&#xA;Possuir a cadeia de certificados das autoridades certificadoras (arquivo .crt ou .pem)&#xA;&#xA;Cenário usado&#xA;Para validar esse documento usei&#xA;&#xA;Ubuntu 22.04&#xA;openssl 3.0.2&#xA;Certificado wildcard Let&#39;s Encrypt obtido via certbot&#xA;&#xA;Usando openssl para gerar arquivo .p12&#xA;Nesse exemplo usei certificado fornecido pelo Let&#39;s Encrypt via certbot. Após uma solicitação bem sucedida do certificado, os arquivos ficam armazenados em /etc/letsencrypt/live/dominio.&#xA;&#xA;Caso use certificado obtido por outra Autoridade Certificadora, a ideia continua a mesma. Basta ter a chave gerada no momento da requisição (privkey.pem), o arquivo com o seu certificado assinado pela CA (cert.pem) e a cadeia de certificados intermediários da CA (chain.pem).&#xA;&#xA;Obs:  No diretório letsencrypt existem dois arquivos. chain e fullchain. Necessário usar o primeiro uma vez que o segundo possui, também, o certificado do servidor que está no cert.pem&#xA;&#xA;Para gerar um arquivo p12&#xA;$ openssl pkcs12 -export -out certificado.p12 -inkey privkey1.pem -in cert1.pem -certfile chain1.pem&#xA;Para gerar um arquivo p12 compatível com openssl 1.1.1&#xA;Houve uma atualização no formado do arquivo p12 da versão do openssl 1.1.1 para a versão do openssl 3. Caso use o openssl 3 para gerar o arquivo .p12 para ser usado em ambientes legados que ainda fazem uso do algoritmo antigo (ex. appliance checkpoint em 2023 ou oracle JRE &lt; 8u301), basta adicionar o parâmetro -legacy.&#xA;$ openssl pkcs12 -export -out certificado.p12 -inkey privkey1.pem -in cert1.pem -certfile chain1.pem -legacy&#xA;Para gerar um arquivo p12 compatível com Windows&#xA;Windows definitivamente não é meu forte. Posso estar falando besteira aqui. Mas pelo que entendi o Windows usa um algoritmo de cifragem específico. Para garantir que o openssl não use um algoritmo diferente, temos que foçá-lo a usar o PBE-SHA1-3DES para gerar um p12 compatível com servidores Windows.&#xA;$ openssl pkcs12 -export -certpbe PBE-SHA1-3DES -keypbe PBE-SHA1-3DES -nomac -out certificado.p12 -inkey privkey1.pem -in cert1.pem -certfile chain1.pem&#xA;&#xA;Referências&#xA;https://www.openssl.org/docs/man1.1.1/man1/pkcs12.html&#xA;https://www.misterpki.com/openssl-pkcs12-legacy/&#xA;https://learn.microsoft.com/en-us/answers/questions/995232/password-incorrect-when-import-certificate-on-serv?orderby=helpful]]&gt;</description>
      <content:encoded><![CDATA[<h2 id="resumo">Resumo</h2>

<p>Certificados SSL estão em nossos cotidianos. A forma mais comum de manipulá-los é com o trio <em>chave privada</em>, <em>certificado assinado</em>, <em>cadeia de certificado da CA</em>. Para simplificar, diversos sistemas preferem trabalhar com arquivos <em>pkcs12</em> (.p12). Esse artigo mostra como gerar esses arquivos a partir do trio citado.</p>

<h2 id="requisitos">Requisitos</h2>
<ul><li>Possuir a chave privada do certificado (arquivo .key)</li>
<li>Possuir o certificado assinado pela Autoridade Certificadora (arquivo .crt ou .pem)</li>
<li>Possuir a cadeia de certificados das autoridades certificadoras (arquivo .crt ou .pem)</li></ul>

<h2 id="cenário-usado">Cenário usado</h2>

<p>Para validar esse documento usei</p>
<ul><li>Ubuntu 22.04</li>
<li>openssl 3.0.2</li>
<li>Certificado wildcard Let&#39;s Encrypt obtido via certbot</li></ul>

<h2 id="usando-openssl-para-gerar-arquivo-p12">Usando openssl para gerar arquivo .p12</h2>

<p>Nesse exemplo usei certificado fornecido pelo Let&#39;s Encrypt via certbot. Após uma solicitação bem sucedida do certificado, os arquivos ficam armazenados em /etc/letsencrypt/live/.</p>

<p>Caso use certificado obtido por outra Autoridade Certificadora, a ideia continua a mesma. Basta ter a chave gerada no momento da requisição (privkey.pem), o arquivo com o seu certificado assinado pela CA (cert.pem) e a cadeia de certificados intermediários da CA (chain.pem).</p>

<p><em>Obs:  No diretório letsencrypt existem dois arquivos. chain e fullchain. Necessário usar o primeiro uma vez que o segundo possui, também, o certificado do servidor que está no cert.pem</em></p>

<h3 id="para-gerar-um-arquivo-p12">Para gerar um arquivo p12</h3>

<pre><code>$ openssl pkcs12 -export -out certificado.p12 -inkey privkey1.pem -in cert1.pem -certfile chain1.pem
</code></pre>

<h3 id="para-gerar-um-arquivo-p12-compatível-com-openssl-1-1-1">Para gerar um arquivo p12 compatível com openssl 1.1.1</h3>

<p>Houve uma atualização no formado do arquivo p12 da versão do openssl 1.1.1 para a versão do openssl 3. Caso use o openssl 3 para gerar o arquivo .p12 para ser usado em ambientes legados que ainda fazem uso do algoritmo antigo (ex. appliance checkpoint em 2023 ou oracle JRE &lt; 8u301), basta adicionar o parâmetro -legacy.</p>

<pre><code>$ openssl pkcs12 -export -out certificado.p12 -inkey privkey1.pem -in cert1.pem -certfile chain1.pem -legacy
</code></pre>

<h3 id="para-gerar-um-arquivo-p12-compatível-com-windows">Para gerar um arquivo p12 compatível com Windows</h3>

<p>Windows definitivamente não é meu forte. Posso estar falando besteira aqui. Mas pelo que entendi o Windows usa um algoritmo de cifragem específico. Para garantir que o openssl não use um algoritmo diferente, temos que foçá-lo a usar o PBE-SHA1-3DES para gerar um p12 compatível com servidores Windows.</p>

<pre><code>$ openssl pkcs12 -export -certpbe PBE-SHA1-3DES -keypbe PBE-SHA1-3DES -nomac -out certificado.p12 -inkey privkey1.pem -in cert1.pem -certfile chain1.pem
</code></pre>

<h2 id="referências">Referências</h2>

<p><a href="https://www.openssl.org/docs/man1.1.1/man1/pkcs12.html" rel="nofollow">https://www.openssl.org/docs/man1.1.1/man1/pkcs12.html</a>
<a href="https://www.misterpki.com/openssl-pkcs12-legacy/" rel="nofollow">https://www.misterpki.com/openssl-pkcs12-legacy/</a>
<a href="https://learn.microsoft.com/en-us/answers/questions/995232/password-incorrect-when-import-certificate-on-serv?orderby=helpful" rel="nofollow">https://learn.microsoft.com/en-us/answers/questions/995232/password-incorrect-when-import-certificate-on-serv?orderby=helpful</a></p>
]]></content:encoded>
      <guid>https://bolha.blog/ulysses-almeida/certificados-ssl-gerando-arquivo-p12-usando-openssl</guid>
      <pubDate>Fri, 14 Jul 2023 10:49:29 +0000</pubDate>
    </item>
    <item>
      <title>Ansible - inventario dinâmico VMWare</title>
      <link>https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware</link>
      <description>&lt;![CDATA[Resumo&#xA;Automação é extremamente necessário para tornar possível a infraestrutura de TI acompanhar o dinamismo das necessidades de seus usuários. Criar, configurar, alterar e remover novos servidores torna-se parte da rotina diária das operações de TI. Como efeito colateral, é mais fácil perder a rastreabilidade desses servidores. Manter um inventário atualizado começa a se tornar uma tarefa trabalhosa. Para quem usa Ansible e o monitor de máquinas virtuais (hypervisor) da VMWare, é possível manter seu inventário atualizado, de forma automática, através de um plugin de inventário dinâmico. O inventário sempre irá refletir as VMs existentes no vCenter. Nesse post falarei sobre como instalar, configurar e usar essa ferramenta..&#xA;&#xA;Requisitos&#xA;Possuir conhecimentos básicos de Ansible&#xA;Possuir conhecimentos básicos de vCenter da VMWare&#xA;&#xA;Cenário usado&#xA;Para validar essa postagem eu usei o seguinte ambiente:&#xA;&#xA;vCenter 6.7&#xA;Ubuntu 22.04 minimal&#xA;Ansible 2.14 (ppa)&#xA;&#xA;Instalando&#xA;Instalando o Ansible via apt no Ubuntu.&#xA;$ sudo apt update&#xA;$ sudo apt install software-properties-common&#xA;$ sudo add-apt-repository --yes --update ppa:ansible/ansible&#xA;$ sudo apt install ansible-core&#xA;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 &#xA;Instalando as bibliotecas adicionais para comunicação com vCenter.&#xA;$ sudo apt install pip&#xA;$ pip install pyvmomi&#xA;$ ansible-galaxy collection install community.vmware&#xA;&#xA;Configurando&#xA;Crie um arquivo inventory.vmware.yml com o seguinte conteúdo. Importante o arquivo finalizar com vmware.yml ou vmware.yaml. Caso não finalize dessa forma o filtro não será carregado.&#xA;---&#xA;plugin: community.vmware.vmwarevminventory&#xA;strict: false&#xA;hostname: fqdn ou ip do vcenter&#xA;username: usuario para acesso ao vcenter&#xA;password: senha do usuario para acesso ao vcenter&#xA;validatecerts: false&#xA;No meu ambiente de testes o vcenter usa um certificado auto-assinado. Se não for o seu caso, recomenda-se a remoção da última linha para que o certificado seja devidamente validado&#xA;&#xA;Testando&#xA;Para testar, liste os hosts com o seguinte comando&#xA;$ ansible-inventory -i inventory.vmware.yaml --graph&#xA;Esse comando irá listar todas as VMs existentes no vcenter.&#xA;@all:&#xA;  |--@ungrouped:&#xA;  |--@ubuntu64Guest:&#xA;  |  |--VM-k8dn-duzv42168141-84d3-4bd6-45c4-3b23bec5d81e&#xA;  |  |--VM-4spa-jh6g42163c5e-7eca-7d91-c740-58b3a2d74b8e&#xA;  |  |--zabbix-sandbox421695c6-a980-09af-d8ca-6a0dc712d9d1&#xA;  |  |--VM-2ztj-4ndb42162ab4-0d78-00e8-fd86-624bcff76392&#xA;  |  |--dhcp-sandbox42163f69-0b69-977c-80d8-0f9bf5437855&#xA;  |  |--VM-onsa-rlsp42168bdc-0096-b4b2-623c-cf6896cea3e8&#xA;  |--@poweredOn:&#xA;  |  |--VM-k8dn-duzv42168141-84d3-4bd6-45c4-3b23bec5d81e&#xA;  |  |--VM-4spa-jh6g42163c5e-7eca-7d91-c740-58b3a2d74b8e&#xA;  |  |--zabbix-sandbox421695c6-a980-09af-d8ca-6a0dc712d9d1&#xA;  |  |--VM-2ztj-4ndb42162ab4-0d78-00e8-fd86-624bcff76392&#xA;  |  |--dhcp-sandbox42163f69-0b69-977c-80d8-0f9bf5437855&#xA;  |  |--VM-onsa-rlsp42168bdc-0096-b4b2-623c-cf6896cea3e8&#xA;  |  |--radius4216b4ae-8277-3fd7-9ad2-260a9e83d756&#xA;  |--@windows9Server64Guest:&#xA;  |  |--radius4216b4ae-8277-3fd7-9ad2-260a9e83d756&#xA;Algumas informações importantes dessa saída, que é a padrão do plugin:&#xA;&#xA;Os nomes dos ativos listados é uma composição do nome da VM no vcenter concatenado com o uuid da VM, separados por um \.&#xA;As VMs são agrupadas pela família do sistema operacional e pelo estado da vm (Ligada ou desligada).&#xA;&#xA;A inventário listado acima seria o equivalente ao seguinte arquivo .ini&#xA;[ungrouped]&#xA;&#xA;[ubuntu64Guest]&#xA;VM-k8dn-duzv42168141-84d3-4bd6-45c4-3b23bec5d81e&#xA;VM-4spa-jh6g42163c5e-7eca-7d91-c740-58b3a2d74b8e&#xA;zabbix-sandbox421695c6-a980-09af-d8ca-6a0dc712d9d1&#xA;VM-2ztj-4ndb42162ab4-0d78-00e8-fd86-624bcff76392&#xA;dhcp-sandbox42163f69-0b69-977c-80d8-0f9bf5437855&#xA;VM-onsa-rlsp42168bdc-0096-b4b2-623c-cf6896cea3e8&#xA;&#xA;[poweredOn]&#xA;VM-k8dn-duzv42168141-84d3-4bd6-45c4-3b23bec5d81e&#xA;VM-4spa-jh6g42163c5e-7eca-7d91-c740-58b3a2d74b8e&#xA;zabbix-sandbox421695c6-a980-09af-d8ca-6a0dc712d9d1&#xA;VM-2ztj-4ndb42162ab4-0d78-00e8-fd86-624bcff76392&#xA;dhcp-sandbox42163f69-0b69-977c-80d8-0f9bf5437855&#xA;VM-onsa-rlsp42168bdc-0096-b4b2-623c-cf6896cea3e8&#xA;radius4216b4ae-8277-3fd7-9ad2-260a9e83d756&#xA;&#xA;[windows9Server64Guest]&#xA;radius4216b4ae-8277-3fd7-9ad2-260a9e83d756&#xA;&#xA;E no campo target do playbook é possível usar poweredOn ou ubuntu64Guest, ou mesmo ubuntu64Guest:&amp;poweredOn&#xA;---&#xA;name: Update ubuntu servers&#xA;  hosts: ubuntu64Guest&#xA;  remoteuser: root&#xA;&#xA;  tasks:&#xA;...&#xA;&#xA;Conclusão&#xA;Esse post mostra apenas como fazer a configuração inicial de um inventário dinâmico baseado no vCenter. Nos próximos posts será visto coisas bem mais divertidas como uso de filtros, tags, customização de informações e assim por diante. Todos os assuntos direcionados para a construção de uma esteira de entrega de máquinas virtuais baseada em configuração declarativa!&#xA;&#xA;Referências:&#xA;https://docs.ansible.com/ansible/latest/collections/community/vmware/docsite/vmwarescenarios/vmwareinventory.html&#xA;https://docs.ansible.com/ansible/latest/collections/community/vmware/vmwarevminventory_inventory.html&#xA;https://www.ansiblepilot.com/articles/how-to-install-ansible-in-ubuntu-22.04-ansible-install/&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<h2 id="resumo">Resumo</h2>

<p>Automação é extremamente necessário para tornar possível a infraestrutura de TI acompanhar o dinamismo das necessidades de seus usuários. Criar, configurar, alterar e remover novos servidores torna-se parte da rotina diária das operações de TI. Como efeito colateral, é mais fácil perder a <strong>rastreabilidade</strong> desses servidores. Manter um inventário atualizado começa a se tornar uma tarefa trabalhosa. Para quem usa Ansible e o monitor de máquinas virtuais (hypervisor) da VMWare, é possível manter seu inventário atualizado, de forma automática, através de um plugin de inventário dinâmico. O inventário sempre irá refletir as VMs existentes no vCenter. Nesse post falarei sobre como instalar, configurar e usar essa ferramenta..</p>

<h2 id="requisitos">Requisitos</h2>
<ul><li>Possuir conhecimentos básicos de Ansible</li>
<li>Possuir conhecimentos básicos de vCenter da VMWare</li></ul>

<h3 id="cenário-usado">Cenário usado</h3>

<p>Para validar essa postagem eu usei o seguinte ambiente:</p>
<ul><li>vCenter 6.7</li>
<li>Ubuntu 22.04 minimal</li>
<li>Ansible 2.14 (ppa)</li></ul>

<h2 id="instalando">Instalando</h2>

<h3 id="instalando-o-ansible-via-apt-no-ubuntu">Instalando o Ansible via apt no Ubuntu.</h3>

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

<p><em>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 <code>sudo apt remove ansible</code></em></p>

<h3 id="instalando-as-bibliotecas-adicionais-para-comunicação-com-vcenter">Instalando as bibliotecas adicionais para comunicação com vCenter.</h3>

<pre><code>$ sudo apt install pip
$ pip install pyvmomi
$ ansible-galaxy collection install community.vmware

</code></pre>

<h2 id="configurando">Configurando</h2>

<p>Crie um arquivo inventory.vmware.yml com o seguinte conteúdo. Importante o arquivo finalizar com <em>vmware.yml</em> ou <em>vmware.yaml</em>. Caso não finalize dessa forma o filtro não será carregado.</p>

<pre><code class="language-yaml">---
plugin: community.vmware.vmware_vm_inventory
strict: false
hostname: &lt;fqdn ou ip do vcenter&gt;
username: &lt;usuario para acesso ao vcenter&gt;
password: &lt;senha do usuario para acesso ao vcenter&gt;
validate_certs: false
</code></pre>

<p><em>No meu ambiente de testes o vcenter usa um certificado auto-assinado. Se não for o seu caso, recomenda-se a remoção da última linha para que o certificado seja devidamente validado</em></p>

<h2 id="testando">Testando</h2>

<p>Para testar, liste os hosts com o seguinte comando</p>

<pre><code>$ ansible-inventory -i inventory.vmware.yaml --graph
</code></pre>

<p>Esse comando irá listar todas as VMs existentes no vcenter.</p>

<pre><code>@all:
  |--@ungrouped:
  |--@ubuntu64Guest:
  |  |--VM-k8dn-duzv_42168141-84d3-4bd6-45c4-3b23bec5d81e
  |  |--VM-4spa-jh6g_42163c5e-7eca-7d91-c740-58b3a2d74b8e
  |  |--zabbix-sandbox_421695c6-a980-09af-d8ca-6a0dc712d9d1
  |  |--VM-2ztj-4ndb_42162ab4-0d78-00e8-fd86-624bcff76392
  |  |--dhcp-sandbox_42163f69-0b69-977c-80d8-0f9bf5437855
  |  |--VM-onsa-rlsp_42168bdc-0096-b4b2-623c-cf6896cea3e8
  |--@poweredOn:
  |  |--VM-k8dn-duzv_42168141-84d3-4bd6-45c4-3b23bec5d81e
  |  |--VM-4spa-jh6g_42163c5e-7eca-7d91-c740-58b3a2d74b8e
  |  |--zabbix-sandbox_421695c6-a980-09af-d8ca-6a0dc712d9d1
  |  |--VM-2ztj-4ndb_42162ab4-0d78-00e8-fd86-624bcff76392
  |  |--dhcp-sandbox_42163f69-0b69-977c-80d8-0f9bf5437855
  |  |--VM-onsa-rlsp_42168bdc-0096-b4b2-623c-cf6896cea3e8
  |  |--radius_4216b4ae-8277-3fd7-9ad2-260a9e83d756
  |--@windows9Server64Guest:
  |  |--radius_4216b4ae-8277-3fd7-9ad2-260a9e83d756
</code></pre>

<p>Algumas informações importantes dessa saída, que é a padrão do plugin:</p>
<ul><li>Os nomes dos ativos listados é uma composição do nome da VM no vcenter concatenado com o uuid da VM, separados por um _.</li>
<li>As VMs são agrupadas pela família do sistema operacional e pelo estado da vm (Ligada ou desligada).</li></ul>

<p>A inventário listado acima seria o equivalente ao seguinte arquivo .ini</p>

<pre><code>[ungrouped]

[ubuntu64Guest]
VM-k8dn-duzv_42168141-84d3-4bd6-45c4-3b23bec5d81e
VM-4spa-jh6g_42163c5e-7eca-7d91-c740-58b3a2d74b8e
zabbix-sandbox_421695c6-a980-09af-d8ca-6a0dc712d9d1
VM-2ztj-4ndb_42162ab4-0d78-00e8-fd86-624bcff76392
dhcp-sandbox_42163f69-0b69-977c-80d8-0f9bf5437855
VM-onsa-rlsp_42168bdc-0096-b4b2-623c-cf6896cea3e8

[poweredOn]
VM-k8dn-duzv_42168141-84d3-4bd6-45c4-3b23bec5d81e
VM-4spa-jh6g_42163c5e-7eca-7d91-c740-58b3a2d74b8e
zabbix-sandbox_421695c6-a980-09af-d8ca-6a0dc712d9d1
VM-2ztj-4ndb_42162ab4-0d78-00e8-fd86-624bcff76392
dhcp-sandbox_42163f69-0b69-977c-80d8-0f9bf5437855
VM-onsa-rlsp_42168bdc-0096-b4b2-623c-cf6896cea3e8
radius_4216b4ae-8277-3fd7-9ad2-260a9e83d756

[windows9Server64Guest]
radius_4216b4ae-8277-3fd7-9ad2-260a9e83d756
</code></pre>

<p>E no campo target do playbook é possível usar <em>poweredOn</em> ou <em>ubuntu64Guest</em>, ou mesmo <em>ubuntu64Guest:&amp;poweredOn</em></p>

<pre><code class="language-yaml">---
- name: Update ubuntu servers
  hosts: ubuntu64Guest
  remote_user: root

  tasks:
...
</code></pre>

<h2 id="conclusão">Conclusão</h2>

<p>Esse post mostra apenas como fazer a configuração inicial de um inventário dinâmico baseado no vCenter. Nos próximos posts será visto coisas bem mais divertidas como uso de filtros, tags, customização de informações e assim por diante. Todos os assuntos direcionados para a construção de uma <em>esteira de entrega</em> de máquinas virtuais baseada em configuração declarativa!</p>

<h2 id="referências">Referências:</h2>
<ul><li><a href="https://docs.ansible.com/ansible/latest/collections/community/vmware/docsite/vmware_scenarios/vmware_inventory.html" rel="nofollow">https://docs.ansible.com/ansible/latest/collections/community/vmware/docsite/vmware_scenarios/vmware_inventory.html</a></li>
<li><a href="https://docs.ansible.com/ansible/latest/collections/community/vmware/vmware_vm_inventory_inventory.html" rel="nofollow">https://docs.ansible.com/ansible/latest/collections/community/vmware/vmware_vm_inventory_inventory.html</a></li>
<li><a href="https://www.ansiblepilot.com/articles/how-to-install-ansible-in-ubuntu-22.04-ansible-install/" rel="nofollow">https://www.ansiblepilot.com/articles/how-to-install-ansible-in-ubuntu-22.04-ansible-install/</a></li></ul>
]]></content:encoded>
      <guid>https://bolha.blog/ulysses-almeida/ansible-inventario-dinamico-vmware</guid>
      <pubDate>Mon, 10 Jul 2023 10:42:20 +0000</pubDate>
    </item>
  </channel>
</rss>