Leia em outras linguagens:
English, 日本語, Portugues do Brasil, Française, Español.
O Ansible pode usar condicionais para executar tasks ou plays quando determinadas condições forem atendidas.
Para implementar uma condicional, a instrução when
deve ser usada, seguida pela condição. A condição é expressa usando um dos operadores disponíveis, como por exemplo para comparação:
== | Compara se dois objetos são iguais. |
!= | Compara se dois objetos não são iguais. |
> | Verdadeiro se um objeto for maior que o outro. |
>= | Verdadeiro se um objeto for maior ou igual ao outro. |
< | Verdadeiro se um objeto for menor que o outro. |
< = | Verdadeiro se um objeto for menor ou igual ao outro. |
Para mais informações, consulte a documentação: http://jinja.pocoo.org/docs/2.10/templates/
Como exemplo, você gostaria de instalar um servidor FTP, apenas em hosts que estão no grupo de inventário "ftpserver".
Para fazer isso, edite primeiro o inventário para adicionar outro grupo e coloque o node2
nele. Certifique-se de que o endereço IP do node2
seja sempre o mesmo quando o node2
estiver listado. Edite o inventário ~/lab_inventory/hosts
, ele deve ficar semelhante a:
[all:vars]
ansible_user=student1
ansible_ssh_pass=ansible
ansible_port=22
[web]
node1 ansible_host=11.22.33.44
node2 ansible_host=22.33.44.55
node3 ansible_host=33.44.55.66
[ftpserver]
node2 ansible_host=22.33.44.55
[control]
ansible ansible_host=44.55.66.77
Depois, crie o arquivo ftpserver.yml
no seu host de controle no diretório ~/ansible-files/
:
---
- name: Instalar vsftpd no ftpserver
hosts: all
become: yes
tasks:
- name: Instalar servidor FTP quando host fizer parte do grupo ftpserver
yum:
name: vsftpd
state: latest
when: inventory_hostname in groups["ftpserver"]
Dica
Agora você já deve saber como executar um playbook do Ansible, por isso começaremos a ser menos detalhados neste guia. Crie o playbook e execute-o. :-)
Execute-o e examine a saída. O resultado esperado: a task é ignorada no node1, node3 e no host ansible (seu host de controle) porque eles não estão no grupo ftpserver no seu arquivo de inventário.
TASK [Instalar servidor FTP quando host fizer parte do grupo ftpserver] *******************************************
skipping: [ansible]
skipping: [node1]
skipping: [node3]
changed: [node2]
As vezes, quando uma task faz uma alteração no sistema, pode ser necessário executar uma task ou tasks adicionais. Por exemplo, uma alteração no arquivo de configuração de um serviço pode exigir que o serviço seja reiniciado para que a configuração alterada entre em vigor.
Aqui, os handlers entram em cena. Os handlers podem ser vistos como tasks inativas que só são acionadas quando invocadas explicitamente usando a instrução "notify". Leia mais sobre eles na documentação Ansible Handlers.
Como exemplo, vamos escrever um Playbook que:
-
Gerencia o arquivo de configuração do Apache
httpd.conf
em todos os hosts no grupoweb
. -
Reinicia o Apache quando o arquivo é alterado.
Primeiro, precisamos que o arquivo Ansible seja implantado, vamos pegar node1. Lembre-se de substituir o endereço IP mostrado na lista abaixo pelo endereço IP do seu node1
individual.
[student<X>@ansible ansible-files]$ scp 11.22.33.44:/etc/httpd/conf/httpd.conf ~/ansible-files/.
student<X>@11.22.33.44's password:
httpd.conf
Depois, crie o playbook httpd_conf.yml
. Verifique se você está no diretório ~/ansible-files
.
---
- name: Manage httpd.conf
hosts: web
become: yes
tasks:
- name: Copiar arquivo de configuracao do Apache
copy:
src: httpd.conf
dest: /etc/httpd/conf/
notify:
- restart_apache
handlers:
- name: restart_apache
service:
name: httpd
state: restarted
Então, o que há de novo aqui?
-
A seção "notify" chama o handler somente quando a task de cópia realmente altera o arquivo. Dessa forma, o serviço será reiniciado apenas se necessário - e não sempre que o playbook for executado.
-
A seção "handlers" define uma task que é executada apenas na notificação.
Execute o Playbook. Ainda não alteramos nada no arquivo, portanto, não deve haver linhas 'alteradas' na saída e o manipulador não deveria ter disparado.
- Agora mude a linha
Listen 80
no httpd.conf para:
Listen 8080
-
Execute o Playbook novamente. Agora a saída do Ansible deve ser muito mais interessante:
-
httpd.conf deve ter sido copiado.
-
O handler deve ter reiniciado o Apache.
-
O Apache agora deve escutar na porta 8080. Fácil o suficiente para verificar:
[student1@ansible ansible-files]$ curl http://22.33.44.55
curl: (7) Failed connect to 22.33.44.55:80; Connection refused
[student1@ansible ansible-files]$ curl http://22.33.44.55:8080
<body>
<h1>Esse eh um servidor web de producao, tenha cuidado!</h1>
</body>
Sinta-se livre para alterar o arquivo httpd.conf novamente e executar o Playbook.
Os loops nos permitem repetir a mesma task. Por exemplo, digamos que você queira criar vários usuários. Usando um loop, você pode fazer isso em uma única task. Os loops também podem iterar mais do que apenas listas básicas. Por exemplo, se você tiver uma lista de usuários com seu grupo de correspondência, o loop também poderá iterar sobre eles. Saiba mais sobre loops na documentação Ansible Loops.
Para mostrar o recurso de loops, geramos três novos usuários no node1
. Para isso, crie o arquivo loop_users.yml
em ~/ansible-files
no seu nó de controle com seu usuário student. Usaremos o módulo user
para gerar as contas de usuário.
---
- name: Garantir usuarios
hosts: node1
become: yes
tasks:
- name: Garantir a presenca de tres usuarios
user:
name: "{{ item }}"
state: present
loop:
- dev_user
- qa_user
- prod_user
Entenda o playbook e a saída:
-
Os nomes não são fornecidos diretamente ao módulo do usuário. Em vez disso, existe apenas uma variável chamada
{{ item }}
para o parâmetroname
. -
A palavra-chave
loop
lista os nomes de usuário reais. O{{ item }}
é substituido durante a execução real do Playbook. -
Durante a execução, a task é listada apenas uma vez, mas há três alterações listadas abaixo dela.
Como mencionado, os loops também podem estar sobre listas de hashes. Imagine que os usuários devam ser atribuídos a diferentes grupos adicionais:
- username: dev_user
groups: ftp
- username: qa_user
groups: ftp
- username: prod_user
groups: apache
O módulo user
possui o parâmetro opcional groups
para listar usuários adicionais. Para referenciar itens em um hash, a palavra-chave {{ item }}
precisa fazer referência à subchave: {{ item.groups }}
por exemplo.
Vamos reescrever o Playbook para criar os usuários com direitos adicionais:
---
- name: Garantir usuarios
hosts: node1
become: yes
tasks:
- name: Garantir a presenca de tres usuarios
user:
name: "{{ item.username }}"
state: present
groups: "{{ item.groups }}"
loop:
- { username: 'dev_user', groups: 'ftp' }
- { username: 'qa_user', groups: 'ftp' }
- { username: 'prod_user', groups: 'apache' }
Verifique a saída:
- Novamente, a task é listada uma vez, mas três alterações são listadas. Cada loop com seu conteúdo é mostrado.
Verifique se o usuário prod_user
foi realmente criado no node1
:
[student<X>@ansible ansible-files]$ ansible node1 -m command -a "id dev_user"
node1 | CHANGED | rc=0 >>
uid=1002(dev_user) gid=1002(dev_user) Gruppen=1002(dev_user),50(ftp)
Clique aqui para retornar ao Workshop Ansible for Red Hat Enterprise Linux