britho / Ansible-HedHat

0 stars 0 forks source link

Aula-11 #8

Open britho opened 3 years ago

britho commented 3 years ago

Meta | Demonstre as habilidades adquiridas neste curso instalando, otimizando e configurando o Ansible para o gerenciamento de hosts gerenciados. -- | -- Seções | Revisão abrangente Laboratórios | Laboratório: Implantação do Ansible Laboratório: Criação de playbooks Laboratório: Criação de funções e uso de inventários dinâmicos

Objetivos

Depois de concluir esta seção, você deverá ser capaz de demonstrar proficiência com o conhecimento e as habilidades adquiridas em Red Hat System Administration III: Linux Automation.

Revisão do RedHat System Administration III: Linux Automation

Para iniciar a revisão abrangente deste curso, você precisa estar familiarizado com os tópicos abordados em cada capítulo.

Consulte as seções anteriores do material didático para estudo adicional.

Descrever os conceitos fundamentais do Ansible e como ele é usado, assim como instalar o RedHat Ansible Engine.

  • Descrever a motivação para automatizar as tarefas de administração do Linux com o Ansible, conceitos fundamentais do Ansible e sua arquitetura básica.

  • Instalar o Ansible em um nó de controle e descrever a diferença entre a comunidade do Ansible e o RedHat Ansible Engine.

Configurar o Ansible para gerenciar hosts e executar comandos ad hoc do Ansible.

  • Descrever os conceitos do inventário do Ansible e gerenciar um arquivo de inventário estático.

  • Descrever onde os arquivos de configuração do Ansible estão localizados, como o Ansible seleciona esses arquivos e editá-los para aplicar alterações às configurações padrão.

  • Executar uma só tarefa de automação do Ansible usando um comando ad hoc e explicar alguns casos de uso de comandos ad hoc.

Escrever um playbook do Ansible simples e executá-lo para automatizar tarefas em vários hosts.

  • Escrever um playbook do Ansible básico e executá-lo usando o comando ansible-playbook.

  • Escrever um playbook que usa múltiplas ações e escalonamento de privilégios por ação.

  • Usar ansible-doc de maneira eficaz a fim de aprender a usar novos módulos para implementar tarefas em uma ação.

Escrever playbooks que usem variáveis para simplificar o gerenciamento do playbook e fatos para fazer referência a informações sobre os hosts gerenciados.

  • Criar e fazer referência a variáveis que afetam determinados hosts ou grupos de hosts, a ação ou o ambiente global, além de descrever como funciona a precedência de variáveis.

  • Criptografar variáveis confidenciais usando o Ansible Vault e executar os playbooks que fazem referência aos arquivos com variáveis criptografadas pelo Vault.

  • Fazer referência a dados sobre hosts gerenciados usando fatos do Ansible e configurar fatos personalizados em hosts gerenciados.

Gerenciar erros de controle de tarefas, manipuladores e tags nos playbooks do Ansible.

  • Implementar loops para escrever tarefas eficientes para controlar quando as tarefas são executadas.

  • Implementar uma tarefa que seja executada apenas quando outra tarefa alterar o host gerenciado.

  • Controlar o que acontece quando há falha em uma tarefa e quais condições fazem com que uma tarefa falhe.

Implantar, gerenciar e ajustar arquivos em hosts gerenciados pelo Ansible.

  • Criar, instalar, editar e remover arquivos em hosts gerenciados, além de gerenciar permissões, propriedade, contexto do SELinux e outras características desses arquivos.

  • Personalizar arquivos usando templates Jinja2 e implantá-los em hosts gerenciados.

Escrever playbooks otimizados para projetos maiores e mais complexos.

  • Escrever padrões de host sofisticados a fim de selecionar hosts com eficiência para uma ação ou um comando ad hoc.

  • Descrever a natureza e a finalidade dos inventários dinâmicos, além de instalar e usar um script existente como uma fonte de inventário dinâmico do Ansible.

  • Ajustar o número de conexões simultâneas abertas pelo Ansible para hosts gerenciados e como o Ansible processa grupos de hosts gerenciados por meio das tarefas da ação.

  • Gerenciar playbooks grandes importando ou incluindo playbooks e tarefas de arquivos externos, seja incondicionalmente ou com base em um teste condicional.

Usar funções do Ansible para desenvolver playbooks com mais rapidez e reutilizar o código do Ansible.

  • Descrever o que é uma função, como ela está estruturada e como usá-la em um playbook.

  • Criar uma função no diretório do projeto de um playbook e executá-la como parte de uma das ações no playbook.

  • Selecionar e recuperar funções do Ansible Galaxy ou de outras fontes, como um repositório Git, e usá-las em seus playbooks.

  • Escrever playbooks que aproveitem as funções do sistema do RedHat EnterpriseLinux para executar operações padrão.

Solucionar problemas de playbooks e hosts gerenciados.

  • Solucione problemas genéricos com um novo playbook e repare-os.

  • Solucione falhas em hosts gerenciados ao executar um playbook.

Automatizar tarefas comuns de administração de sistemas Linux com o Ansible.

  • Registrar sistemas, configurar canais e repositórios de software e gerenciar pacotes RPM em hosts gerenciados.

  • Gerenciar usuários e grupos do Linux, configurar SSH e modificar a configuração do Sudo em hosts gerenciados.

  • Gerenciar a inicialização de serviços, agendar processos com at, cron e systemd, reinicializar e controlar o destino de inicialização padrão em hosts gerenciados.

  • Particionar dispositivos de armazenamento, configurar o LVM, formatar partições ou volumes lógicos, montar sistemas de arquivos e adicionar arquivos ou espaços de troca.

