Gerenciamento de Inventário de Hosts
1. Definição de Hosts
Os hosts podem ser definidos usando nomes de domínio, nomes de host ou endereços IP. É necessário que os hosts possam ser resolvidos para os respectivos endereços IP.
[root@master ansible]# cat hosts
servidor1
servidor2
dominio.com
192.168.50.10
# ansible all --list lista todos os hosts no inventário
[root@master ansible]# ansible all --list
hosts (4):
servidor1
servidor2
dominio.com
192.168.50.10
É possível especificar faixas de endereços:
[root@master ansible]# cat hosts
servidor1
servidor2
dominio.com
192.168.50.10
192.168.50.[11:15]
# Define os IPs de 11 a 15
[root@master ansible]# ansible all --list
hosts (9):
servidor1
servidor2
dominio.com
192.168.50.10
192.168.50.11
192.168.50.12
192.168.50.13
192.168.50.14
192.168.50.15
2. Definição de Grupos de Hosts
Grupos de hosts permitem gerenciar múltiplos hosts juntos usando [nome_do_grupo].
[root@master ansible]# cat hosts
servidor1
servidor2
[webserver]
s1
s2
# Ao listar, ainda são exibidos os hosts individuais
[root@master ansible]# ansible all --list
hosts (4):
servidor1
servidor2
s1
s2
Importante sobre a ordem de definição:
# Definindo um host s8 que pertencerá ao grupo webservers
[root@master ansible]# cat hosts
servidor1
servidor2
[webserver]
s1
s2
s8
[root@master ansible]# ansible webserver --list
hosts (3):
s1
s2
s8
# Se não quiser que pertença ao grupo, defina antes do grupo
[root@master ansible]# cat hosts
s8
servidor1
servidor2
[webserver]
s1
s2
[root@master ansible]# ansible webserver --list
hosts (2):
s1
s2
3. Aninhamento de Grupos de Hosts
Permite criar um grupo principal que contém subgrupos, útil para gerenciar servidores de diferentes ambientes.
[root@master ansible]# cat hosts
[webserver]
s1
s2
[bancodados]
s3
s4
[infraestrutura:children]
webserver
bancodados
[root@master ansible]# ansible infraestrutura --list
hosts (4):
s1
s2
s3
s4
4. Visualização de Hosts e Grupos
# Visualizar hosts de um grupo específico
[root@master ansible]# ansible webserver --list
hosts (2):
s1
s2
# Visualizar hosts que não pertencem a nenhum grupo
[root@master ansible]# ansible ungrouped --list
[WARNING]: No hosts matched, nothing to do
hosts (0):
5. Consultas com Caracteres Universais e Expressões Regulares
# Consultar hosts começando com 's'
[root@master ansible]# ansible s* --list
hosts (4):
s1
s2
s3
s4
Expressões regulares:
- "-^(e|t)" - A expressão regular deve começar com ~ para indicar correspondência regex
- É possível usar operadores de negação também
Prioridade de Arquivos de Configuração
A ordem de prioridade para os arquivos de configuração do Ansible é:
- Variáveis de ambiente
- Arquivo de configuração no diretório atual
- Arquivo .ansible.cfg no diretório home do usuário
- /etc/ansible/ansible.cfg
O processo é: procurar primeiro pelas variáveis de ambiente, se não existirem, procurar pelo arquivo ansible.cfg no diretório atual, depois pelo .ansible.cfg no diretório home do usuário, e finalmente pelo arquivo em /etc/ansible.
Detalhamento do Arquivo de Configuração Básica
1. Seções do Arquivo de Configuração
O arquivo de configuração possui 10 seções principais:
- [defaults] - Configurações gerais
- [inventory] - Configurações relacionadas ao inventário de hosts
- [privilege_escalation] - Configurações para elevação de privilégios
- [paramiko_connection] - Configurações para conexões antigas
- [ssh_connection] - Configurações para conexões usando OpenSSH
- [persistent_connection] - Configurações para conexões persistentes
- [accelerate] - Configurações para modo acelerado
- [selinux] - Configurações relacionadas ao SELinux
- [color] - Configurações de cores para saída de comandos
- [diff] - Configuração para mostrar diferenças durante a execução
2. Parâmetros Detalhados
[root@master ansible]# cat ansible.cfg
[defaults]
inventory = /etc/ansible/hosts # Caminho para o arquivo de inventário de hosts
ask_sudo_pass=false # Não solicitar senha ao usar sudo
ask_pass=false # Usar chave para conexão; true usaria senha
remote_user=devops # Usuário para gerenciar os nós remotos
deprecation_warnings=False # Desabilitar avisos de depreciação
host_key_checking=no # Não verificar chaves SSH, não precisa de known_hosts pré-configurado
log_path = /var/log/ansible.log # Caminho para o arquivo de log do Ansible
# Configurações de elevação de privilégios
[privilege_escalation]
become=true # Habilitar elevação de privilégios
become_method=sudo # Método de elevação, usando sudo
become_user=root # Usuário para o qual os privilégios são elevados
become_ask_pass=false # Não solicitar senha durante a elevação de privilégios
Configuração de um Usuário Comum para Gerenciar Nós Remotos
1. Criar um Usuário Comum e Configurar Elevação de Privilégios
Primeiro, crie um usuário 'devops' nos três nós (um nó principal e dois nós remotos), configure a elevação de privilégios e instale o Ansible.
# Criar usuário devops e configurar elevação de privilégios no nó principal
useradd devops
echo 123 | passwd --stdin devops
# Modificar arquivo sudoers
vim /etc/sudoers
# Configurar acesso sem senha para sudo
devops ALL=(ALL) NOPASSWD:ALL
# Instalar Ansible via pip
pip install ansible -i https://pypi.tuna.tsinghua.edu.cn/simple
# Criar usuário devops nos nós remotos usando Ansible
[root@master ansible]# ansible all -m shell -a "useradd devops && echo 123 | passwd --stdin devops" -u root -k
SSH password:
servidor1 | CHANGED | rc=0 >>
Changing password for user devops.
passwd: all authentication tokens updated successfully.
servidor2 | CHANGED | rc=0 >>
Changing password for user devops.
passwd: all authentication tokens updated successfully.
# Configurar elevação de privilégios nos nós remotos
[root@master ansible]# ansible all -m shell -a "echo 'devops ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers " -u root -k
SSH password:
servidor1 | CHANGED | rc=0 >>
servidor2 | CHANGED | rc=0 >>
# Os comandos acima usam Ansible para executar diretamente as tarefas, economizando tempo em comparação com a execução manual
Verificar se o usuário devops tem permissões root:
[devops@servidor1 ~]$ sudo -l
Matching Defaults entries for devops on servidor1:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin,
env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_TYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User devops may run the following commands on servidor1:
(ALL) NOPASSWD: ALL
2. Configurar Acesso SSH sem Senha do Nó Principal para os Nós Remotos
# Mudar para o usuário devops
ssh-keygen
# Copiar chave para outros nós
ssh-copy-id devops@servidor1
ssh-copy-id devops@servidor2
3. Criar Arquivos ansible.cfg e hosts
# Estes arquivos são criados pelo usuário devops
# Permissões são importantes
[devops@master ansible]$ ll
total 8
-rw-r--r--. 1 devops devops 240 Sep 5 15:54 ansible.cfg
-rw-r--r--. 1 devops devops 19 Sep 5 15:53 hosts
[devops@master ansible]$ cat ansible.cfg
[defaults]
inventory = ./hosts
ask_sudo_pass=false
ask_pass=false
remote_user=devops
deprecation_warnings=False
host_key_checking=no
[privilege_escalation]
become=true
become_method=sudo
become_user=root
become_ask_pass=false
[devops@master ansible]$ cat hosts
[servidores]
servidor1
servidor2
4. Verificar Gerenciamento de Nós Remotos por Usuário Comum
[devops@master ansible]$ ansible all -m ping
servidor1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
servidor2 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
Processo de Execução do Ansible
O processo de execução do Ansile segue estes passos:
- Carregar o arquivo de configuração (padrão: /etc/ansible/ansible.cfg)
- Localizar o arquivo de configuração de hosts correspondente
- Carregar o arquivo de módulo correspondente
- Gerar um arquivo Python temporário a partir do módulo ou comando
- Transferir o arquivo para o diretório .ansible/tmp/xxx/xxx.py no servidor remoto
- Conceder permissão de execução ao arquivo
- Executar o arquivo e retornar o resultado
- Remover o arquivo Python temporário