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?
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
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.
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 }}
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 }}"