britho commented 3 years ago

Nesta revisão, você instalará o Ansible na workstation, o usará como um nó de controle e o configurará para conectar-se com os hosts gerenciados servera e serverb. Também usará comandos ad hoc para realizar ações em hosts gerenciados.

Resultados

Você deverá ser capaz de:

Instalar o Ansible.

Usar comandos adhoc para realizar ações em hosts gerenciados. 

Instruções

Instale e configure o Ansible na workstation. Demonstre que você pode construir os comandos adhoc especificados na lista de critérios para modificar os hosts gerenciados e verificar se as modificações funcionam conforme esperado:

Instale o Ansible na workstation para que possa servir como o nó de controle.

No nó de controle, crie um arquivo de inventário, /home/student/review-deploy/inventory, contendo um grupo chamado dev. Esse grupo deve ser composto pelos hosts gerenciados servera.lab.example.com e serverb.lab.example.com.

Crie o arquivo de configuração do Ansible em /home/student/review-deploy/ansible.cfg. O arquivo de configuração deve apontar para o arquivo de inventário /home/student/review-deploy/inventory.

Execute um comando ad hoc usando o escalonamento de privilégios para modificar o conteúdo do arquivo /etc/motd no servera e no serverb para que ele contenha a string Managed by Ansible\n. Use devops como um usuário remoto.

Execute um comando ad hoc para verificar se o conteúdo do arquivo /etc/motd no servera e o que está no serverb são idênticos. 

Faça login na workstation como student usando a senha student.

Na workstation, execute o comando lab review-deploy start. Esse script garante que os hosts gerenciados, servera e serverb, estejam acessíveis na rede. O script cria um subdiretório de laboratório chamado review-deploy no diretório pessoal do aluno.

[student@workstation ~]$ lab review-deploy start

Instale o Ansible na workstation para que possa servir o nó de controle.

[student@workstation ~]$ sudo yum install ansible
[sudo] password for student:
Loaded plugins: langpacks, search-disabled-repos
Resolving Dependencies
--> Running transaction check
...output omitted...
Is this ok [y/d/N]: y
...output omitted...

No nó de controle, crie um arquivo de inventário, /home/student/review-deploy/inventory, contendo um grupo chamado dev. Esse grupo deve ser composto pelos hosts gerenciados servera.lab.example.com e serverb.lab.example.com.

[dev]
servera.lab.example.com
serverb.lab.example.com

Crie o arquivo de configuração do Ansible em /home/student/review-deploy/ansible.cfg. O arquivo de configuração deve fazer referência ao arquivo de inventário /home/student/review-deploy/inventory.

Adicione as entradas a seguir para configurar o arquivo de inventário ./inventory como a fonte de inventário. Salve as alterações e saia do editor de texto.

[defaults]
inventory=./inventory

Execute um comando ad hoc usando o escalonamento de privilégios para modificar o conteúdo do arquivo /etc/motd no servera e no serverb para que contenha a string Managed by Ansible\n. Use devops como o usuário remoto.

[student@workstation review-deploy]$ ansible dev -m copy \
> -a 'content="Managed by Ansible\n" dest=/etc/motd' -b -u devops
servera.lab.example.com | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": true,
    "checksum": "4458b979ede3c332f8f2128385df4ba305e58c27",
    "dest": "/etc/motd",
    "gid": 0,
    "group": "root",
    "md5sum": "65a4290ee5559756ad04e558b0e0c4e3",
    "mode": "0644",
    "owner": "root",
    "secontext": "unconfined_u:object_r:etc_t:s0",
    "size": 19,
    "src": "/home/devops/.ansible/tmp/...output omitted...",
    "state": "file",
    "uid": 0
}
serverb.lab.example.com | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": true,
    "checksum": "4458b979ede3c332f8f2128385df4ba305e58c27",
    "dest": "/etc/motd",
    "gid": 0,
    "group": "root",
    "md5sum": "65a4290ee5559756ad04e558b0e0c4e3",
    "mode": "0644",
    "owner": "root",
    "secontext": "system_u:object_r:etc_t:s0",
    "size": 19,
    "src": "/home/devops/.ansible/tmp/...output omitted...",
    "state": "file",
    "uid": 0
}

Execute um comando ad hoc para verificar se o conteúdo do arquivo /etc/motd no servera e o que está no serverb são idênticos.

[student@workstation review-deploy]$ ansible dev -m command -a "cat /etc/motd"
servera.lab.example.com | CHANGED | rc=0 >>
Managed by Ansible

serverb.lab.example.com | CHANGED | rc=0 >>
Managed by Ansible

Avaliação

Na workstation, execute o comando lab review-deploy grade para confirmar a conclusão com êxito deste exercício. Corrija todas as falhas relatadas e execute novamente o comando até que ele seja concluído com êxito.

[student@workstation ~]$ lab review-deploy grade

Encerramento

Na workstation, execute o comando lab review-deploy finish para limpar este exercício.

[student@workstation ~]$ lab review-deploy finish

Isso conclui o laboratório.

britho commented 3 years ago

