Tutorial Ansible para iniciantes: manual, comandos e exemplo

O que รฉ Ansible?

Ansible รฉ uma ferramenta de automaรงรฃo e orquestraรงรฃo de cรณdigo aberto para provisionamento de software, gerenciamento de configuraรงรฃo e implantaรงรฃo de software. O Ansible pode executar e configurar facilmente sistemas do tipo Unix, bem como Windows sistemas para fornecer infraestrutura como cรณdigo. Ele contรฉm sua prรณpria linguagem de programaรงรฃo declarativa para configuraรงรฃo e gerenciamento do sistema.

O Ansible รฉ popular pela sua simplicidade de instalaรงรฃo, facilidade de uso no que diz respeito ร  conectividade com os clientes, pela falta de agente para clientes Ansible e pela infinidade de habilidades. Funciona conectando-se via SSH para os clientes, portanto, nรฃo precisa de um agente especial no lado do cliente e, ao enviar mรณdulos para os clientes, os mรณdulos sรฃo executados localmente no lado do cliente e a saรญda รฉ enviada de volta para o servidor Ansible.

Por usar SSH, pode facilmente conectar-se a clientes usando chaves SSH, simplificando todo o processo. Os detalhes do cliente, como nomes de host ou endereรงos IP e portas SSH, sรฃo armazenados em arquivos chamados arquivos de inventรกrio. Depois de criar um arquivo de inventรกrio e preenchรช-lo, o ansible poderรก usรก-lo.

Por que usar o Ansible?

Aqui estรฃo alguns prรณs/benefรญcios importantes de usar Ansible

  • Uma das vantagens mais significativas do Ansible รฉ que ele รฉ gratuito para uso por todos.
  • Nรฃo sรฃo necessรกrias habilidades especiais de administrador de sistema para instalar e usar o Ansible, e a documentaรงรฃo oficial รฉ muito abrangente.
  • Sua modularidade em relaรงรฃo a plugins, mรณdulos, inventรกrios e playbooks fazem do Ansible o companheiro perfeito para orquestrar grandes ambientes.
  • O Ansible รฉ muito leve e consistente e nรฃo hรก restriรงรตes em relaรงรฃo ao sistema operacional ou ao hardware subjacente.
  • Tambรฉm รฉ muito seguro devido aos seus recursos sem agente e ao uso de recursos de seguranรงa OpenSSH.
  • Outra vantagem que incentiva a adoรงรฃo do Ansible รฉ sua curva de aprendizado suave determinada pela documentaรงรฃo abrangente e estrutura e configuraรงรฃo fรกceis de aprender.

Histรณria do Ansible

Aqui estรฃo marcos importantes da histรณria do ansible:

  • Em fevereiro de 2012 teve inรญcio o projeto Ansible. Foi desenvolvido pela primeira vez por Michael DeHaan, o criador do Cobbler e Func, Fedora Unified Network Controller.
  • Inicialmente chamada de AnsibleWorks Inc, a empresa que financia a ferramenta ansible foi adquirida em 2015 pela RedHat e mais tarde, junto com a RedHat, passou sob a รฉgide de IBM.
  • Atualmente o Ansible vem incluรญdo em distribuiรงรตes como Fedora Linux, RHEL, Centos e Oracle Linux.

