Introdução
Hoje em dia, os servidores precisam ser criados e destruídos com muita frequência. Isso ocorre porque, às vezes, os servidores recebem muita carga de execução, enquanto em outros momentos a carga diminui, desperdiçando assim os recursos do sistema. Um exemplo comum são os sites de comércio eletrônico durante as festas de fim de ano, que atraem muito tráfego. Quando a natureza da aplicação é ser escalável, há sempre a necessidade de ter ferramentas de gerenciamento de configuração para facilitar o processo geral de criação de servidores. Ansible é uma excelente ferramenta de gerenciamento de configuração que automatiza a criação de servidores usando procedimentos padrão, reduzindo erros humanos.
O Ansible não requer a instalação de software especial nos nós dos servidores. Ele possui todas as ferramentas necessárias para escrever, compilar e facilitar a automação de scripts. Este tutorial explica detalhadamente como usar o Ansible para automatizar as etapas contidas no nosso Como configurar seu servidor Ubuntu tutorial.
Pré-requisitos
Para concluir este guia, usaremos o Ubuntu 20.04. Além disso, você também precisará de:
-
Um Nó de Controle do Ansible: Uma máquina Ubuntu executando a versão mais recente do Ubuntu. O binário mestre do Ansible deve estar instalado e em execução nesta máquina. Esta máquina deve ser capaz de se conectar aos nós do Ansible. Para essas conexões, você precisa usar chaves SSH. Para evitar problemas ao se conectar, certifique-se de que o nó de controle do Ansible tenha um firewall ativado. Se precisar de ajuda, confira o nosso Instalando e Configurando o Ansible no Ubuntu 20.04 blog.
-
Hosts do Ansible: É necessário um ou mais hosts para se conectar. Os hosts são essencialmente os nós gerenciados no Ansible. Estes devem ser servidores Ubuntu.
Funções do Ansible Playbook
Você pode configurar manualmente todas as etapas mencionadas abaixo. No entanto, automatizaremos essa execução. Quando você executar este playbook, ele realizará as seguintes operações na sua máquina:
-
Ele instalará aptitude, que é o preferido pelo Ansible como seu gerenciador de pacotes.
-
Ele criará um grupo administrativo wheel com permissões sudo sem senha.
-
Ele criará um novo usuário sudo.
-
Ele copiará uma chave SSH local no authorized_keys. Isso deve ser usado para um novo usuário administrativo em um host remoto.
-
Ele desativará a autenticação baseada em senha para o usuário root.
-
Ele instalará os pacotes necessários.
-
Ele configurará o firewall UFW para permitir apenas conexões SSH. Quaisquer outras conexões seriam bloqueadas.
Assim que a execução do Playbook for concluída, um novo usuário estará disponível. Você pode usar esse usuário para fazer login no sistema.
Usando o Ansible Playbook
Para configurar o servidor, você precisará do playbook de configuração inicial do servidor e de suas dependências. Se estiver usando-o pela primeira vez, precisará clonar o repositório usando o link abaixo:
|
1 |
cd ~ |
|
1 |
git clone https://github.com/do-community/ansible-playbooks.git |
|
1 |
cd ansible-playbooks |
Se o repositório já existir no seu sistema, execute o comando abaixo para obter as atualizações mais recentes:
|
1 |
cd ~/ansible-playbooks |
|
1 |
git pull |
Você obterá a seguinte estrutura de arquivos na sua máquina:
|
1 2 3 4 |
setup |-- playbook.yml |__vars |-- default,yml |
Abaixo está a descrição dos arquivos:
-
vars/default.yml: Este arquivo contém as variáveis para configurar o nó do Ansible.
-
playbook.yml: Este arquivo contém as tarefas que devem ser executadas no servidor.
O arquivo vars/default.yml se parece com isto:
|
1 2 3 4 |
--- create_user: my_user copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" sys_packages: [ 'curl', 'vim', 'git', 'ufw'] |
Abaixo está a descrição dessas variáveis. Se desejar editá-las, você pode substituir seus valores pelos seus próprios:
-
create_user: Este é o usuário que é criado. Este usuário tem privilégios de sudo.
-
copy_local_key: Isto contém o caminho para a chave pública SSH local. Ela seria copiada para o servidor remoto como authorized_key.
-
sys_packages: Se você deseja instalar um ou mais pacotes no seu servidor, mencione-os aqui como uma matriz.
Depois de editar este arquivo, salve o conteúdo. Depois disso, no nano, pressione CTRL+X , Y. Depois, ENTER para salvar o conteúdo do arquivo.
Agora você está pronto para executar este playbook em múltiplos servidores. Por padrão, os Playbooks estão prontos para serem executados nos servidores do seu inventário. Se você quiser usar o Playbook em alguns servidores específicos, você pode usar a -l flag. Agora suponha que o servidor remoto tenha múltiplos usuários, você pode usar a -u flag para mencionar a qual usuário se conectar.
Se o nome do seu servidor for my_server e o nome de usuário for my_user, então execute o comando abaixo para executar nos nós do Ansible:
|
1 |
ansible-playbook playbook.yml -l my_server -u my_user |
Você obterá uma saída parecida com:
|
1 2 3 4 5 6 7 8 9 |
PLAY [all] ***************************************************************************************************************************** TASK [Coletando Fatos] ***************************************************************************************************************** ok: [my_server] TASK [Instalar Pré-requisitos] *********************************************************************************************************** changed: [my_server] TASK [Garantir que tenhamos o grupo 'wheel' group] *********************************************************************************************** changed: [my_server] TASK [Permitir ao grupo 'wheel' a ter sudo sem senha] *********************************************************************************** changed: [my_server] |
Assim que esta execução for concluída, você poderá se conectar usando o comando abaixo:
|
1 |
ssh my_user@server_host_or_IP |
Lembre-se de que my_user foi o nome que usamos no arquivo vars/default.yml. Você também precisará alterar o IP do servidor para o IP do seu servidor no comando acima. Se você tiver fornecido a copy_local_key variável para apontar para alguma chave SSH personalizada, especifique o local com a -i opção:
|
1 |
ssh my_user@server_host_or_IP -i ~/.ssh/ansible_controller_key |
Em seguida, faça login no seu servidor para verificar as regras do firewall UFW:
|
1 |
sudo ufw status |
Você obterá a saída abaixo:
|
1 2 3 4 5 |
Status: ativo Para Ação De -- ------ ---- OpenSSH PERMITIR Qualquer lugar OpenSSH (v6) PERMITIR Qualquer lugar (v6) |
A saída acima confirma que o firewall UFW foi finalizado com sucesso. Este foi o último passo no nosso playbook. Se isso for executado corretamente, significa que a execução foi bem-sucedida.
O Conteúdo do Ansible Playbook
Os arquivos do Playbook que usamos neste tutorial estão hospedados no ansible-playbooks/setup_ubuntu1804 em master · do-community/ansible-playbooks · GitHub. Se você deseja ver o conteúdo de cada arquivo para usar ou editar, clique no botão Raw na parte superior de cada script.
Para referência rápida, compartilharemos o conteúdo completo do Playbook junto com os arquivos relevantes:
-
vars/default.yml
Este arquivo contém os valores que serão usados pelas tarefas do playbook. Estes incluem valores como o nome do usuário, privilégios, chaves SSH, pacotes a serem instalados como parte da configuração inicial, e assim por diante:
|
1 2 3 4 |
--- create_user: my_user copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" sys_packages: [ 'curl', 'vim', 'git', 'ufw'] |
-
playbook.yml
O playbook.yml contém as tarefas que devem ser executadas. Primeiro, o arquivo lista todos os hosts que serão alvo. Se você quiser especificar todos os servidores, defina o valor desta chave como all. Em seguida, se você quiser especificar as tarefas a serem executadas usando privilégios sudo, defina o valor da variável become: true. Finalmente, este arquivo precisa incluir o conteúdo do arquivo vars/default.yml acima. Nós os incluímos a seguir para carregar as configurações deste arquivo:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
--- - hosts: all become: true vars_files: - vars/default.yml tasks: - name: Instalar pré-requisitos apt: name=aptitude update_cache=yes state=latest force_apt_get=yes # Configuração do Grupo Sudo - name: Certificar-se de que temos um 'wheel' grupo group: name: wheel state: present - name: Permitir ao 'wheel' grupo ter have sudo sem senha lineinfile: path: /etc/sudoers state: present regexp: '^%wheel' line: '%wheel ALL=(ALL) NOPASSWD: ALL' validate: '/usr/sbin/visudo -cf %s' # Configuração de Usuário + Chave - name: Criar um novo usuário comum com privilégios sudo user: name: "{{ create_user }}" state: present groups: wheel append: true create_home: true shell: /bin/bash - name: Definir chave autorizada para o usuário remoto authorized_key: user: "{{ create_user }}" state: present key: "{{ copy_local_key }}" - name: Desativar autenticação por senha para o root lineinfile: path: /etc/ssh/sshd_config state: present regexp: '^#?PermitRootLogin' line: 'PermitRootLogin prohibit-password' # Instalar Pacotes - name: Atualizar apt apt: update_cache=yes - name: Instalar pacotes de sistema necessários apt: name={{ sys_packages }} state=latest # Configuração do UFW - name: UFW - Permitir conexões SSH ufw: rule: allow name: OpenSSH - name: UFW - Negar todo o outro tráfego de entrada por padrão ufw: state: enabled policy: deny direction: incoming |
Conclusão
A automação é fundamental na TI, garantindo que todos os processos sejam livres de erros e sigam as práticas e procedimentos padrão. Como a maioria dos softwares hoje é entregue pela web e possui natureza distribuída, tornou-se uma tarefa diária criar novos servidores, por exemplo, para diferentes ambientes, como homologação ou produção, ou até mesmo ambientes de demonstração.
Neste tutorial, demonstramos como automatizar servidores usando o Ansible, uma ferramenta poderosa e fácil de usar que pode economizar muito do seu tempo.
Feliz computação!
Comentários
Nenhum comentário ainda. Seja o primeiro.