Nesta análise, você criará três playbooks no diretório de projeto do Ansible, /home/student/review-playbooks. Um playbook garantirá que o lftp esteja instalado em sistemas que devem ser clientes FTP, um playbook garantirá que vsftpd esteja instalado e configurado em sistemas que devem ser servidores FTP e um playbook (site.yml) executará os outros dois playbooks.

Resultados

Você deverá ser capaz de:

  • Criar e executar playbooks para realizar tarefas em hosts gerenciados.

  • Utilizar templates Jinja2, variáveis e manipuladores em playbooks.

Instruções

Crie um inventário estático review-playbooks/inventory com serverc.lab.example.com no grupo ftpclients e serverb.lab.example.com e serverd.lab.example.com no grupo ftpservers. Crie um arquivo review-playbooks/ansible.cfg que configure seu projeto do Ansible para usar esse inventário. Pode ser útil consultar o arquivo /etc/ansible/ansible.cfg do sistema para obter ajuda em relação à sintaxe.

Configure seu projeto do Ansible para se conectar a hosts no inventário usando o usuário remoto, devops, e o método sudo de escalonamento de privilégios. Você tem chaves SSH para fazer login como devops já configuradas. O usuário devops não precisa de uma senha para escalonamento de privilégios com sudo.

Crie um playbook denominado ftpclients.yml no diretório review-playbooks que contenha uma ação direcionada a hosts no grupo de inventário ftpclients. O playbook deve garantir que o pacote lftp esteja instalado.

Crie um segundo playbook denominado ansible-vsftpd.yml no diretório review-playbooks que contenha uma ação direcionada a hosts no grupo de inventário ftpservers. Ele deve atender aos seguintes requisitos:

  • Você tem um arquivo de configuração para vsftpd gerado a partir de um template Jinja2. Crie um diretório para templates, review-playbooks/templates, e copie para ele o arquivo vsftpd.conf.j2 fornecido. Crie o diretório review-playbooks/vars. Copie o arquivo defaults-template.yml fornecido, que contém configurações padrão de variáveis usadas para completar esse template quando ele for implantado, para o diretório review-playbooks/vars.

  • Crie um arquivo de variável, review-playbooks/vars/vars.yml, que defina três variáveis:

    Variável | Valor -- | -- vsftpd_package | vsftpd vsftpd_service | vsftpd vsftpd_config_file | /etc/vsftpd/vsftpd.conf

  • No playbook ansible-vsftpd.yml, use vars_files para incluir os arquivos de variáveis na ação no diretório review-playbooks/vars.

  • Na ação ansible-vsftpd.yml, crie tarefas que:

    1. Garantam que os pacotes listados pela variável {{ vsftpd_package }} estejam instalados.

    2. Garantam que o serviço listado pela variável {{ vsftpd_service }} esteja iniciado e habilitado no momento da inicialização.

    3. Usem o módulo template para implantar o modelo templates/vsftpd.conf.j2 na localização definida pela variável {{ vsftpd_config_file }}. O arquivo deve ser de propriedade do usuário root, grupo root, ter permissões octais de arquivo 0600 e um tipo SELinux de etc_t. Notifique um manipulador para que reinicie vsftpd se a tarefa resultar em uma alteração.

    4. Certifique-se de que o pacote firewalld esteja instalado e que o serviço esteja iniciado e ativado. Certifique-se de que firewalld foi configurado para permitir conexões ao serviço ftp de modo imediato e permanente. O intervalo de portas temporário para conexões de dados FTP passivas foi definido como 21000-21020 TCP. Você também precisará adicionar uma permissão para esse intervalo no firewall.

  • No playbook ansible-vsftpd.yml, crie um manipulador para reiniciar os serviços listados pela variável {{ vsftpd_service }} quando for notificado.

Crie um terceiro playbook site.yml no diretório review-playbooks. Esse playbook só deve importar os outros dois playbooks.

Siga as práticas recomendadas de playbooks ao nomear todas as suas ações e tarefas. Escreva playbooks usando módulos apropriados e certifique-se de que eles possam ser executados novamente com segurança. Playbooks não devem fazer alterações desnecessárias nos sistemas.

Use o comando ansible-doc para encontrar módulos e informações sobre como usá-los.

Quando terminar, use ansible-playbook site.yml para verificar seu trabalho antes de classificar o script. Você também pode executar os playbooks individuais separadamente para garantir que eles funcionam.

