Installieren mehrerer Pakete auf mehreren Betriebssystemen mit Ansible

Installieren mehrerer Pakete auf mehreren Betriebssystemen mit Ansible

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.

  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

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.ymlund ubuntu.ymlseparat versucht und es hat funktioniert, aber beim Trockenlauf base.ymlwird 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_tasksdurch 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_cacheso, 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_taskskomplettes Spiel, das nur mit funktioniert import_playbook. include_tasksEs 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.

verwandte Informationen