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)

  1. Fazer faculdade de medicina
  2. Fazer redisência
  3. Receber a licença de médico

Ambiente -> Web server

  1. Instalar pré-req
  2. instalar pacotes de web server (nginx ou apache...)
  3. configurar o web server
  4. 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

  • 559