Se você tiver problemas com seu playbook site.yml, certifique-se de que ansible-vsftpd.yml e ftpclients.yml usem recuos consistentes.

  1. Faça login na workstation como student usando a senha student.

    Na workstation, execute o comando lab review-playbooks start.

    [student@workstation ~]$ lab review-playbooks start
  2. Com o usuário student na workstation, crie o arquivo de inventário /home/student/review-playbooks/inventory, contendo serverc.lab.example.com no grupo ftpclients, bem como serverb.lab.example.com e serverd.lab.example.com no grupo ftpservers.

    1. Mude o diretório para o diretório do projeto do Ansible, /home/student/review-playbooks, criado pelo script de configuração.

      [student@workstation ~]$ cd ~/review-playbooks
    2. Preencha o arquivo inventory com as entradas a seguir. Depois, salve-o e saia.

      [ftpservers]
      serverb.lab.example.com
      serverd.lab.example.com
      [ftpclients]
      serverc.lab.example.com
  3. Crie o arquivo de configuração do Ansible, /home/student/review-playbooks/ansible.cfg, e preencha-o com as entradas necessárias para atender a estes requisitos:

    • Configurar o projeto do Ansible para que use o inventário recém-criado

    • Conectar-se a hosts gerenciados como usuário devops

    • Utilizar o escalonamento de privilégios usando sudo como usuário root

    • Escalonar privilégios para cada tarefa por padrão

    [defaults]
    remote_user = devops
    inventory = ./inventory
    [privilege_escalation]
    become_user = root
    become_method = sudo
    become = true
  4. Crie o playbook, /home/student/review-playbooks/ftpclients.yml, contendo uma ação direcionada a hosts no grupo de inventário ftpclients e certifique-se de que o pacote lftp esteja instalado.

    ---
    - name: Ensure FTP Client Configuration
      hosts: ftpclients
      tasks:
        - name: latest version of lftp is installed
          yum:
            name: lftp
            state: latest
  5. Coloque o arquivo de configuração, vsftpd.conf.j2, fornecido no subdiretório templates.

    1. Crie o subdiretório templates.

      [student@workstation review-playbooks]$ mkdir -v templates
      mkdir: created directory 'templates'
    2. Move o arquivo vsftpd.conf.j2 fornecido no subdiretório templates recentemente criado.

      [student@workstation review-playbooks]$ mv -v vsftpd.conf.j2 templates/
      renamed 'vsftpd.conf.j2' -> 'templates/vsftpd.conf.j2'
  6. Coloque o arquivo defaults-template.yml fornecido no subdiretório vars.

    1. Crie o subdiretório vars.

      [student@workstation review-playbooks]$ mkdir -v vars
      mkdir: created directory 'vars'
    2. Move o arquivo defaults-template.yml fornecido no subdiretório vars recentemente criado.

      [student@workstation review-playbooks]$ mv -v defaults-template.yml vars/
      renamed 'defaults-template.yml' -> 'vars/defaults-template.yml'
  7. Crie um arquivo de definição de variável vars.yml no subdiretório vars para definir as três variáveis a seguir e seus valores.

    Variável | Valor -- | -- vsftpd_package | vsftpd vsftpd_service | vsftpd vsftpd_config_file | /etc/vsftpd/vsftpd.conf
    vsftpd_package: vsftpd
    vsftpd_service: vsftpd
    vsftpd_config_file: /etc/vsftpd/vsftpd.conf
  8. Usando o template Jinja2 e os arquivos de definição de variável recentemente criados, crie um segundo playbook, /home/student/review-playbooks/ansible-vsftpd.yml, para configurar o serviço vsftpd nos hosts do grupo de inventário ftpservers.

    ---
    - name: FTP server is installed
      hosts:
        - ftpservers
      vars_files:
        - vars/defaults-template.yml
        - vars/vars.yml
      tasks:
        - name: Packages are installed
          yum:
            name: "{{ vsftpd_package }}"
            state: present
        - name: Ensure service is started
          service:
            name: "{{ vsftpd_service }}"
            state: started
            enabled: true
        - name: Configuration file is installed
          template:
            src: templates/vsftpd.conf.j2
            dest: "{{ vsftpd_config_file }}"
            owner: root
            group: root
            mode: 0600
            setype: etc_t
          notify: restart vsftpd
        - name: firewalld is installed
          yum:
            name: firewalld
            state: present
        - name: firewalld is started and enabled
          service:
            name: firewalld
            state: started
            enabled: yes
        - name: FTP port is open
          firewalld:
            service: ftp
            permanent: true
            state: enabled
            immediate: yes
        - name: FTP passive data ports are open
          firewalld:
            port: 21000-21020/tcp
            permanent: yes
            state: enabled
            immediate: yes
      handlers:
        - name: restart vsftpd
          service:
            name: "{{ vsftpd_service }}"
            state: restarted
  9. Crie um terceiro playbook, /home/student/review-playbooks/site.yml, e inclua as ações dos dois playbooks criados anteriormente, ftpclients.yml e ansible-vsftpd.yml.

    ---
    # FTP Servers playbook
    - import_playbook: ansible-vsftpd.yml
    # FTP Clients playbook
    - import_playbook: ftpclients.yml
  10. Execute o playbook /home/student/review-playbooks/site.yml para verificar se ele realiza as tarefas desejadas nos hosts gerenciados.

    [student@workstation review-playbooks]$ ansible-playbook site.yml

Avaliação

Com o usuário student na workstation, execute o comando lab review-playbooks grade para confirmar que este exercício foi concluído com êxito. Corrija todas as falhas relatadas e execute novamente o script até que ele seja concluído com êxito.

[student@workstation ~]$ lab review-playbooks grade

Encerramento

Execute o comando lab review-playbooks finish para limpar as tarefas do laboratório em serverb, serverc e serverd.

[student@workstation ~]$ lab review-playbooks finish

Isso conclui o laboratório.

britho commented 3 years ago

Nesta análise, você converterá o playbook ansible-vsftpd.yml em uma função e, então, usará essa função em um novo playbook que também executará algumas tarefas adicionais. Você também instalará e usará o script de inventário, que será fornecido.

Resultados

Você deverá ser capaz de:

  • Criar uma função para configurar o serviço vsftpd usando tarefas de um playbook existente.

  • Incluir uma função em um playbook e executar o playbook.

  • Usar um inventário dinâmico ao executar um playbook.

Instruções

Configure seu projeto do Ansible para usar o script de inventário dinâmico crinventory.py e o arquivo de inventário estático inventory.

