Treinamento
Ansible 101
Instrutor
- Kaleb Alves, 22 anos
- Fã e contribuidor do Open Source
- Fã de teoria das categorias, DSP, Tolkien, cyberpunk
- John Cena me segue no Twitter
@forgondolin
@kalves_rohan
Sumário
- Introdução rápida
- Setup do ambiente (https://www.osboxes.org/centos/)
- Inventário do Ansible
- YAML
- Playbooks
- Modules
- Variáveis (env.)
- Loops e condições
- Roles
- Tópicos avançados
O que é o Ansible
- Uma forma mais simples de "subir" seus ambientes
- Software aberto de colaboração
- Ferramenta poderosa de automatização
Introdução rápida
Michael DeHaan
Instalando as VM's, e o ansible
- CentOS 7
- MobaXterm ou Putty...
- Configurações iniciais
Setup do Ambiente
comandos úteis: ifconfig vi /etc/hostname vi /etc/hosts sudo shutdown now -r sudo yum install ansible *(sudo yum install epel-release sudo yum repolist)
Primeira vantagem do Ansible aí
- Não precisa de agente nos workers
- SSH no Linux, powershell no windows
- informações ficam no inventory file
Inventário
comandos úteis: ansible 'target' -m ping -i inventory.txt
*Desativar o host_key_checking no /etc/ansible/ansible.cfg
Configurando o inventory.txt
Inventário
Podemos passar formatos diferentes para nossas conexões
(parâmetros)
db ansible_host=servidor1.dxc.com ansible_connection = ssh
web ansible_host=servidor2.dxc.com ansible_connection = winrm
ldap ansible_host=servidor3.dxc.com ansible_connection = ssh
ansible_port - 3031 ansible_user - root/adm ansible_ssh_pass - senha
yml/xml/json
YAML
Servers:
- name: server1
owner: dxc
created: 20200101
status: ativo
{
"Servers": [
{
"name": "server1",
"owner": "dxc",
"created": 20200101,
"status": "ativo"
}
]
}
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<Servers>
<name>server1</name>
<owner>dxc</owner>
<created>20200101</created>
<status>ativo</status>
</Servers>
</root>
Listas, dicionários, vetores
YAML
SociedadeDoAnel:
- Aragorn: 'Vivo'
Frodo: 'Vivo'
Boromir: 'Morto'
Legolas: 'Vivo'
Cidades:
- Rohan
- Gondor
- Moria
Dicionários: ordem não importa
Listas: ordem importa
Passando instruções para o ansible
Playbooks
#Exemplo de playbook 1
- Executar comando1 no servidor1
- Limpar caminho 'C:\' no servidor 2
- Executar comando2 no servidor 2
- Criar pasta 'aaaa' no servidor 3
- Executar comando3 no servidor 3
- Reiniciar servidor1
- Reiniciar servidor2
- Reiniciar servidor3
#Exemplo de playbook 2
- Subir 5 VM's na núvem pública
- Instalar instâncias de banco nas vm's
- Instalar agentes de monitoração nas vm's
- Configurar LB nas vm's
- Configurar web server e proxy reverso na vm1 e vm2
.
.
.
Passando instruções para o ansible
Playbooks
playbook.yml
- play -> número de tasks a serem executadas
- task -> uma ação (executar comando, rodar script...)
Passando instruções para o ansible
Playbooks
-
name: play1
host: localhost
tasks:
- name: Executar "comando1.sh"
script: comando1.sh
- name: Executar coamndo date
command: date
- name: Instalar httpd
yum:
name: httpd
state: present
- name: Executar o servidor web
service:
name: httpd
state: started
- system (systemd, user, hostname, ping, mount...)
- commands (shell, script, raw, expect...)
- files (copy, replace, find, archive...)
- db (mongodb, mssql, mysql, postgres...)
- cloud (Amazon, azure, gcp, digital ocean...)
- Windows (win_copy, win_file, win_path...)
- ...
Modules
Exemplo -> Command
Modules
Exemplo -> Service
Modules
-
name: Subindo serviços
hosts: localhost
tasks:
- name: subindo banco de dados
service: name=postgresql state=started
- name: subindo servidor web
service:
name: nginx
state: started
idempotência*
Exemplo
Variáveis
db ansible_host=servidor1.dxc.com ansible_connection = ssh
web ansible_host=servidor2.dxc.com ansible_connection = winrm
ldap ansible_host=servidor3.dxc.com ansible_connection = ssh
-
name: add dns server em arquivo resolv.conf
hosts: localhost
vars:
dns_server: 10.1.250.5
tasks:
- lineinfile:
path: /etc/resolv.conf
line: 'nameserver {{dns_sever}}'
Usando as variáveis para deixar seu playbook 'clean'
Variáveis
Jinja2 {{ }}
condições
Loops e condições
---
- name: instalar node.js
hosts: all
tasks:
- name: instalar node.js em redhat
yum:
name: node
state: present
when: ansible_os_family == "RedHat" and
ansible_distribution_version == "7"
- name: instalar node.js em manjaro
pacman:
name: node
state: present
when: ansible_os_family == "Arch" or
ansible_os_family == "Manjaro"
instalar vários pacotes com loop
Loops e condições
---
- name: instalar sistemas
hosts: all
vars:
packages:
- name: nginx
requeired: True
- name: postgresql
requeired: True
- name: php
requeired: True
tasks:
- name: instalar "{{item.name}}" em Ubuntu
apt:
name: ""{{item.name}}""
state: present
when: item.required == True
loop: "{{ packages }}"
Definindo as atribuições de cada ambiente
Roles
Pessoa -> Médico(a)
- Fazer faculdade de medicina
- Fazer redisência
- Receber a licença de médico
Ambiente -> Web server
- Instalar pré-req
- instalar pacotes de web server (nginx ou apache...)
- configurar o web server
- deployar as web apps
Definindo as atribuições de cada ambiente
Roles
########################################
## Ansible Playbook for installing Nginx
########################################
- name: check registered the repository of nginx-release
shell: rpm -qa | grep nginx-release
register: result
ignore_errors: True
always_run: yes
changed_when: no
- name: add repository nginx-release (CentOS6/CentOS7)
yum: name="http://nginx.org/packages/centos/{{ansible_distribution_major_version}}/noarch/RPMS/nginx-release-centos-{{ansible_distribution_major_version}}-0.el{{ansible_distribution_major_version}}.ngx.noarch.rpm"
when: result|failed
- name: disable the repository (pls set --enablerepo=nginx if you use it)
replace: dest=/etc/yum.repos.d/nginx.repo regexp="enabled *= *1" replace="enabled=0"
ignore_errors: True
- name: install nginx
yum: name=nginx state=present enablerepo=nginx
- name: Start Nginx
service: name=nginx enabled=yes state=started
https://gist.github.com/uorat/ae441d307110e5447ce7a8449ba634ed
Compartilhando seus playbooks facilmente com roles
Roles
https://galaxy.ansible.com/
ansible-galaxy init -> cria a estrutura de pastas necessárias para uma role
ansible-galaxy search/ install
Tópicos avançados
- Windows Server
- Padrões
- Inventário dinâmico
- Criando módulos customizados
Tópicos avançados
Preparando o Windows
Lembrete: Máquinas windows não podem ser controladores, apenas slaves (clients, workers)
Ansible se conecta nos workers windows com winrm
Requerimentos: pywinrm instalado no controller;
Setup WinRM com scripts (por exemplo);
Métodos de auth: basci/cert/kerberos/NTLM/CredSSP
Tópicos avançados
Padrões
-
name: play1
host: localhost
tasks:
- name: Executar "comando1.sh"
script: comando1.sh
- name: Executar coamndo date
command: date
- name: Instalar httpd
yum:
name: httpd
state: present
- name: Executar o servidor web
service:
name: httpd
state: started
- host1,host2...
- Group1,host3...
- Host*
- *.dxc.com
docs.ansible.com/intro-patterns
Tópicos avançados
Inventário dinâmico
Scripts para inventário / plugins para inventário
Hosts vem e vão, principalmente em nuvem. Então um script cai bem
ansible-playbook -i inventory.py ...
Tópicos avançados
Módulos customizados
from ansible.module_utils.basic import *
def main():
module = AnsibleModule(argument_spec={})
response = {"hello": "world"}
module.exit_json(changed=False, meta=response)
if __name__ == '__main__':
main()
- hosts: localhost
tasks:
- name: Test that my module works
github_repo:
register: result
- debug: var=result
play.yml [library] |_ github_repo.py |_ test_github_repo.py
Ansible & Vagrant X Docker
Projetinho simples
Subindo um webserver e uma página html simples
- Apache
- index.html
- Um slave
- Ansible Vault
Depois você pode complicar => LAMP, MERN, MEAN ...
ansible-playbook -i inventory.txt --ask-vault-pass --extra-vars '@root_pass.yml' playbook-html.yml
ansible-vault create root_pass.yml
Treinamento Ansbile
By Kaleb Alves
Treinamento Ansbile
- 589