webentwicklung-frage-antwort-db.com.de

Kann man in Ansible Playbook-globale Variablen definieren?

Ich habe ein großes Ansible-Playbook, in dem Docker-Bilder erstellt werden, wenn Sie es ausführen. Ich verwende eine steigende Anzahl als Tag, um sie zu versionieren. Derzeit muss ich dies in jedem hosts:-Abschnitt angeben.

Ich weiß, dass es globale Variablen gibt, aber von dem, was ich bei der Suche nach "ansprechbaren" "globalen Variablen" gefunden habe, müssen sie außerhalb des Spielbuchs definiert werden. Kann man globale Variablen definieren, die für das Spielbuch global sind?

38
rabejens

Wenn das von Ihnen verwendete Tag/die Version auf alle Hosts anwendbar ist, ist die Verwendung von group_vars/all eine praktikable Option. 

Wenn die Revisionsnummern spezifisch für jeden Host sind, sind die Einträge in einer Host_vars/Host_name-Datei möglicherweise besser. 

Wenn Sie var lesen und initialisieren und dann nach jedem Spiel inkrementieren möchten, wird es schwieriger, diese Informationen über alle Spiele (oder jeden einzelnen davon wie Sie sagen) im Spielbuch zu speichern. Wenn Sie beispielsweise N Docker-Instanzen bereitstellen möchten, können Sie eine dynamische Bestandsmagie wie folgt durchführen:

- hosts: localhost
  tasks:
  - add_Host: name=docker_{{item}} groups="dockers,other" tag={{item}}
    with_sequence: start={{ext_def_start}} count={{ext_def_num}}


- hosts: docker_*
  tasks:
  - debug: var=tag
15
Petro026

Ansible hat eine Standardgruppe all, die alle Hosts in der Inventardatei enthält.

Als solches können Sie mit beliebigen Host-Gruppen arbeiten und group_vars für die Host-Gruppe angeben.

Wie im vorherigen Link gezeigt, können diese direkt in der Inventardatei definiert werden oder in einer separaten Datei nach der Gruppe in einem Verzeichnis group_vars auf derselben Verzeichnisebene wie die Inventardatei enthalten sein.

Eine Beispielverzeichnisstruktur könnte dann etwa wie folgt aussehen:

-ansible
 |--inventory
 |  |--group_vars
 |  |  |--all
 |  |  |--dev
 |  |  |--test
 |  |  |--prod
 |  |  |--webservers
 |  |  |--databases
 |  |--dev
 |  |--test
 |  |--prod
 |--roles
  ...

Ihre Inventardatei könnte dann etwa so aussehen:

[dev:children]
webservers
databases

[webservers]
web1.dev
web2.dev

[databases]
database-master.dev
database-slave.dev

Alle diese Hosts nehmen jetzt jede Host-spezifische Konfiguration auf (die entweder in line definiert werden kann oder genau wie bei group_vars in einen Host_vars-Ordner gestellt werden kann) und auch config für die spezifischen Gruppen, in denen sie enthalten sind, wie webservers und dann Gruppen, die sie auch von dev erben, standardmäßig aber all.

Dies kann dann verwendet werden, um Dinge gröber als pro Host zu konfigurieren.

Dinge wie NTP -Server möchten möglicherweise in allen definiert werden, während DNS-Server auf Umgebungsebene definiert werden sollen (wenn Ihr Netzwerk in dev, test und production unterteilt ist, benötigen Sie möglicherweise andere DNS-Servereinstellungen in /etc/resolv.conf.) ), während verschiedene Servertypen unterschiedliche Konfigurationen aufweisen können, z. B. Listen von zu installierenden Paketen. Schließlich müssen einige Dinge Host-spezifisch sein, beispielsweise das Festlegen der MySQL-Server-ID in einer Replikationsgruppe.

Wenn Sie stattdessen nur die globalen Einstellungen für das Playbook definieren möchten und nicht für das gesamte Inventar gelten (und damit auch andere Playbooks darauf zugreifen könnten), benötigen Sie einfach einen vars-Block in Ihrer play -Definition wie folgt:

- hosts: webservers
  vars:
    http_port: 80
  tasks:
    - name: Task1 to be ran against all the webservers
      ...

Wie bereits erwähnt, können Sie auch hier die Gruppe all verwenden:

- hosts: all
  vars:
    ntp_pool:
      - ntp1.domain
      - ntp2.domain
  tasks:
    - name: Task1 to be ran against all the servers
      ...

Im Allgemeinen würde ich jedoch dringend die Verwendung von Rollen empfehlen, um zu strukturieren, welche Elemente auf bestimmten Hosts ausgeführt werden, und dann das Inventar zu verwenden, um anzugeben, welche Server welcher Typ sind, und dann ein group_vars-Verzeichnis auf Inventarebene zu verwenden, um alle Variablen für diese Gruppen von zu enthalten Gastgeber Auf diese Weise können Sie Dinge an sinnvollen Orten aufbewahren und die Codebasis leicht wiederverwenden.

15
ydaetskcoR

Ja, globale Variablen sind auf diese Weise möglich.

beispiel für ein Splunk-Setup-Playbook

splunk/
   setup_splunk_playbook.yaml
   roles/base
           /tasks/main.yaml
           /tasks/install.yaml
         search_head
           /tasks/configure.yaml
         indexer
           /tasks/configure.yaml
         some_other_role
           /tasks/some_task.yaml
   hosts
   config.yaml

Platzieren Sie Ihre Variablen in config.yaml

cat splunk/config.yaml

--- 
# global Splunk variables
splunk_version: 7.0.0

fügen Sie die Rollen in Ihr Spielbuch ein

cat setup_splunk_playbook.yaml

- hosts: "search_heads"  
  become_user: root
  become: true
  gather_facts: true

  roles:
    - base
    - search_head

schließen Sie in Ihrer Rolle die globalen Variablen in eine Aufgabe ein

Katzenrollen/Basis/Aufgaben/main.yaml

---
# install Splunk Base

- name: include vars
  include_vars: "{{ playbook_dir }}/config.yaml"

- include: install.yaml

vars sind jetzt in Aufgaben verfügbar,

katzenrollen/base/task/install.yaml

- name: echo version
  debug: splunk version is {{ splunk_version }}
0
perfecto25

Ich weiß, dass dies die Anfrage von OP möglicherweise nicht genau beantwortet, aber für Leute, die globale Variablen (Listen/Arrays) so einstellen, dass sie nicht in jeder Aufgabe festgelegt werden müssen, ist dies möglicherweise praktisch.

Es ist überraschend einfach. Angenommen, Sie haben eine Liste von Domänen, die Sie übergeben müssen. Ich habe die Variable als doof bezeichnet, nur um anzuzeigen, dass dies alles sein könnte.

- hosts: [yourhostlistgoeshere]
  remote_user: root
  vars:
    domainslisto:
       - site1.com
       - website2.xyz

....



  tasks:
    - name: copy vhosts
      template: src=virtualhost.conf dest=/etc/Apache2/sites-available/{{ item }}.conf
      with_items: "{{ domainslisto }}"

    - name: a2ensite {{ item }}
      command: a2ensite {{ item }}
      with_items: "{{ domainslisto }}"
0