Converta o playbook ansible-vsftpd.yml na função ansible-vsftpd, conforme especificado abaixo:

  • Use o comando ansible-galaxy para criar a estrutura de diretório para a função ansible-vsftpd no diretório review-roles/roles do seu projeto do Ansible.

  • O arquivo defaults-template.yml contém variáveis padrão para a função. Mova esse arquivo para um local adequado na estrutura de diretório de função.

  • O arquivo vars.yml contém variáveis regulares para a função. Mova esse arquivo para um local adequado na estrutura de diretório de função.

  • Mova o template vsftpd.conf.j2 para um local adequado na estrutura de diretório de função.

  • Certifique-se de que as tarefas e os manipuladores no playbook ansible-vsftpd.yml estejam adequadamente instalados na função.

  • Edite o arquivo meta/main.yml da função para definir os campos de autor, descrição e licença (use BSD para a licença). Edite o arquivo README.md conforme necessário para a integridade.

  • Remova os subdiretórios da função que você não estiver usando.

Crie um novo playbook, vsftpd-configure.yml, no diretório review-roles conforme especificado a seguir.

  • O playbook deve conter uma ação direcionada a hosts no grupo de inventário ftpservers.

  • A ação deverá definir as seguintes variáveis:

    Variável | Valor -- | -- vsftpd_anon_root | /mnt/share vsftpd_local_root | /mnt/share

  • A ação deve aplicar a função ansible-vsftpd.

  • A ação deve incluir as seguintes tarefas na ordem especificada:

    1. Use o módulo command para criar um rótulo de disco GPT em /dev/vdb que inicie com 1MiB no começo do dispositivo e termine no final do dispositivo. Use o comando ansible-doc para aprender a usar o argumento creates para ignorar essa tarefa se /dev/vdb1 já estiver criado. Isso evita o reparticionamento destrutivo do dispositivo. Use o comando a seguir para criar a partição: parted --script /dev/vdb mklabel gpt mkpart primary 1MiB 100%

    2. Certifique-se de que haja um diretório /mnt/share para ser usado como um ponto de montagem.

    3. Use ansible-doc -l para encontrar um módulo que possa fazer um sistema de arquivos em um dispositivo de bloco. Use ansible-doc para aprender a usar esse módulo. Adicione uma tarefa ao playbook que use esse módulo para criar um sistema de arquivos XFS em /dev/vdb1. Não force a criação desse sistema de arquivos se já existir um.

    4. Adicione uma tarefa para garantir que /etc/fstab monte o dispositivo /dev/vdb1 em /mnt/share no boot e que esteja atualmente montado. Use o comando ansible-doc para encontrar um módulo que possa montar o dispositivo. Se essa tarefa tiver um resultado alterado, notifique o manipulador da função ansible-vsftpd que reinicia o vsftpd.

    5. Adicione uma tarefa que garanta que o diretório /mnt/share seja de propriedade do usuário root e do grupo root, tenha o tipo SELinux definido na variável {{ vsftpd_setype }} da função e tenha permissões octais de 0755. Essa tarefa deve ser executada depois que o sistema de arquivos estiver montado a fim de definir as permissões no sistema de arquivos montado, e não no diretório de ponto de montagem de espaço reservado.

    6. Certifique-se de que um arquivo denominado README exista no diretório especificado por {{ vsftpd_anon_root }} contendo a string Welcome to the FTP server at serverX.lab.example.com em que serverX.lab.example.com é o nome do host totalmente qualificado real desse servidor. Esse arquivo deve ter permissões octais de 0644 e o tipo SELinux especificado pela variável {{ vsftpd_setype }}. (Dica: observe os módulos copy ou template e os fatos disponíveis do Ansible para resolver esse problema.)

Pode ser útil depurar a função testando-a em um playbook que não contenha as tarefas adicionais ou variáveis de playbook listadas acima, mas, em vez disso, contenha uma ação que é direcionada apenas aos hosts no grupo ftpservers e que aplica a função.

Depois de confirmar que um playbook simplificado usando apenas a função funciona exatamente como o playbook ansible-vsftpd.yml original, você pode compilar o playbook vsftpd-configure.yml completo acrescentando as variáveis e tarefas adicionais especificadas acima.

Altere o playbook review-roles/site.yml para que use o novo playbook vsftpd-configure.yml em vez do ansible-vsftpd.yml.

Siga as práticas recomendadas de playbooks ao nomear todas as suas ações e tarefas. Escreva playbooks usando módulos apropriados e certifique-se de que eles possam ser executados novamente com segurança. Playbooks não devem fazer alterações desnecessárias nos sistemas.

Quando terminar, use ansible-playbook site.yml para verificar seu trabalho antes de classificar o script. Você também pode executar os playbooks individuais separadamente para garantir que eles funcionam.

