├── .gitignore ├── README.md ├── Vagrantfile ├── files ├── apache.yml ├── haproxy.cfg ├── haproxy.yml ├── id_rsa ├── id_rsa.pub └── inventario.ini ├── images ├── vb-import-01.png ├── vb-import-02.png ├── vb-import-03.png ├── vb-import-04.png ├── vb-import-05.png ├── vb-import-06.png ├── vb-import-07.png ├── vb-import-08.png ├── vb-import-09.png ├── vb-import-10.png └── vb-import-11.png ├── vagrant.md └── virtualbox.md /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | *.retry 3 | .vagrant 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ansible 2 | 3 | [Ansible](https://www.ansible.com/) é uma ferramenta de automação e gerência de configuração, sem a necessidade de um centralizador e de agentes instalados nas máquinas. 4 | Podemos configurar centenas de máquinas de um ponto qualquer através de um arquivo de formato muito simples chamado [YAML](https://pt.wikipedia.org/wiki/YAML). 5 | 6 | Para preparar o ambiente seguir as instruções em [virtualbox.md](https://github.com/4linux/ansible-basico/blob/master/virtualbox.md) ou [vagrant.md](https://github.com/4linux/ansible-basico/blob/master/vagrant.md). 7 | 8 | Recomendamos o uso do **vagrant** pois é uma ferramenta que nos auxilia a criar ambientes de teste da maneira mais cômoda possível, como segunda opção fornecemos a **ova** que poderá estar indisponível após o evento. 9 | 10 | ## Inventário 11 | 12 | O inventário é o arquivo em que definimos as nossas máquinas, pode ter vários formatos como INI, JSON ou YAML. 13 | Dentro do inventário podemos criar estruturas complexas de grupos e variáveis como também podemos utilizar um formato de uma simples lista. 14 | 15 | Um inventário básico com variáveis globais e de grupo no formato `.ini` pode ser criado da seguinte maneira: 16 | 17 | ``` 18 | [all:vars] 19 | ansible_python_interpreter=/usr/bin/python3 20 | 21 | [balancer] 22 | 172.27.11.10 23 | 24 | [webserver] 25 | 172.27.11.20 26 | 172.27.11.30 27 | 28 | [webserver:vars] 29 | versao_apache=2.4 30 | ``` 31 | 32 | Cada par de `[]` forma um grupo, os grupos com sufixo `:vars` indicam variáveis válidas somente para aquelas máquinas do grupo. Uma exceção é o `[all:vars]` que define variáveis para todas as máquinas do inventário. 33 | 34 | Estas variáveis podem ser utilizadas durante as tarefas do Ansible, algumas podem já existir, no caso de `ansible_python_interpreter` e outras podem ser criadas por nós como `versao_apache`. 35 | 36 | ### Autenticação 37 | 38 | O Ansible se comunica com as máquinas "Unix Like" através de [SSH](https://pt.wikipedia.org/wiki/Secure_Shell) e nas máquinas Windows através de [WinRM](https://docs.ansible.com/ansible/latest/user_guide/windows_winrm.html). 39 | 40 | A autenticação pode ser feita por usuário e senha ou através de chaves criptográficas. 41 | 42 | ## Comandos Avulsos 43 | 44 | Com um inventário podemos executar comandos simples nas máquinas, para fazer verificações, instalar pacotes, etc. A estes comandos damos o nome de **ad-hoc**. 45 | 46 | Os comandos nada mais são do que "módulos", invocamos módulos que fazem determinadas coisas nas máquinas, tudo no Ansible gira em torno dos módulos. 47 | 48 | Durante a execução destes comandos podemos informar o usuário, a senha ou a chave de conexão: 49 | 50 | ```bash 51 | ansible --inventory inventario.ini all --user root --private-key chave --module ping 52 | ``` 53 | 54 | > Neste caso especificamos o inventário, usuário, senha e o módulo [ping](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/ping_module.html). 55 | 56 | A única aparição sem nome é a palavra chave `all` que indica todos os presentes no inventário, mas pode ser o nome de um grupo ou mesmo o endereço de uma máquina em específico. 57 | 58 | Quando o módulo possuir argumentos podemos especificá-los, como a instalação de um pacote pelo módulo [package](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/package_module.html): 59 | 60 | ```bash 61 | ansible -i inventario.ini all -u root --private-key chave -m package -a 'name=htop state=present' 62 | ``` 63 | 64 | > Abreviamos os parâmetros, veja que passamos os argumentos **name** e **state** ao módulo **package**. 65 | 66 | ## Playbooks 67 | 68 | As playbooks são formas de executar uma série de comandos do Ansible em uma única execução em um número qualquer de máquinas. Através das playbooks também podemos controlar o fluxo e utilizar lógica para repetir ou pular tarefas. 69 | 70 | As playbooks são escritas através de YAML e utilizam-se dos módulos existentes e de palavras chaves para ações específicas como `loop` para repetições ou `when` para condições. 71 | 72 | ### YAML 73 | 74 | No formato YAML devemos utilizar **dois pontos** para separar a `chave` do `valor`, **espaços** para identação e hierarquia e **traços** para indicar itens de uma lista: 75 | 76 | ```yml 77 | nome: Ansible Básico 78 | duracao: 1 horas 79 | temas: 80 | - O que é ansible 81 | - Inventário 82 | - Comandos Avulsos 83 | - Playbooks 84 | requisitos: 85 | computador: 86 | - Linux 87 | - Windows 88 | - MacOS 89 | conhecimentos: 90 | linux: Apenas o básico 91 | vms: Criação de máquinas no virtualbox 92 | ``` 93 | 94 | Podemos dizer que o YAML todo é um objeto ou um dicionário. 95 | 96 | Na lista acima: 97 | 98 | - `temas` é uma lista; 99 | - `requisitos` é um objeto/dicionário, possui duas chaves filhas, `computador` e `conhecimentos`; 100 | - `requisitos.computador` é uma lista; 101 | - `requisitos.conhecimentos` é um objeto/dicionário, possui duas chaves filhas, `linux` e `vms`. 102 | 103 | ### Exemplo 104 | 105 | Abaixo temos uma pequena playbook que, como root graças ao `become`, instala o apache e copia o conteúdo de um site para dentros da máquinas: 106 | 107 | ```yml 108 | - hosts: all 109 | become: yes 110 | tasks: 111 | - name: Garantindo presença do Apache e seus módulos 112 | package: 113 | name: ['apache2', 'libapache2-mod-security2'] 114 | state: present 115 | - name: Garantindo site 116 | copy: 117 | src: site/ 118 | dest: /var/www/html 119 | ``` 120 | 121 | A playbook tem um formato fixo, composto de algumas configurações e sua lista de tarefas `tasks`. É possível repetir estas configurações e suas `tasks` indefinidamente na playbook, indicando outros grupos de `host` e outras configurações. 122 | 123 | Para executar esta playbook, bastaria digitar: 124 | 125 | ```bash 126 | ansible-playbook -i inventario.ini -u root --private-key chave playbook.yml 127 | ``` 128 | -------------------------------------------------------------------------------- /Vagrantfile: -------------------------------------------------------------------------------- 1 | # -*- mode: ruby -*- 2 | # vi: set ft=ruby : 3 | 4 | vms = { 5 | 'm1' => {'memory' => '512', 'cpus' => 1, 'ip' => '10'}, 6 | 'm2' => {'memory' => '512', 'cpus' => 1, 'ip' => '20'}, 7 | 'm3' => {'memory' => '512', 'cpus' => 1, 'ip' => '30'} 8 | } 9 | 10 | Vagrant.configure('2') do |config| 11 | 12 | config.vm.box = 'debian/buster64' 13 | config.vm.box_check_update = false 14 | 15 | vms.each do |name, conf| 16 | config.vm.define "#{name}" do |m| 17 | m.vm.hostname = "#{name}.ansible.local" 18 | m.vm.network 'private_network', ip: "172.27.11.#{conf['ip']}" 19 | 20 | m.vm.provider 'virtualbox' do |vb| # VirtualBox 21 | vb.memory = conf['memory'] 22 | vb.cpus = conf['cpus'] 23 | end 24 | m.vm.provider 'libvirt' do |lv| # Libvirt 25 | lv.memory = conf['memory'] 26 | lv.cpus = conf['cpus'] 27 | lv.cputopology :sockets => 1, :cores => conf['cpus'], :threads => '1' 28 | end 29 | 30 | m.vm.provision "shell", inline: <<-'SHELL' 31 | apt-get update 32 | apt-get install -y ansible vim nano 33 | mkdir -p /root/.ssh 34 | cp /vagrant/files/id_rsa* /root/.ssh 35 | chmod 400 /root/.ssh/id_rsa* 36 | cp /vagrant/files/id_rsa.pub /root/.ssh/authorized_keys 37 | SHELL 38 | 39 | end 40 | 41 | end 42 | 43 | end 44 | -------------------------------------------------------------------------------- /files/apache.yml: -------------------------------------------------------------------------------- 1 | - hosts: webserver 2 | become: yes 3 | tasks: 4 | - name: Instalando o Apache 5 | package: 6 | name: ['apache2'] 7 | state: present 8 | - name: Garantindo inicialização do Apache 9 | service: 10 | name: apache2 11 | state: started 12 | enabled: yes 13 | - name: Garantindo site 14 | copy: 15 | src: site/ 16 | dest: /var/www/html 17 | -------------------------------------------------------------------------------- /files/haproxy.cfg: -------------------------------------------------------------------------------- 1 | global 2 | user haproxy 3 | group haproxy 4 | 5 | defaults 6 | mode http 7 | log global 8 | retries 2 9 | timeout connect 3000ms 10 | timeout server 5000ms 11 | timeout client 5000ms 12 | 13 | frontend http 14 | bind :80 15 | mode http 16 | default_backend http 17 | 18 | backend http 19 | mode http 20 | balance roundrobin 21 | server webserver1 172.27.11.20:80 check fall 3 rise 2 22 | server webserver2 172.27.11.30:80 check fall 3 rise 2 23 | -------------------------------------------------------------------------------- /files/haproxy.yml: -------------------------------------------------------------------------------- 1 | - hosts: balancer 2 | become: yes 3 | tasks: 4 | - name: Garantindo HAProxy 5 | package: 6 | name: haproxy 7 | state: present 8 | - name: Garantindo configuração 9 | copy: 10 | src: haproxy.cfg 11 | dest: /etc/haproxy/haproxy.cfg 12 | - name: Garatindo recarregamento do HAProxy 13 | service: 14 | name: haproxy 15 | state: restarted 16 | enabled: yes 17 | -------------------------------------------------------------------------------- /files/id_rsa: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEpQIBAAKCAQEAqzIe6i0tHicww5TWy5dbSdJNYCK9so/JkfGqgQPBkSXS7Kw9 3 | f5BdJwRqNTdVpYsyJ68vAkWkQ1andLQk7L6L/gavQn6PJuTui8UZdfD1qy4AVj1Q 4 | 80doly8Xxhwe1Ow695rpz/AdFa1FTIjnS9eyNBurQ3Vjl8xbydyd9WgKifrvUXbt 5 | LaH4hrm9U1k27ClGUpmfzDaYM8Oz8aV1yg8BQKYAkVcJB7EHDYvzLqNyoMbf3qXq 6 | 9X9bLX7tO+N19rtiVsew+lJoyjbrCPzMMCLT/uWVKDZj7YN4eLi/lBPp18GeXCaZ 7 | IE029JSQJ7xsL/5lIpGoGIN6QiCnMGy8dTjbXwIDAQABAoIBAAfRfSnysDnNTmPQ 8 | O1MG8YtYiGIYlBNAj9MTd1b3BfMMCCr43sIhpK9wey08/rNVvQ+k53+yEINmxLUG 9 | uRz6wsfyJDTkNMNw9xf5A2WogH+11RwbJsRFgZhN9Ub958aPl03RjFYLwDhKNnz9 10 | T5reGexZSyQEi2zWT2bTpX8cpkaQ1Q//BBmsBQ3ER5VMmRhBCFcEpBlkHtUyQRNh 11 | n20nUcz8H34eoh5SO0APQBYzZlgkvXjlmvXcMbZRzD0QTUF/GBHaJe2sEw2I1yyz 12 | zpKQUFYeWSyHsfMGSK2Uuzk5gj40WJcPkjOwytmzCPjsX5PuJ58vwbBLqNjDQZSE 13 | ZUaDs7ECgYEA3a13FLuIizOJY+Kt1AT8mp2pKUaPSJKKm0ftm5tD23P2/np6yndN 14 | ts1q4I0IXG2PCgU/RkObRD6vVEJQviQFuWKeyB+D1UUHct1QvHu9K9X4X+q/dBvT 15 | TojkVZ5XSdCAfePGJkCa8+emvA0/IuI+uETXXjRRIY7a+aTKn+dreUkCgYEAxbO7 16 | EZu+W6NN/9ZwKfNlEleJ/AlFGaGkrGjTEXTH/KHWka2k4l0JzBPHw49uZFSnfRjc 17 | F5x+mT221LBPjCIN4aqrHATNqK4qMPX1grb5CeMSu124wZHcUwEShwt8Lcfo39uq 18 | qze1ztrRCDJS0bPl3HqQC8pAGujOljbfSQnpl2cCgYEAuhEc7+ENFlJW0ul0oI7i 19 | /GCzmXqpT+/4uafhMAheJ7iprCZgJMuJBpRbTknyp6oqMu3+k1qx29GF1wKmxUJ1 20 | L4sw3adeP8fmHarYVqzCNyYtiU0AEFQ+xB+xEJCMkd+ZypFCQ99ccLeTQysXQI+I 21 | t6DI6UCejL1c3chNb3SOyEkCgYEAixg5zFi0JEsQDKi1f35kJPR7+1wWRsNIVZjm 22 | r0hnj+HZUeNGt5BX3UIpcPiP5Xz93fDIoMAU/gHCiX+GaARpmdT20B69BymKO6pA 23 | 0nejXYZqXnLBE0dpKOj/PQ4ijx8wQ5eMSyxF+MRQ/yBQzoNwfJ+qivEACy6yclMm 24 | 439a3o8CgYEAwbU3C0CR7AJy12M0je5rqzR/VqNPo0T/CfGV+T+INdQc8TfMPG2E 25 | TDQs4AoHV6ibmjvurJTrT0GA0WMyupQu3NawllO++64gX09OUuZ9o05S+66SFqQA 26 | gnuhaTDsPvqGiueLK0ZCuZKsUR/t5O+CXKS/oip/e66Op5Zk2yzbA24= 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /files/id_rsa.pub: -------------------------------------------------------------------------------- 1 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCrMh7qLS0eJzDDlNbLl1tJ0k1gIr2yj8mR8aqBA8GRJdLsrD1/kF0nBGo1N1WlizInry8CRaRDVqd0tCTsvov+Bq9Cfo8m5O6LxRl18PWrLgBWPVDzR2iXLxfGHB7U7Dr3munP8B0VrUVMiOdL17I0G6tDdWOXzFvJ3J31aAqJ+u9Rdu0tofiGub1TWTbsKUZSmZ/MNpgzw7PxpXXKDwFApgCRVwkHsQcNi/Muo3Kgxt/eper1f1stfu0743X2u2JWx7D6UmjKNusI/MwwItP+5ZUoNmPtg3h4uL+UE+nXwZ5cJpkgTTb0lJAnvGwv/mUikagYg3pCIKcwbLx1ONtf hector@mago 2 | -------------------------------------------------------------------------------- /files/inventario.ini: -------------------------------------------------------------------------------- 1 | [balancer] 2 | 172.27.11.10 3 | 4 | [webserver] 5 | 172.27.11.20 6 | 172.27.11.30 7 | -------------------------------------------------------------------------------- /images/vb-import-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/4linux/ansible-basico/9ed504fe76847f6b410e4f48d7d402f16fbb5323/images/vb-import-01.png -------------------------------------------------------------------------------- /images/vb-import-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/4linux/ansible-basico/9ed504fe76847f6b410e4f48d7d402f16fbb5323/images/vb-import-02.png -------------------------------------------------------------------------------- /images/vb-import-03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/4linux/ansible-basico/9ed504fe76847f6b410e4f48d7d402f16fbb5323/images/vb-import-03.png -------------------------------------------------------------------------------- /images/vb-import-04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/4linux/ansible-basico/9ed504fe76847f6b410e4f48d7d402f16fbb5323/images/vb-import-04.png -------------------------------------------------------------------------------- /images/vb-import-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/4linux/ansible-basico/9ed504fe76847f6b410e4f48d7d402f16fbb5323/images/vb-import-05.png -------------------------------------------------------------------------------- /images/vb-import-06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/4linux/ansible-basico/9ed504fe76847f6b410e4f48d7d402f16fbb5323/images/vb-import-06.png -------------------------------------------------------------------------------- /images/vb-import-07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/4linux/ansible-basico/9ed504fe76847f6b410e4f48d7d402f16fbb5323/images/vb-import-07.png -------------------------------------------------------------------------------- /images/vb-import-08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/4linux/ansible-basico/9ed504fe76847f6b410e4f48d7d402f16fbb5323/images/vb-import-08.png -------------------------------------------------------------------------------- /images/vb-import-09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/4linux/ansible-basico/9ed504fe76847f6b410e4f48d7d402f16fbb5323/images/vb-import-09.png -------------------------------------------------------------------------------- /images/vb-import-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/4linux/ansible-basico/9ed504fe76847f6b410e4f48d7d402f16fbb5323/images/vb-import-10.png -------------------------------------------------------------------------------- /images/vb-import-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/4linux/ansible-basico/9ed504fe76847f6b410e4f48d7d402f16fbb5323/images/vb-import-11.png -------------------------------------------------------------------------------- /vagrant.md: -------------------------------------------------------------------------------- 1 | # Vagrant 2 | 3 | Será preciso instalar o [VirtualBox](https://www.virtualbox.org/) e o [Vagrant](https://www.vagrantup.com/) 4 | 5 | ## Preparação 6 | 7 | Alguns alunos relatam problemas de certificado nos repositórios do Vagrant. Para evitar problemas, baixe a imagem pré-configurada da máquina manualmente: 8 | 9 | ```bash 10 | vagrant box add --insecure debian/buster64 --provider virtualbox 11 | ``` 12 | 13 | Baixar os arquivos deste repositório clonando-os através do [git](https://git-scm.com/) ou fazendo download do .zip em https://github.com/4linux/ansible-basico/archive/refs/heads/master.zip. 14 | 15 | Entrar no diretório e executar através do terminal: 16 | 17 | ```bash 18 | vagrant up --provider virtualbox 19 | ``` 20 | 21 | > Este passo levará algum tempo. 22 | 23 | As máquinas serão criadas no VirtualBox, ao término será possível listá-las com: 24 | 25 | ```bash 26 | vagrant status 27 | ``` 28 | 29 | Para acessar qualquer uma das máquinas, digite `vagrant ssh` seguido de seu nome: 30 | 31 | ```bash 32 | vagrant ssh m1 33 | ``` 34 | 35 | Pronto, você está no terminal da máquina! 36 | 37 | ## Comandos Básicos 38 | 39 | A etapa de criação e provisionamento acontece apenas uma vez, chamadas subsequentes a `vagrant up` apenas iniciarão as máquinas. Todos os comandos devem ser executados no diretório em que o arquivo `Vagrantfile` está. 40 | 41 | Para verificar as maquinas: 42 | 43 | ```bash 44 | vagrant status 45 | # Current machine states: 46 | # 47 | # m1 running (virtualbox) 48 | # m2 running (virtualbox) 49 | # m3 running (virtualbox) 50 | # 51 | # This environment represents multiple VMs. The VMs are all listed 52 | # above with their current state. For more information about a specific 53 | # VM, run `vagrant status NAME`. 54 | ``` 55 | 56 | Para parar as máquinas: 57 | 58 | ```bash 59 | vagrant halt 60 | ``` 61 | 62 | Para reinicar as máquinas: 63 | 64 | ```bash 65 | vagrant reload 66 | ``` 67 | 68 | Para destruir o ambiente: 69 | 70 | ```bash 71 | vagrant destroy 72 | ``` 73 | -------------------------------------------------------------------------------- /virtualbox.md: -------------------------------------------------------------------------------- 1 | # VirtualBox 2 | 3 | Será preciso instalar o [VirtualBox](https://www.virtualbox.org/) de alguma forma. 4 | 5 | O pacote com as máquinas virtuais pode ser baixado em https://storage.googleapis.com/live-ansible/ansible.ova, a **ova** pode não estar disponível após o evento. 6 | 7 | Ao baixar o arquivo `.ova` será preciso importá-lo e adicionar uma interface de rede para a comunicação com as máquinas. 8 | 9 | ## Preparação 10 | 11 | ![Passo 1](images/vb-import-01.png) 12 | 13 | Clique no ícone para **importar** o pacote. 14 | 15 | ![Passo 2](images/vb-import-02.png) 16 | 17 | Na janela que aparecerá, selecione o ícone do **diretório**. 18 | 19 | ![Passo 3](images/vb-import-03.png) 20 | 21 | Selecione o arquivo `ansible.ova` e confirme a escolha. 22 | 23 | ![Passo 4](images/vb-import-04.png) 24 | 25 | Clique no botão para **avançar**. 26 | 27 | ![Passo 5](images/vb-import-05.png) 28 | 29 | Uma descrição das máquinas aparecerá, são três no total, simplesmente confirme clicando no botão **importar**. 30 | 31 | ![Passo 6](images/vb-import-06.png) 32 | 33 | Aceite as licensas... ops, isso foi erro meu ao gerar as máquinas... 34 | 35 | ![Passo 7](images/vb-import-07.png) 36 | 37 | Veja que a máquina pede por uma interface de rede que ainda não existe, ou se existe precisará ser modificada. 38 | 39 | ![Passo 8](images/vb-import-08.png) 40 | 41 | - No menu superior clique em `Arquivo -> Gerenciador de Redes`. 42 | - Crie uma nova interface de rede clicando em **Criar**, o nome não importa. 43 | - No campo `Endereço IPv4` digite `172.27.11.1`. 44 | - Clique em aplicar e confirme se as modificações foram aceitas, as vezes o VirtualBox ignora. 45 | 46 | [Passo 9](images/vb-import-09.png) 47 | 48 | Modifique a **segunda** interface de rede da máquina clicando em seu nome. 49 | 50 | [Passo 10](images/vb-import-10.png) 51 | 52 | Selecione a interface de rede que acabou de criar e clique em **OK**. 53 | 54 | [Passo 11](images/vb-import-11.png) 55 | 56 | Agora é possível iniciar esta máquina e utilizar a própria interface do VirtualBox ou utilizar algum software externo como [putty](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html) ou [git bash](https://gitforwindows.org/) para acessá-la. 57 | 58 | Modifique as outras máquinas para utilizar a mesma interface criada, não será necessário criar outra. 59 | --------------------------------------------------------------------------------