Termos importantes usados โ€‹โ€‹no Ansible

  • Servidor Ansible

    A mรกquina onde o Ansible estรก instalado e a partir da qual todas as tarefas e playbooks serรฃo executados

  • Mรณdulo

    Basicamente, um mรณdulo รฉ um comando ou conjunto de comandos Ansible semelhantes destinados a serem executados no lado do cliente

  • Tarefa

    Uma tarefa รฉ uma seรงรฃo que consiste em um รบnico procedimento a ser concluรญdo

  • Tipo

    Uma forma de organizar tarefas e arquivos relacionados para serem posteriormente chamados em um playbook

  • Fato

    Informaรงรตes obtidas do sistema cliente a partir das variรกveis โ€‹โ€‹globais com a operaรงรฃo de coleta de fatos

  • Estoque

    Arquivo contendo dados sobre os servidores clientes ansible. Definido em exemplos posteriores como arquivo hosts

  • Jogar

    Execuรงรฃo de um manual

  • Treinador

    Tarefa que รฉ chamada apenas se um notificador estiver presente

  • Notifier

    Seรงรฃo atribuรญda a uma tarefa que chama um manipulador se a saรญda for alterada

  • etiqueta

    Nome definido para uma tarefa que pode ser usada posteriormente para emitir apenas aquela tarefa especรญfica ou grupo de tarefas.

Instalaรงรฃo Ansible no Linux

Depois de comparar e pesar suas opรงรตes e decidir pelo Ansible, o prรณximo passo รฉ instalรก-lo em seu sistema. Seguiremos as etapas de instalaรงรฃo em diferentes Linux distribuiรงรตes, as mais populares, no prรณximo pequeno tutorial.

Instale Ansible em sistemas Centos/RedHat

Passo 1) Instale o repositรณrio EPEL

[root@ansible-server ~]# sudo yum install epel-release

Passo 2) Instale o pacote ansible

[root@ansible-server ~]# sudo  yum install -y ansible

Instale Ansible em sistemas Centos/RedHat

Instale o ansible em Ubuntu/Sistemas Debian

Passo 1) Execute uma atualizaรงรฃo nos pacotes

$ sudo apt update

Passo 2) Instale o pacote software-properties-common

$ sudo apt install software-properties-common

Passo 3) Instale o arquivo de pacotes pessoais ansible

$ sudo apt-add-repository ppa:ansible/ansible

Passo 4) Instalar ansible

$ sudo apt update
$ sudo apt install ansible

Comandos ad hoc Ansible

Uma das maneiras mais simples de usar o Ansible รฉ usando comandos ad-hoc. Eles podem ser usados โ€‹โ€‹quando vocรช deseja emitir alguns comandos em um servidor ou em vรกrios servidores. Os comandos ad-hoc nรฃo sรฃo armazenados para usos futuros, mas representam uma maneira rรกpida de interagir com os servidores desejados.

Para este tutorial do Ansible, um arquivo simples de hosts de dois servidores serรก configurado, contendo host1 e host2.

Vocรช pode ter certeza de que os hosts estรฃo acessรญveis no servidor ansible emitindo um comando ping em todos os hosts.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping
host1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Comandos ad hoc Ansible

Explicaรงรฃo:

  1. Status do comando, neste caso, SUCCESS
  2. Host no qual o comando foi executado
  3. O comando emitido atravรฉs do parรขmetro -m, neste caso, ping
  4. Com o parรขmetro -i, vocรช pode apontar para o arquivo hosts.


Vocรช pode emitir o mesmo comando somente em um host especรญfico, se necessรกrio.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Comandos ad hoc Ansible

Explicaรงรฃo:

  1. O parรขmetro limite pode ser usado para emitir comandos apenas em hosts especรญficos no arquivo do host
  2. Nome do host conforme definido no arquivo de inventรกrio

Se precisar copiar um arquivo para vรกrios destinos rapidamente, vocรช pode usar o mรณdulo de cรณpia em ansible que usa SCP. Portanto, o comando e sua saรญda ficam assim:

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"
host1 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.43-256741011164877/source",
    "state": "file",
    "uid": 0
}
host2 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.6-280302911361278/source",
    "state": "file",
    "uid": 0
}

Comandos ad hoc Ansible