Se você tiver problemas com seu playbook site.yml, certifique-se de que vsftpd-configure.yml e ftpclients.yml usem recuos consistentes.

  1. Faça login na workstation como student usando a senha student.

    Na workstation, execute o comando lab review-roles start. Esse script garante que os hosts remotos sejam acessíveis na rede. O script também verifica se o Ansible está instalado na workstation, cria uma estrutura de diretório para o ambiente de laboratório e instala os arquivos de laboratório necessários.

    [student@workstation ~]$ lab review-roles start
  2. Mude para o diretório de trabalho review-roles. Configure o projeto do Ansible para usar o arquivo de inventário dinâmico crinventory.py e o arquivo de inventário estático inventory. Verifique a configuração do inventário usando o comando ansible-inventory.

    1. Coloque o arquivo de inventário estático em um diretório chamado inventory.

      [student@workstation ~]$ cd ~/review-roles
      [student@workstation review-roles]$ mv -v inventory inventory.tmp
      renamed 'inventory' -> 'inventory.tmp'
      [student@workstation review-roles]$ mkdir -v inventory
      mkdir: created directory 'inventory'
      [student@workstation review-roles]$ mv -v inventory.tmp inventory/inventory
      renamed 'inventory.tmp' -> 'inventory/inventory'
    2. Adicione o script de inventário dinâmico ao diretório de inventário. Certifique-se de que o script seja executável.

      [student@workstation review-roles]$ chmod 755 -v crinventory.py
      mode of 'crinventory.py' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x)
      [student@workstation review-roles]$ mv -v crinventory.py inventory/
      renamed 'crinventory.py' -> 'inventory/crinventory.py'
    3. Configure o diretório inventory como a origem dos arquivos de inventário do projeto.

      A seção [defaults] do arquivo ansible.cfg se parece com isso:

      [defaults]
      remote_user=devops
      inventory=./inventory
    4. Use o comando ansible-inventory para verificar a configuração de inventário do projeto:

      [student@workstation review-roles]$ ansible-inventory --list all
      {
          "_meta": {
              "hostvars": {
                  "servera.lab.example.com": {},
                  "serverb.lab.example.com": {},
                  "serverc.lab.example.com": {},
                  "serverd.lab.example.com": {}
              }
          },
          "all": {
              "children": [
                  "ftpclients",
                  "ftpservers",
                  "ungrouped"
              ]
          },
          "ftpclients": {
              "hosts": [
                  "servera.lab.example.com",
                  "serverc.lab.example.com"
              ]
          },
          "ftpservers": {
              "hosts": [
                  "serverb.lab.example.com",
                  "serverd.lab.example.com"
              ]
          }
      }
  3. Converta o playbook ansible-vsftpd.yml na função ansible-vsftpd.

    1. Crie o subdiretório roles.

      [student@workstation review-roles]$ mkdir -v roles
      mkdir: created directory 'roles'
    2. Usando ansible-galaxy, crie a estrutura de diretório para a nova função ansible-vsftpd no subdiretório roles.

      [student@workstation review-roles]$ cd roles
      [student@workstation roles]$ ansible-galaxy init ansible-vsftpd
      - ansible-vsftpd was created successfully
      [student@workstation roles]$ cd ..
      [student@workstation review-roles]$ 
    3. Usando tree, verifique a estrutura do diretório criado para a nova função.

      [student@workstation review-roles]$ tree roles
      roles
      └── ansible-vsftpd
          ├── defaults
          │   └── main.yml
          ├── files
          ├── handlers
          │   └── main.yml
          ├── meta
          │   └── main.yml
          ├── README.md
          ├── tasks
          │   └── main.yml
          ├── templates
          ├── tests
          │   ├── inventory
          │   └── test.yml
          └── vars
              └── main.yml
      9 directories, 8 files
    4. Substitua o arquivo roles/ansible-vsftpd/defaults/main.yml pelas definições da variável no arquivo defaults-template.yml.

      [student@workstation review-roles]$ mv -v defaults-template.yml \
      > roles/ansible-vsftpd/defaults/main.yml
      renamed 'defaults-template.yml' -> 'roles/ansible-vsftpd/defaults/main.yml'
    5. Substitua o arquivo roles/ansible-vsftpd/vars/main.yml pelas definições da variável no arquivo vars.yml.

      [student@workstation review-roles]$ mv -v vars.yml \
      > roles/ansible-vsftpd/vars/main.yml
      renamed 'vars.yml' -> 'roles/ansible-vsftpd/vars/main.yml'
    6. Use o arquivo templates/vsftpd.conf.j2 como um template para a função ansible-vsftpd.

      [student@workstation review-roles]$ mv -v vsftpd.conf.j2 \
      > roles/ansible-vsftpd/templates/
      renamed 'vsftpd.conf.j2' -> 'roles/ansible-vsftpd/templates/vsftpd.conf.j2'
    7. Copie as tarefas do playbook ansible-vsftpd.yml para o arquivo roles/ansible-vsftpd/tasks/main.yml. O valor da palavra-chave src na tarefa do módulo template não precisa mais referenciar o subdiretório templates. O arquivo roles/ansible-vsftpd/tasks/main.yml deve conter o seguinte quando você terminar.

      ---
      # tasks file for ansible-vsftpd
      - name: Packages are installed
        yum:
          name: '{{ vsftpd_package }}'
          state: present
      - name: Ensure service is started
        service:
          name: '{{ vsftpd_service }}'
          state: started
          enabled: true
      - name: Configuration file is installed
        template:
          src: vsftpd.conf.j2
          dest: '{{ vsftpd_config_file }}'
          owner: root
          group: root
          mode: '0600'
          setype: etc_t
        notify: restart vsftpd
      - name: firewalld is installed
        yum:
          name: firewalld
          state: present
      - name: firewalld is started and enabled
        service:
          name: firewalld
          state: started
          enabled: yes
      - name: FTP port is open
        firewalld:
          service: ftp
          permanent: true
          state: enabled
          immediate: yes
      - name: Passive FTP data ports allowed through the firewall
        firewalld:
          port: 21000-21020/tcp
          permanent: yes
          state: enabled
          immediate: yes
    8. Copie os manipuladores do playbook ansible-vsftpd.yml para o arquivo roles/ansible-vsftpd/handlers/main.yml. O arquivo roles/ansible-vsftpd/handlers/main.yml deve conter o seguinte quando você terminar.

      ---
      # handlers file for ansible-vsftpd
      - name: restart vsftpd
        service:
          name: "{{ vsftpd_service }}"
          state: restarted
  4. Atualize o conteúdo do arquivo roles/ansible-vsftpd/meta/main.yml.

    1. Altere o valor da entrada author para Red Hat Training.

        author: Red Hat Training
    2. Altere o valor da entrada description para "example role for RH294".

        description: example role for RH294
    3. Altere o valor da entrada company para "Red Hat".

        company: Red Hat
    4. Altere o valor da entrada license: para "BSD".

        license: BSD
  5. Modifique o conteúdo do arquivo roles/ansible-vsftpd/README.md para que ele ofereça informações pertinentes em relação à função. Após a modificação, o arquivo deverá ter o conteúdo a seguir.

    ansible-vsftpd
    =========
    Example ansible-vsftpd role from Red Hat's "Linux Automation" (RH294)
    course.
    Role Variables
    --------------
    * defaults/main.yml contains variables used to configure the vsftpd.conf template
    * vars/main.yml contains the name of the vsftpd service, the name of the RPM
    package, and the location of the service's configuration file
    Dependencies
    ------------
    None.
    Example Playbook
    ----------------
        - hosts: servers
          roles:
            - ansible-vsftpd
    License
    -------
    BSD
    Author Information
    ------------------
    Red Hat (training@redhat.com)
  6. Remova os diretórios não utilizados da nova função.

    [student@workstation review-roles]$ rm -rvf roles/ansible-vsftpd/tests
    removed 'roles/ansible-vsftpd/tests/inventory'
    removed 'roles/ansible-vsftpd/tests/test.yml'
    removed directory: 'roles/ansible-vsftpd/tests/'
  7. Crie o novo playbook vsftpd-configure.yml. Ele deve ter o conteúdo a seguir.

    ---
    - name: Install and configure vsftpd
      hosts: ftpservers
      vars:
        vsftpd_anon_root: /mnt/share/
        vsftpd_local_root: /mnt/share/
      roles:
        - ansible-vsftpd
      tasks:
      - name: /dev/vdb1 is partitioned
        command: >
          parted --script /dev/vdb mklabel gpt mkpart primary 1MiB 100%
        args:
          creates: /dev/vdb1
      - name: XFS file system exists on /dev/vdb1
        filesystem:
          dev: /dev/vdb1
          fstype: xfs
          force: yes
      - name: anon_root mount point exists
        file:
          path: '{{ vsftpd_anon_root }}'
          state: directory
      - name: /dev/vdb1 is mounted on anon_root
        mount:
          name: '{{ vsftpd_anon_root }}'
          src: /dev/vdb1
          fstype: xfs
          state: mounted
          dump: '1'
          passno: '2'
        notify: restart vsftpd
      - name: Make sure permissions on mounted fs are correct
        file:
          path: '{{ vsftpd_anon_root }}'
          owner: root
          group: root
          mode: '0755'
          setype: "{{ vsftpd_setype }}"
          state: directory
      - name: Copy README to the ftp anon_root
        copy:
          dest: '{{ vsftpd_anon_root }}/README'
          content: "Welcome to the FTP server at {{ ansible_fqdn }}\n"
          setype: '{{ vsftpd_setype }}'
  8. Altere o playbook site.yml para que use o playbook vsftpd-configure.yml recentemente criado em vez do playbook ansible-vsftpd.yml.

    ---
    # FTP Servers playbook
    - import_playbook: vsftpd-configure.yml
    # FTP Clients playbook
    - import_playbook: ftpclients.yml
  9. Verifique se o playbook site.yml está funcionando como previsto executando-o com ansible-playbook.

    [student@workstation review-roles]$ ansible-playbook site.yml

Avaliação

Na workstation, execute o comando lab review-roles grade para confirmar que este exercício foi concluído com êxito. Corrija todas as falhas relatadas e execute novamente o script até que ele seja concluído com êxito.

[student@workstation ~]$ lab review-roles grade

Encerramento

Execute o comando lab review-roles finish para limpar as tarefas do laboratório em servera e serverb.

[student@workstation ~]$ lab review-roles finish

Isso conclui o laboratório.

britho commented 3 years ago
Meta | Investigar tópicos complementares não incluídos no curso oficial. -- | --

Objetivos

Depois de concluir esta seção, você deverá ser capaz de usar ansible-config para descobrir e investigar opções de configuração e determinar quais opções foram modificadas em relação às configurações padrão.

Exibição das opções de configuração

Se você quiser descobrir quais opções estão disponíveis no arquivo de configuração, use o comando ansible-config list. Ele exibirá uma lista abrangente com as opções de configuração disponíveis e suas configurações padrão. Essa lista pode variar dependendo da versão do Ansible que você instalou e se você tem plugins adicionais do Ansible em seu nó de controle.

Cada opção exibida por ansible-config list terá um número de pares chave-valor associados a ela. Esses pares chave-valor fornecem informações sobre como essa opção funciona. Por exemplo, a opção ACTION_WARNINGS exibe os seguintes pares chave-valor:

