Instalando vários pacotes em vários sistemas operacionais com Ansible

Instalando vários pacotes em vários sistemas operacionais com Ansible

Tenho um host com 2 servidores: um tem CentOS e outro Ubuntu instalado.

Decidi instalar Apache, nginx e php-fpm em ambos os servidores e escrevi 3 manuais.

  1. ubuntu.yml (/home/ansible/playbook):
---
- name: Ubuntu Playbook
  hosts: ubun
  become: true
  vars:
   - packages:
     - nginx
     - apache2
     - php-fpm 
  tasks:
   - name: Update apt package
   apt:
   name: "*"
   state: latest
   update_cache: yes
   - name: Install Packages
     apt:
       pkg: "{{ packages }}"
       state: latest
       update_cache: yes
   - name: Apache Service Start
     service:
       name: nginx
       state: restarted
       enabled: yes
  1. centos.yml (/home/ansible/playbook):
---
- name: CentOS Playbook
  hosts: cent
  become: true
  vars:
   packages:
   - epel-release
   - httpd
   - nginx
   - php-fpm
  tasks:
   - name: Update yum package
     yum:
       name: "*"
       state: latest
       update_cache: yes
   - name: Install Packages
     yum:
       name: "{{ packages }}"
       state: latest
       update_cache: yes
   - name: Apache Service Start
     service:
       name: nginx
       state: restarted
       enabled: yes
  1. base.yml (/home/ansible/playbook):
---
- name: Base Playbook
  hosts: aws
  become: true
  tasks:
    - name: Performing Tasks for CentOS
      when: ansible_facts['distribution'] == 'CentOS'
      include_tasks: centos.yml
    - name: Performing Tasks for Ubuntu
      when: ansible_facts['distribution'] == 'Ubuntu'
      include_tasks: ubuntu.yml

Meus 3 grupos Ansible são:

  • [aws] que contém o servidor

  • [cent] que contém o servidor CentOS

  • [ubun] que contém o servidor Ubuntu

Tentei o funcionamento a seco centos.ymle ubuntu.ymlseparadamente e funcionou, mas quando tento o funcionamento a seco, base.ymlo seguinte erro é gerado:

    FAILED! => {"reason": "unexpected parameter type in action: <class 'ansible.parsing.yaml.objects.AnsibleSequence'>\n\nThe error appears to be in '/home/ansible/playbook/centos.yml': line 2, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n---\n- name: CentOS Playbook\n  ^ here\n"}

    FAILED! => {"reason": "unexpected parameter type in action: <class 'ansible.parsing.yaml.objects.AnsibleSequence'>\n\nThe error appears to be in '/home/ansible/playbook/ubuntu.yml': line 2, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n---\n- name: Ubuntu Playbook\n  ^ here\n"}

Já tentei substituir import_taskspor include_tasksmas recebo o mesmo erro.

Responder1

Minha solução é fundi-los em uma única peça, pois eles fazem a mesma coisa.

---
- name: php-fpm play
  hosts: aws
  become: true
  vars:
  - repo:
      Debian:
      - apt # already installed, but need something here
      RedHat:
      - epel-release
  - packages:
      Debian:
      - apache2
      #- nginx # cannot have 2 listening on port 80
      - php-fpm
      RedHat:
      - httpd
      #- nginx
      - php-fpm
  - services:
      Debian: apache2
      RedHat: httpd

  tasks:
     # TODO move update * task to different play

   - name: Install repo
     # Seperate package transaction for EPEL
     # so it is available in the next task
     package:
       name: "{{ repo[ansible_os_family] }}"

   - name: Install Web Server Packages
     # Keyed by OS family fact to also support RHEL and Debian
     package:
       name: "{{ packages[ansible_os_family] }}"
       state: latest

   - name: Web Service Start
     service:
       name: "{{ services[ansible_os_family] }}"
       state: restarted
       enabled: yes

Não é possível ter vários servidores escutando nas portas 80 e 443. Comentei o nginx, pois uma tarefa foi rotulada incorretamente como "Apache Service Start". Se você quiser um desses proxy para o outro ou algo assim, você precisará implantar um arquivo de configuração para alterar as portas.

Usou a package:ação que delega ao gerenciador de pacotes real. Permite que uma tarefa de instalação de pacote seja executada em sistemas operacionais diferentes. Não é possível fazer update_cacheisso, mas o yum não precisa disso ao adicionar repositórios como o apt.

A estrutura Vars é ditada por valores específicos da família do sistema operacional. Isso permite que os nomes dos pacotes e serviços sejam indexados por fatos. Família de sistemas operacionais, então isso também funciona no RHEL e Debian, além de CentOS e Ubuntu.

O recuo estava errado. Os parâmetros dos módulos precisam ser recuados um nível abaixo das diretivas de nível de tarefa, como name:.

Não é possível include_tasksuma peça inteira, isso só funciona com arquivos import_playbook. include_tasksé mais fácil quando você tem funções, que possuem um diretório de tarefas para esses arquivos. (As tarefas no nível do jogo são uma coisa, mas sou a favor de que os papéis façam tudo.)


Ainda há mais trabalho para tornar isso útil.

Quando você precisa usar templatepara instalar a configuração, o EL coloca as configurações em /etc/httpd/, enquanto o Debian está em /etc/apache2/.

Muitas funções de servidor da web são de código aberto, para você verificar se quiser ideias. VerificarGaláxia.

Considere mover suas tarefas para funções, permitindo a reutilização.

Responder2

É melhor se você tomar um papel como exemplo, aqui você tem o código fixo:

---

- hosts: aws
  remote_user: myuser
  become: true
  tasks:
  - name: Performing Tasks for CentOS
    include_tasks: centos.yml
    when: ansible_facts['distribution'] == 'CentOS'
  - name: Performing Tasks for Ubuntu
    include_tasks: ubuntu.yml
    when: ansible_facts['distribution'] == 'Ubuntu'

tarefas centos.yml:

---

- name: installing httpd
  yum: pkg=httpd state=present

Tarefas do ubuntu.yml:


- name: installing apache2
  apt: pkg=apache2 state=present

Nos arquivos de tarefas, você só precisa das tarefas, sem hosts, tarefas e assim por diante.

informação relacionada