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.
- 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
- 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
- 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.yml
e ubuntu.yml
separadamente e funcionou, mas quando tento o funcionamento a seco, base.yml
o 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_tasks
por include_tasks
mas 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_cache
isso, 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_tasks
uma 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 template
para 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.