Explicaรงรฃo:

  1. Mรณdulo de cรณpia definido
  2. Os argumentos do mรณdulo, neste caso, sรฃo o caminho absoluto de origem e o caminho absoluto de destino.
  3. Saรญda do comando Ansible refletindo o sucesso do comando de cรณpia e outros detalhes, como somas de verificaรงรฃo sha1 ou md5 para verificaรงรฃo de integridade de arquivo e metadados como proprietรกrio, tamanho ou permissรตes. Ansible possui vรกrios mรณdulos que interagem com instaladores usados, como yum, apt, dnf, etc.

No prรณximo exemplo, vocรช descobrirรก como instalar um pacote atravรฉs do mรณdulo yum em dois hosts Centos.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [


"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.xservers.ro\n * epel: fedora.mirrors.telekom.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: remi.schlundtech.de\n * remi-safe: remi.schlundtech.de\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version                Repository       Size\n================================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.leadhosts.com\n * epel: mirrors.nav.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: mirrors.uni-ruse.bg\n * remi-safe: mirrors.uni-ruse.bg\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version                Repository       Size\n================================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Comandos ad hoc Ansible

Explicaรงรฃo:

  1. O mรณdulo Yum รฉ usado neste exemplo
  2. Ele define os argumentos do mรณdulo e, neste caso, vocรช escolherรก o nome do pacote e seu estado. Se o estado estiver ausente, por exemplo, o pacote serรก pesquisado e se encontrado, removido
  3. Quando colorido em amarelo, vocรช verรก a saรญda do comando ansible com o estado alterado, ou seja, neste caso, que o pacote foi encontrado e instalado.
  4. Status do comando yum install emitido via ansible. Neste caso o pacote ncdu.x86_64 0:1.14-1.el7 foi instalado.

Claro, todas as opรงรตes do instalador do yum podem ser usadas via ansible, incluindo atualizaรงรฃo, instalaรงรฃo, versรฃo mais recente ou remoรงรฃo.

No exemplo abaixo, o mesmo comando foi emitido para remover o pacote ncdu instalado anteriormente.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version               Repository        Size\n================================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n================================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version               Repository        Size\n================================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n================================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Comandos ad hoc Ansible

Explicaรงรฃo:

  1. A saรญda do comando yum mostra que o pacote foi removido.

Outro recurso รบtil e essencial que o ansible utiliza para interagir com o servidor do cliente รฉ reunir alguns fatos sobre o sistema. Assim, ele busca informaรงรตes de hardware, software e versionamento do sistema e armazena cada valor em uma variรกvel que pode ser usada posteriormente.

Se vocรช precisar de informaรงรตes detalhadas sobre os sistemas a serem modificados via ansible, o prรณximo comando pode ser usado. O mรณdulo de configuraรงรฃo reรบne fatos das variรกveis โ€‹โ€‹do sistema.

Comandos ad hoc Ansible

Manuais Ansible

Manuais Ansible sรฃo a forma de enviar comandos para sistemas remotos por meio de scripts. Os playbooks Ansible sรฃo usados โ€‹โ€‹para configurar ambientes de sistemas complexos para aumentar a flexibilidade executando um script em um ou mais sistemas. Os playbooks do Ansible tendem a ser mais uma linguagem de configuraรงรฃo do que uma linguagem de programaรงรฃo.

Os comandos do playbook Ansible usam o formato YAML, portanto, nรฃo hรก muita sintaxe necessรกria, mas o recuo deve ser respeitado. Como o nome diz, um manual รฉ uma coleรงรฃo de peรงas. Atravรฉs de um playbook, vocรช pode designar funรงรตes especรญficas para alguns hosts e outras funรงรตes para outros hosts. Ao fazer isso, vocรช pode orquestrar vรกrios servidores em cenรกrios muito diversos, tudo em um รบnico manual.

Para ter todos os detalhes precisos antes de continuar com os exemplos do manual Ansible, devemos primeiro definir uma tarefa. Estas sรฃo a interface para mรณdulos ansible para funรงรตes e manuais.

Agora, vamos aprender o manual do Ansible por meio de um exemplo com um manual com uma peรงa, contendo vรกrias tarefas conforme abaixo:

---

- hosts: group1
  tasks:
  - name: Install lldpad package
    yum:
      name: lldpad
      state: latest
  - name: check lldpad service status
    service:
      name: lldpad
      state: started

Manuais Ansible

No exemplo do manual Ansible acima, o grupo1 de hosts no arquivo do host รฉ direcionado para instalaรงรฃo do pacote lldpad usando o mรณdulo yum e posteriormente o serviรงo lldpad criado apรณs a instalaรงรฃo รฉ iniciado usando o mรณdulo de serviรงo usado principalmente para interagir com o conjunto systemd.

Explicaรงรฃo:

  1. Grupo de hosts nos quais o playbook serรก executado
  2. O mรณdulo Yum รฉ usado nesta tarefa para instalaรงรฃo do lldpad
  3. O mรณdulo de serviรงo รฉ usado para verificar se o serviรงo estรก funcionando apรณs a instalaรงรฃo

Cada playbook ansible funciona com um arquivo de inventรกrio. O arquivo de inventรกrio contรฉm uma lista de servidores divididos em grupos para melhor controle de detalhes como Endereรงo IP e porta SSH para cada host.

O arquivo de inventรกrio que vocรช pode usar para este exemplo de manual do Ansible รฉ semelhante ao abaixo. Existem dois grupos, denominados group1 e group2, cada um contendo host1 e host2 respectivamente.

[group1]
host1 ansible_host=192.168.100.2 ansible_ssh_port=22
[group2]
host2 ansible_host=192.168.100.3 ansible_ssh_port=22

Manuais Ansible

Explicaรงรฃo:

  1. Nome do grupo
  2. Hostname, com endereรงo IP e porta ssh, neste caso, o padrรฃo, 22.

Outro exemplo รบtil do manual Ansible contendo, desta vez, duas jogadas para dois hosts รฉ o prรณximo. Para o primeiro grupo de hosts, grupo1, o selinux estarรก habilitado. Se estiver habilitado, uma mensagem aparecerรก na tela do host.

Para o segundo grupo de hosts, o pacote httpd serรก instalado somente se ansible_os_family for RedHat e ansible_system_vendor for HP.

Ansible_os_family e ansible_system_vendor sรฃo variรกveis โ€‹โ€‹reunidas com a opรงรฃo Gather_facts e podem ser usadas como neste exemplo condicional.

---

- hosts: group1
  tasks:
  - name: Enable SELinux
    selinux:
      state: enabled
    when: ansible_os_family == 'Debian'
    register: enable_selinux

  - debug:
      Imsg: "Selinux Enabled. Please restart the server to apply changes."
    when: enable_selinux.changed == true

- hosts: group2
  tasks:
  - name: Install apache
    yum:
      name: httpd
      state: present
    when: ansible_system_vendor == 'HP' and ansible_os_family == 'RedHat'

Manuais Ansible

Explicaรงรฃo:

  1. Exemplo da clรกusula quando, neste caso, o tipo de sistema operacional รฉ Debian. A variรกvel ansible_os_family รฉ coletada por meio da funcionalidade Gather_facts.
  2. A saรญda da tarefa รฉ registrada para uso futuro, com o nome enable_selinux
  3. Outro exemplo da clรกusula quando. Neste caso, uma mensagem serรก exibida para o usuรกrio host se o SELinux jรก estiver habilitado antes.
  4. Outro exemplo da clรกusula when que consiste em duas regras

Alรฉm das tarefas, existem tambรฉm algumas tarefas especรญficas chamadas manipuladores. Os manipuladores devem ter um nome exclusivo em todo o playbook. Elas funcionam da mesma maneira que uma tarefa normal, mas um manipulador pode ser notificado por meio de um notificador.

Se um manipulador nรฃo for notificado durante a execuรงรฃo do manual, ele nรฃo serรก executado. No entanto, se mais de uma tarefa notificar um manipulador, este serรก executado apenas uma vez apรณs todas as tarefas serem concluรญdas.

No exemplo mostrado abaixo, vocรช pode ver como uma tarefa especรญfica possui uma seรงรฃo de notificaรงรฃo que chama outra tarefa. Se a saรญda da primeira tarefa for alterada, uma tarefa manipuladora serรก chamada. O melhor exemplo รฉ alterar um arquivo de configuraรงรฃo e depois reiniciar esse serviรงo especรญfico.

---

- hosts: group2
  tasks:
  - name: sshd config file modify port
    lineinfile:
     path: /etc/ssh/sshd_config
     regexp: 'Port 28675'
     line: '#Port 22'
    notify:
       - restart sshd
handlers
    - name: restart sshd
      service: sshd
        name: sshd
        state: restarted

Neste caso, se a primeira tarefa, โ€œporta de modificaรงรฃo do arquivo de configuraรงรฃo sshdโ€ for alterada, o que significa que se a porta nรฃo for 28675 em primeiro lugar, ela serรก modificada e a tarefa notificarรก o manipulador com o mesmo nome para executar e reiniciarรก o serviรงo sshd.

Manuais Ansible

Explicaรงรฃo:

  1. Exemplo de um notificador
  2. Exemplo de um manipulador

Funรงรตes Ansible

Ao lidar com manuais extensos, รฉ mais fรกcil dividir as tarefas em funรงรตes. Isso tambรฉm ajuda na reutilizaรงรฃo das funรงรตes no futuro. As funรงรตes sรฃo uma coleรงรฃo de tarefas, que podem ser movidas de um playbook para outro, podem ser executadas de forma independente, mas apenas por meio de um arquivo de playbook.

As funรงรตes sรฃo armazenadas em diretรณrios separados e possuem uma estrutura de diretรณrio especรญfica.

[root@ansible-server test2]# tree
.
`-- role1
    |-- defaults
    |   `-- main.yml
    |-- handlers
    |   `-- main.yml
    |-- meta
    |   `-- main.yml
    |-- README.md
    |-- tasks
    |   `-- main.yml
    |-- tests
    |   |-- inventory
    |   `-- test.yml
    `-- vars
        `-- main.yml

7 directories, 8 files

O arquivo yaml no diretรณrio defaults contรฉm uma lista de variรกveis โ€‹โ€‹padrรฃo que devem ser usadas junto com o playbook. O diretรณrio handlers รฉ usado para armazenar manipuladores. O metadiretรณrio deve conter informaรงรตes sobre o autor e as dependรชncias de funรงรฃo. No diretรณrio de tarefas, estรก o arquivo yaml principal da funรงรฃo.

O diretรณrio de testes contรฉm um arquivo de playbook yaml de amostra e um arquivo de inventรกrio de amostra e รฉ usado principalmente para fins de teste antes de criar a funรงรฃo real.

O diretรณrio vars contรฉm o arquivo yaml no qual serรฃo definidas todas as variรกveis โ€‹โ€‹utilizadas pela funรงรฃo. Os modelos de diretรณrio e os arquivos de diretรณrio devem conter arquivos e modelos que serรฃo usados โ€‹โ€‹pelas tarefas na funรงรฃo.

Para criar a รกrvore de diretรณrios para uma funรงรฃo, vocรช deve usar o seguinte comando com o รบltimo parรขmetro, o nome da funรงรฃo:

[root@ansible-server test2]# ansible-galaxy init role1

Ansible tambรฉm funciona bem com modelos. Como linguagem de modelagem, ele usa Jinja2.

No prรณximo exemplo, vocรช descobrirรก a aparรชncia de um modelo jinja2 bรกsico e o usarรก em uma funรงรฃo.

No tempo de execuรงรฃo, dependendo, digamos, em qual datacenter seu servidor estรก localizado, vocรช pode selecionar entre mais de um nameserver, cada um correspondendo a um datacenter, usando a variรกvel โ€œresolver_ip_addressesโ€.

{% for resolver in resolver_ip_addresses %}
nameserver {{ resolver }}
{% endfor %}

options timeout:1
options attempts:5
options rotate

Neste exemplo, no diretรณrio do playbook, estรฃo definidas algumas variรกveis, incluindo uma variรกvel chamada resolver_ip_addresses com valores diferentes dependendo do datacenter.

- name: Set resolver for server
  template:
    src: dns.j2
    dest: /etc/resolv.conf
    group: root
    owner: root
    mode: "0644"
    tag: resolver	

Funรงรตes Ansible

Explicaรงรฃo:

  1. Nome do modelo a ser usado. O modelo estรก localizado no diretรณrio de modelos no caminho da funรงรฃo
  2. Caminho de destino do nome do arquivo a ser substituรญdo pelo modelo, no lado do cliente.
  3. Permissรตes do arquivo de destino

As tarefas de funรงรตes tambรฉm podem ter um campo tag, que possui um nome atribuรญdo. Mais de uma tarefa pode compartilhar a mesma tag. Ao executar um playbook ansible, vocรช tambรฉm pode especificar a tag, para que essas tarefas sejam executadas.

Estudo de caso Ansible

Nesta seรงรฃo, analisaremos um estudo de caso de um playbook essencial do ansible que possui trรชs funรงรตes. O objetivo disso รฉ dar um exemplo prรกtico do que falamos antes. Alguns dos exemplos usados โ€‹โ€‹anteriormente neste tutorial do manual Ansible serรฃo adaptados e usados โ€‹โ€‹neste manual.

Abaixo estรก a estrutura de diretรณrios do manual. O arquivo Yaml que serรก utilizado serรก p4.yml.

[root@ansible-server test_ansible]# ls -lrth
total 16K
-rw-r--r--. 1 root root   0 Jul  3 10:13 testfile
-rw-r--r--. 1 root root 203 Jul  3 13:30 p1.yml
-rw-r--r--. 1 root root 125 Jul  3 15:00 hosts
-rw-r--r--. 1 root root 488 Jul  3 16:40 p2.yml
-rw-r--r--. 1 root root 188 Jul  4 17:33 p4.yml
drwxr-xr-x. 5 root root  47 Jul  4 17:35 roles
[root@ansible-server test_ansible]# cd roles
[root@ansible-server roles]# ls -lrth
total 12K
drwxr-xr-x. 9 root root 4.0K Jul  4 12:52 httpd
drwxr-xr-x. 9 root root 4.0K Jul  4 13:55 selinux
drwxr-xr-x. 9 root root 4.0K Jul  4 16:54 resolver

O playbook tem trรชs funรงรตes, uma chamada resolvedor que define um servidor de nomes especรญfico nos servidores, copiando um arquivo do servidor para o destino /etc/resolv.conf. Outro se chama httpd e instala o pacote httpd com mรณdulo yum, e o terceiro habilita o SELinux e notifica o usuรกrio logado para reinicializar o sistema. Cada funรงรฃo foi criada usando o comando ansible-galaxy.

Funรงรฃo do resolvedor, tarefa main.yml:

Estudo de caso Ansible

Funรงรฃo HTTP, tarefa main.yml:

Estudo de caso Ansible

Funรงรฃo Selinux, tarefa main.yml:

Estudo de caso Ansible

Abaixo estรก o manual p4.yml definido. Ele serรก executado em todos os hosts, se nรฃo for especificado de outra forma na linha de comando, serรก executado como usuรกrio root na porta 22 (SSH), coletarรก fatos antes de executar as funรงรตes e executarรก todas as trรชs funรงรตes mencionadas anteriormente. Cada funรงรฃo pode ser executada de forma independente, especificando a tag na linha de comando do ansible-playbook com o parรขmetro โ€“t.

---

- hosts: all
  user: root
  port: 22
  gather_facts: True
  roles:
    - { role: selinux, tags: selinux }
    - { role: httpd, tags: httpd }
    - { role: resolver, tags: resolver }

Executando o playbook p4.yml em dois hosts e interpretando a saรญda. O mesmo comando pode ser executado com o parรขmetro โ€“check para uma simulaรงรฃo. Caso queira usar autenticaรงรฃo por senha, use o parรขmetro -k.

Estudo de caso Ansible

Explicaรงรฃo:

  1. Comando Ansible-playbook que executa p4.yml
  2. O Playbook ignora a funรงรฃo SELinux porque jรก estรก habilitado.
  3. Ansible descobriu que o pacote httpd jรก estรก instalado, entรฃo ele retorna ok.
  4. O resolvedor foi definido e o resolvedor de funรงรฃo teve o status alterado.

Folha de referรชncias dos comandos Ansible

Instale o repositรณrio EPEL em sistemas Centos/RHEL

[root@ansible-server ~]# sudo yum install epel-release

Instale o pacote ansible em sistemas Centos/RHEL

[root@ansible-server ~]# sudo  yum install -y ansible

Execute uma atualizaรงรฃo nos pacotes no Debian/Ubuntu sistemas

$ sudo apt update

Instale o pacote software-properties-common no Debian/Ubuntu sistemas

$ sudo apt install software-properties-common

Instalar o arquivo de pacotes pessoais do Ansible no Debian/Ubuntu sistemas

$ sudo apt-add-repository ppa:ansible/ansible

Instale o ansible no Debian/Ubuntu sistemas

$ sudo apt update
$ sudo apt install ansible

Emita um comando ping em todos os servidores definidos no arquivo de inventรกrio denominado hosts

 
[root@ansible-server test_ansible]# ansible -i hosts all -m ping

Emita um comando ping apenas no host2

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2

Copie o arquivo โ€œtestfileโ€ em todos os hosts no arquivo de inventรกrio

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"

Instale o pacote ncdu em todos os hosts

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'

Remova o pacote ncdu em todos os hosts

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'

Construa a estrutura de diretรณrios para a funรงรฃo denominada role1.

[root@ansible-server test2]# ansible-galaxy init role1

Manual p4.yml de simulaรงรฃo

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml --check

Execute o playbook p4.yml com autenticaรงรฃo por senha para todos os hosts

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml -k

Resumo

Em um mundo com tecnologia que muda continuamente em um ritmo rรกpido e cresce incrivelmente rรกpido ao mesmo tempo, os administradores de sistemas e engenheiros de devops devem pensar em diferentes abordagens sobre como automatizar tarefas rotineiras e orquestrar grandes conjuntos de servidores.

Embora existam muitos alternativa ao Ansible (Chef, Puppet) que fazem a mesma coisa com algumas diferenรงas, o Ansible conseguiu superar todos eles com sua simplicidade, seguranรงa aprimorada e, o mais importante, sua curva de aprendizado suave. Devido a essas qualidades e ร  rรกpida adoรงรฃo do Ansible, criamos um tutorial cheio de exemplos para que vocรช tenha uma primeira experiรชncia ainda mais integrada ao trabalhar com o Ansible.

Neste tutorial bรกsico do Ansible, descrevemos o ansible e falamos um pouco sobre sua histรณria. Mencionamos os pontos fortes do Ansible e as vantagens que o ansible pode trazer para a automaรงรฃo e orquestraรงรฃo de infraestruturas de diversos portes. Definimos os termos essenciais usados โ€‹โ€‹pelo Ansible e definimos a estrutura dos playbooks do Ansible. Exemplos completos acompanharam todas as informaรงรตes com explicaรงรตes detalhadas.

Resuma esta postagem com: