Configuração Básica do Ansible

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 é:

  1. Variáveis de ambiente
  2. Arquivo de configuração no diretório atual
  3. Arquivo .ansible.cfg no diretório home do usuário
  4. /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:

  1. Carregar o arquivo de configuração (padrão: /etc/ansible/ansible.cfg)
  2. Localizar o arquivo de configuração de hosts correspondente
  3. Carregar o arquivo de módulo correspondente
  4. Gerar um arquivo Python temporário a partir do módulo ou comando
  5. Transferir o arquivo para o diretório .ansible/tmp/xxx/xxx.py no servidor remoto
  6. Conceder permissão de execução ao arquivo
  7. Executar o arquivo e retornar o resultado
  8. Remover o arquivo Python temporário

Tags: Ansible Automação configuracao Gerenciamento de Servidores SSH

Publicado em 7-15 09:36