Chave | Valor | Finalidade -- | -- | -- description | [Por padrão, o Ansible emitirá um aviso quando for recebido de uma ação da tarefa (plugin de módulo ou ação). Esses avisos podem ser silenciados ajustando essa configuração como False.] | Descreve para que serve esta opção de configuração. type | boolean | Qual é o tipo da opção: boolean significa um valor verdadeiro-falso. default | true | O valor padrão desta opção. version_added | 2.5 | A versão do Ansible em que esta opção foi adicionada, para compatibilidade com versões anteriores. ini | { key: action_warnings, section: defaults } | Qual seção dos arquivos de inventário tipo INI contém esta opção e o nome da opção no arquivo de configuração (action_warnings, na seção defaults). env | ANSIBLE_ACTION_WARNINGS | Se esta variável de ambiente estiver configurada, ela substituirá qualquer configuração da opção feita no arquivo de configuração.

Definição de opções de configuração modificadas

Ao trabalhar com arquivos de configuração, você pode querer descobrir quais opções foram definidas para valores diferentes dos padrões integrados.

É possível fazer isso executando o comando ansible-config dump -v -\-only-changed. A opção -v exibe a localização do arquivo ansible.cfg usado ao processar o comando. O comando ansible-config segue a mesma ordem de precedência mencionada anteriormente para o comando ansible. A saída variar dependendo da localização do arquivo ansible.cfg e do diretório no qual o comando ansible-config é executado.

No exemplo a seguir, há um único arquivo de configuração ansible localizado em /etc/ansible/ansible.cfg . Primeiro, o comando ansible-config é executado a partir do diretório pessoal do aluno e, em seguida, de um diretório de trabalho com os mesmos resultados:

[user@controlnode ~]$ ansible-config dump -v -\-only-changed
Using /etc/ansible/ansible.cfg as config file
DEFAULT_ROLES_PATH(/etc/ansible/ansible.cfg) = [u'/etc/ansible/roles', u'/usr/share/ansible/roles']
[user@controlnode ~]$ cd /home/student/workingdirectory
[user@controlnode workingdirectory]$ ansible-config dump -v -\-only-changed
Using /etc/ansible/ansible.cfg as config file
DEFAULT_ROLES_PATH(/etc/ansible/ansible.cfg) = [u'/etc/ansible/roles', u'/usr/share/ansible/roles']

No entanto, se você tiver um arquivo ansible.cfg personalizado em seu diretório de trabalho, o mesmo comando exibirá informações com base no local onde ele é executado e no arquivo ansible.cfg relacionado.

[user@controlnode ~]$ ansible-config dump -v -\-only-changed
Using /etc/ansible/ansible.cfg as config file
DEFAULT_ROLES_PATH(/etc/ansible/ansible.cfg) = [u'/etc/ansible/roles', u'/usr/share/ansible/roles']
[user@controlnode ~]$ cd /home/student/workingdirectory
[user@controlnode workingdirectory]$ cat ansible.cfg
[defaults]
inventory = ./inventory
remote_user = devops
[user@controlnode workingdirectory]$ ansible-config dump -v -\-only-changed
Using /home/student/workingdirectory/ansible.cfg as config file
DEFAULT_HOST_LIST(/home/student/workingdirectory/ansible.cfg) = [u'/home/student/workingdirectory/inventory']
DEFAULT_REMOTE_USER(/home/student/workingdirectory/ansible.cfg) = devops

Página do man ansible-config(1)

Configuration file: Ansible Documentation

britho commented 3 years ago

Algumas partes deste curso foram adaptadas do projeto Ansible Lightbulb. O material original desse projeto está disponível em https://github.com/ansible/lightbulb na seguinte seção de licença do MIT:

Copyright 2017 Red Hat, Inc.

A declaração de direitos autorais acima, assim como esta declaração de permissão, deverá ser incluída em todas as cópias ou partes substanciais do software.

Pelo presente instrumento, é dada permissão, livre de encargos, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software") para negociar o Software incluindo, sem limitações, os direitos de usar, copiar, modificar, mesclar, publicar, distribuir, sublicenciar e/ou vender cópias do Software e de autorizar indivíduos a quem o Software for fornecido a fazer o que foi previamente dito, estando sujeitos às seguintes condições:

A declaração de direitos autorais acima, assim como esta declaração de permissão, deverá ser incluída em todas as cópias ou partes substanciais do software.

O SOFTWARE É FORNECIDO NO ESTADO EM QUE SE ENCONTRA, SEM GARANTIAS DE QUALQUER NATUREZA, EXPRESSAS OU IMPLÍCITAS, INCLUINDO, MAS NÃO SE LIMITANDO A, GARANTIAS DE COMERCIABILIDADE, DE ADEQUAÇÃO A UM PROPÓSITO EM PARTICULAR E DE NÃO VIOLAÇÃO. EM HIPÓTESE ALGUMA OS AUTORES OU DETENTORES DOS DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER REIVINDICAÇÃO, DANOS OU OUTRAS OBRIGAÇÕES, SEJA EM UMA AÇÃO CONTRATUAL, ATO CIVIL ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, REFERENTE A OU EM CONEXÃO COM O SOFTWARE, SEU USO OU OUTRAS OPERAÇÕES COMERCIAIS RELACIONADAS AO SOFTWARE.