Ich habe einen Host mit 2 Servern: Auf einem ist CentOS und auf dem anderen Ubuntu installiert.
Ich habe beschlossen, Apache, Nginx und PHP-FPM auf beiden Servern zu installieren und habe drei Playbooks geschrieben.
- 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
Meine 3 Ansible-Gruppen sind:
[aws] enthält sowohl den Server
[cent], das den CentOS-Server enthält
[ubun], das den Ubuntu-Server enthält
Ich habe es mit einem Trockenlauf centos.yml
und ubuntu.yml
separat versucht und es hat funktioniert, aber beim Trockenlauf base.yml
wird der folgende Fehler ausgegeben:
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"}
Ich habe bereits versucht, es import_tasks
durch zu ersetzen include_tasks
, aber ich erhalte den gleichen Fehler.
Antwort1
Meine Lösung besteht darin, diese zu einem Spiel zusammenzuführen, da sie dasselbe tun.
---
- 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
Es können nicht mehrere Server auf den Ports 80 und 443 lauschen. Ich habe nginx auskommentiert, da eine Aufgabe fälschlicherweise als „Apache Service Start“ bezeichnet war. Wenn Sie möchten, dass einer der beiden den anderen als Proxy verwendet oder so, müssen Sie eine Konfigurationsdatei bereitstellen, um die Ports zu ändern.
Verwendet die package:
Aktion, die an den eigentlichen Paketmanager delegiert. Ermöglicht die Ausführung einer Paketinstallationsaufgabe auf verschiedenen Betriebssystemen. Das geht nicht update_cache
so, aber Yum benötigt es nicht, wenn Repos hinzugefügt werden, wie es bei Apt der Fall ist.
Die Vars-Struktur besteht aus Wörterbüchern mit betriebssystemfamilienspezifischen Werten. Dadurch können die Paket- und Dienstnamen anhand von Fakten indiziert werden. Betriebssystemfamilie, daher funktioniert dies neben CentOS und Ubuntu auch unter RHEL und Debian.
Die Einrückung war falsch. Modulparameter müssen eine Ebene unter Anweisungen auf Taskebene wie eingerückt werden name:
.
Kann kein include_tasks
komplettes Spiel, das nur mit funktioniert import_playbook
. include_tasks
Es ist einfacher, wenn Sie Rollen haben, die ein Aufgabenverzeichnis für solche Dateien haben. (Aufgaben auf Spielebene gibt es zwar, aber ich bin dafür, dass Rollen alles machen.)
Um dies nutzbar zu machen, ist noch mehr Arbeit nötig.
Wenn Sie zur Installation der Konfiguration verwenden müssen template
, legt EL die Konfigurationen in ab /etc/httpd/
, während sich Debian in befindet /etc/apache2/
.
Viele Webserverrollen sind Open Source, schauen Sie sich das an, wenn Sie Ideen brauchen. Überprüfen SieGalaxis.
Erwägen Sie das Verschieben Ihrer Aufgaben in Rollen, um eine Wiederverwendung zu ermöglichen.
Antwort2
Am besten nimmst du eine Rolle als Beispiel, hier hast du den festen Code:
---
- 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'
centos.yml-Aufgaben:
---
- name: installing httpd
yum: pkg=httpd state=present
ubuntu.yml-Aufgaben:
- name: installing apache2
apt: pkg=apache2 state=present
In den Aufgabendateien benötigen Sie nur die Aufgaben, ohne Hosts, Aufgaben usw.