| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung |
| centos:ansible:detail [08.01.2020 22:21. ] – [playbook - Beispiel] django | centos:ansible:detail [24.09.2022 14:26. ] (aktuell) – gelöscht django |
|---|
| ====== Ansible - Erweiterte Konfigurationsbeispiele ====== | |
| {{:centos:ansible:ansible_logo.png?nolink&125|Bild: Ansible Logo}} \\ \\ | |
| |
| Nachdem wir uns bereits eingehend mit den **[[centos:ansible:start#grundlagen|Grundlagen]]**, mit der **[[centos:ansible:start#installation|Installation von Ansible]]** und auch schon mit der Grundkonfiguration beschäftigt sowie erste Erfahrungen mit **[[centos:ansible:first#playbook_-_beispiele|Playbooks]]** gesammelt haben, wollen wir uns nun mit der tiefergehenden Konfiguration von Ansible beschäftigen. | |
| |
| ===== Inventory ===== | |
| Zur Verwaltung/Inventarisierung von mehreren Knoten oder Hosts in unserer Infrastrukturumgebung verwendet Ansible Listen oder eine Gruppe von Listen, die man als **Inventory** bezeichnet. Im einfachsten Fall beschreibt solch eine Inventory-Datei lediglich Hosts und/oder deren Hostnamen bzw. IP-Adressen. Auf der anderen Seite kann man aber auch komplexe Landschaften abbilden und Eigenschaften einzelnen Hosts und /oider Gruppe zuordnen. | |
| |
| Im Kapitel **[[centos:ansible:first#remote_user-anpassung_via_inventory_hostsyml|erweiterte Konfiguration - Anpassungen "Inventory hosts.yml"]]** hatten wir uns schon einmal kurz mit dem Thema **Inventory** beschäftigt. In den nachfolgenden Beispielen wollen wir nun intensiver auf Details dazu eingehen. | |
| |
| Im Kapitel **[[https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html|How to build your inventory]]** der Ansible-Onlinedoku finden sich dazu vile tiefergehende Informationen. | |
| |
| {{page>centos:ansible:hosts&nofooter&showheader}} | |
| |
| |
| ==== hosts.yml ==== | |
| Im Kapitel **[[centos:ansible:first#remote_user-anpassung_via_inventory_hostsyml|erweiterte Konfiguration - Anpassungen "Inventory hosts.yml"]]** hatten wir uns schon einmal kurz mit dem Thema **Inventory** beschäftigt. | |
| |
| In der Ansible-Konfigurationsdatei **''/etc/ansible/ansible.cfg''** zeigt zu Beginn der default-Eintrag auf die vorgenannte Datei **[[#etc_ansible_hosts|/etc/ansible/hosts]]**. | |
| |
| <code> ... | |
| |
| [defaults] | |
| |
| # some basic default values... | |
| |
| #inventory = /etc/ansible/hosts | |
| ... | |
| </code> | |
| |
| Unsere erweiterte YAML-Konfigurationsdatei für die Hosts wolen wir aber künftig in der Ansible-Administationsumgebung unseres Admin-Users vorhalten und pflegen. Im Beispiel unseres Adminusers **django** wäre dies entsprechend der Pfad **''/home/django/ansible/hosts.yml''** | |
| |
| Wir hinterlegen also dort, dass zukünftig die Inventory-Datei **''hosts.yml''** eingelesen und ausgewertet werden soll. | |
| # vim /etc/ansible/ansible.cfg | |
| |
| <code>[defaults] | |
| |
| # some basic default values... | |
| |
| # Django : 2020-01-01 | |
| # default: #inventory = /etc/ansible/hosts | |
| inventory = /home/django/ansible/hosts.yml | |
| </code> | |
| |
| === inventory - Beispiel === | |
| Dort legen wir uns unsere erweiteret Host-Datei im YAML-Format an. | |
| $ vim /home/django/ansible/hosts.yml> | |
| |
| <file bash /home/django/ansible/hosts.yml>--- #YAML start syntax (optional) | |
| all: | |
| hosts: # nicht zugeordnete Hosts | |
| n3r0.intra.nausch.org: | |
| g33k.intra.nausch.org: | |
| children: # Untermenge/-gruppe aller Hosts | |
| centos8: # Gruppe der definierten CentOS 8 Hosts | |
| vars: # Variablen, die für die ganze Gruppe gelten | |
| ansible_ssh_port: 22 | |
| ansible_ssh_user: ansible | |
| ansible_ssh_private_key_file: /home/django/.ssh/id_ed25519_ansible | |
| hosts: # Liste aller Hosts die dieser gruppe zugehören | |
| www8.dmz.nausch.org: | |
| ansible_ssh_host: 10.0.0.90 # Hostspezifische Ansible-Systemvariable | |
| centos7: # Gruppe der definierten CentOS 7 Hosts | |
| vars: # Variablen, die für die ganze Gruppe gelten | |
| ansible_ssh_port: 22 | |
| ansible_ssh_user: ansible | |
| ansible_ssh_private_key_file: /home/django/.ssh/id_rsa_ansible | |
| hosts: # Liste aller Hosts die dieser gruppe zugehören | |
| www7.dmz.nausch.org: | |
| ansible_ssh_host: 10.0.0.97 # Hostspezifische Ansible-Systemvariable | |
| # optische Abtrennung zu nachfolgenden Definitionen | |
| ffmucgluon: # Definition der Gruppe aaler Freifunk Knoten/Hosts | |
| vars: # Variablen, die für die ganze Gruppe gelten | |
| ansible_ssh_port: 22 | |
| ansible_ssh_user: root | |
| ansible_ssh_private_key_file: /home/django/.ssh/id_rsa4096_freifunk_2014 | |
| contact_info: 'Django [BOfH] | django@nausch.org | chat -> @django' | |
| hosts: # Liste aller Hosts die dieser gruppe zugehören | |
| ff_pliening_gbw_ug: # Host | |
| hostname: ff_pliening_gbw_ug # Hostspezifische Informationen / Variablen | |
| latitude: -48.19861319429455 | |
| longitude: -168.2017571420684 | |
| branch: stable | |
| domain: ffmuc_muc_ost | |
| director: ffmuc_muc_ost | |
| modell: TP-Link TL-WDR4300 v1 | |
| ansible_ssh_host: 2001:608:a01:102:32b5:c2ff:fe56:62b1 | |
| |
| ff_pliening_gbw_egod: # Host | |
| hostname: ffplieninggbwegod # Hostspezifische Informationen / Variablen | |
| pretty_hostname: ff_pliening_gbw_egod | |
| latitude: 48.198652080 | |
| longitude: 11.797969940 | |
| branch: stable | |
| domain: ffmuc_muc_ost | |
| director: ffmuc_muc_ost | |
| modell: Ubiquiti UniFi-AC-MESH | |
| ansible_ssh_host: 2001:608:a01:102:1ae8:29ff:fea9:22ed | |
| |
| ff_pliening_gbw_ogod: # Host | |
| hostname: ffplieninggbwogod # Hostspezifische Informationen / Variablen | |
| pretty_hostname: ff_pliening_gbw_ogod | |
| latitude: 48.198699460 | |
| longitude: 11.798053090 | |
| branch: stable | |
| domain: ffmuc_muc_ost | |
| director: ffmuc_muc_ost | |
| modell: Ubiquiti UniFi-AC-MESH | |
| ansible_ssh_host: 2001:608:a01:102:1ae8:29ff:fec0:aaae | |
| |
| ff_pliening_gbw_dgod: # Host | |
| hostname: ffplieninggbwdgod # Hostspezifische Informationen / Variablen | |
| prettyhostname: ff_pliening_gbw_dgod | |
| latitude: 48.198671230 | |
| longitude: 11.798122820 | |
| branch: stable | |
| domain: ffmuc_muc_ost | |
| director: ffmuc_muc_ost | |
| modell: Ubiquiti UniFi-AC-MESH | |
| ansible_ssh_host: 2001:608:a01:102:1ae8:29ff:fec6:c8eb | |
| |
| ff_pliening_gbw_cpod: # Host | |
| hostname: ffplieninggbwcpod # Hostspezifische Informationen / Variablen | |
| pretty_hostname: ff_pliening_gbw_cpod | |
| latitude: 48.198726280 | |
| longitude: 11.798159030 | |
| branch: stable | |
| domain: ffmuc_muc_ost | |
| director: ffmuc_muc_ost | |
| modell: Ubiquiti UniFi-AC-MESH | |
| ansible_ssh_host: 2001:608:a01:102:1ae8:29ff:fec6:c8dd | |
| |
| ff_pliening_gbw_kvm_ol: # Host | |
| hostname: ffplieninggbwkvmol # Hostspezifische Informationen / Variablen | |
| pretty_hostname: ff_pliening_gbw_kvm_ol | |
| latitude: 48.198646720 | |
| longitude: 11.798047720 | |
| branch: stable | |
| domain: ffmuc_muc_ost | |
| director: ffmuc_muc_ost | |
| modell: Red Hat KVM | |
| ansible_ssh_host: 2001:608:a01:102:5054:ff:fe9e:b358 | |
| |
| ... #YAML end syntax</file> | |
| |
| |
| Die YAML-Konfigurationsdatei enthält entsprechende Bemerkungen, die die einzelnen Blöcke und Funktionen ausreichend beschreiben. Wie können so individuelle und Anwendungsspezifische Lösungen abbilden. | |
| |
| <WRAP center round info 100%> | |
| Natürlich gilt zu bedenken, dass das gezeigte Beispiel mit nur 8 Hosts und überschaubaren Variablen doch schon recht umfangreich geworden ist, wenn dies alles in eine Inventory-Datei gepackt wird. Bei Dutzenden oder Hunderten von Maschinen wird dies dann daraus schwer zu handeln - von verschachtelten Gruppen in Gruppen, oder Host die Mitglied in mehreren Gruppen sein sollen, sprechen wir dann besser gar nicht. Hier werden wir später auf eine andere/aufgeteilte Lösung einschwenken müssen. | |
| </WRAP> | |
| |
| /* Viele Hinweise und Beispiel zu den Gruppen finden sich auch hier im Kapitel **[[https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html|How to build your inventory]]** der Ansible Dokumentation enthalten.*/ | |
| |
| === playbook === | |
| Unsere gerade angelegte Inventory-Datei wollen wir nun verwenden um die Geolocation-Daten unserer Freifunk-Knoten zu organisieren. Die Geodaten sind in der obigen Inventory-Datei in den beiden Variablen **''latitude''** und **''longitude''** gespeichert - diese beiden Variablen nutzen wir nun in unserem Playbook. | |
| $ ~/ansible/08_set_location.yml | |
| |
| <file bash ~/ansible/08_set_location.yml> | |
| --- | |
| - hosts: ffmucgluon | |
| gather_facts: False | |
| |
| tasks: | |
| - name: "Set GEO location of our own ffmuc-nodes" | |
| #https://docs.ansible.com/ansible/latest/modules/raw_module.html | |
| raw: uci set gluon-node-info.@location[0]="location"; uci set gluon-node-info.@location[0].share_location="1"; uci set gluon-node-info.@location[0].latitude="{{ latitude }}" ; uci set gluon-node-info.@location[0].longitude="{{ longitude }}"; uci commit gluon-node-info</file> | |
| |
| === Script ausführen === | |
| Nun wollen wir unser ersten Playbook ausführen, um die Geodaten aus der Inventory-Datei auf unseren Freifunk-Knoten abzugleichen; hierzu rufen wir unser Script wie folgt auf: | |
| $ ansible-playbook -v 08_change_contact.yml | |
| |
| <html><pre class="code"> | |
| <font style="color: rgb(43, 100, 164)">Using /etc/ansible/ansible.cfg as config file</font> | |
| <font style="color: rgb(0, 0, 0)">BECOME password: | |
| |
| PLAY [ffmucgluon] ********************************************************************************************************************** | |
| |
| <font style="color: rgb(0, 0, 0)">TASK [Update new contact-address on own ffmuc-nodes] ***********************************************************************************</font> | |
| <font style="color: rgb(196, 160, 0)">changed: [ff_pliening_gbw_egod] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:1ae8:29ff:fea9:22ed closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:1ae8:29ff:fea9:22ed closed."], "stdout": "", "stdout_lines": []} | |
| changed: [ff_pliening_gbw_kvm_ol] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:5054:ff:fe9e:b358 closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:5054:ff:fe9e:b358 closed."], "stdout": "", "stdout_lines": []} | |
| changed: [ff_pliening_gbw_ogod] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:1ae8:29ff:fec0:aaae closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:1ae8:29ff:fec0:aaae closed."], "stdout": "", "stdout_lines": []} | |
| changed: [ff_pliening_gbw_ug] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:32b5:c2ff:fe56:62b1 closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:32b5:c2ff:fe56:62b1 closed."], "stdout": "", "stdout_lines": []} | |
| changed: [ff_pliening_gbw_dgod] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:1ae8:29ff:fec6:c8eb closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:1ae8:29ff:fec6:c8eb closed."], "stdout": "", "stdout_lines": []} | |
| changed: [ff_pliening_gbw_cpod] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:1ae8:29ff:fec6:c8dd closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:1ae8:29ff:fec6:c8dd closed."], "stdout": "", "stdout_lines": []}</font><br> | |
| <font style="color: rgb(0, 0, 0)">PLAY RECAP *****************************************************************************************************************************</font> | |
| <font style="color: rgb(196, 160, 0)">ff_pliening_gbw_cpod </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=1 </font><font style="color: rgb(196, 160, 0)">changed=1 </font><font style="color: rgb(0, 0, 0)">unreachable=0 failed=0 skipped=0 rescued=0 ignored=0</font> | |
| <font style="color: rgb(196, 160, 0)">ff_pliening_gbw_dgod </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=1 </font><font style="color: rgb(196, 160, 0)">changed=1 </font><font style="color: rgb(0, 0, 0)">unreachable=0 failed=0 skipped=0 rescued=0 ignored=0</font> | |
| <font style="color: rgb(196, 160, 0)">ff_pliening_gbw_egod </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=1 </font><font style="color: rgb(196, 160, 0)">changed=1 </font><font style="color: rgb(0, 0, 0)">unreachable=0 failed=0 skipped=0 rescued=0 ignored=0</font> | |
| <font style="color: rgb(196, 160, 0)">ff_pliening_gbw_kvm_ol </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=1 </font><font style="color: rgb(196, 160, 0)">changed=1 </font><font style="color: rgb(0, 0, 0)">unreachable=0 failed=0 skipped=0 rescued=0 ignored=0</font> | |
| <font style="color: rgb(196, 160, 0)">ff_pliening_gbw_ogod </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=1 </font><font style="color: rgb(196, 160, 0)">changed=1 </font><font style="color: rgb(0, 0, 0)">unreachable=0 failed=0 skipped=0 rescued=0 ignored=0</font> | |
| <font style="color: rgb(196, 160, 0)">ff_pliening_gbw_ug </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=1 </font><font style="color: rgb(196, 160, 0)">changed=1 </font><font style="color: rgb(0, 0, 0)">unreachable=0 failed=0 skipped=0 rescued=0 ignored=0</font> | |
| <br></pre> | |
| </html> | |
| |
| ==== Inventarisierung größerer Umgebungen ==== | |
| |
| FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME | |
| |
| |
| |
| |
| |
| |
| /* | |
| |
| <file bash 08_set_location.yml> | |
| --- | |
| - hosts: ffmucgluon | |
| gather_facts: False | |
| |
| tasks: | |
| - name: "Set GEO location of our own ffmuc-nodes" | |
| #https://docs.ansible.com/ansible/latest/modules/raw_module.html | |
| raw: uci set gluon-node-info.@location[0]="location"; uci set gluon-node-info.@location[0].share_location="1"; uci set gluon-node-info.@location[0].latitude="{{ latitude }}" ; uci set gluon-node-info.@location[0].longitude="{{ longitude }}"; uci commit gluon-node-info | |
| </file> | |
| |
| |
| |
| |
| |
| <file bash /etc/ansible/hosts.yml>--- #YAML start syntax (optional) | |
| |
| centos8: | |
| vars: | |
| ansible_ssh_port: 22 | |
| ansible_ssh_user: ansible | |
| ansible_ssh_private_key_file: /home/django/.ssh/id_ed25519_ansible | |
| hosts: | |
| www8.dmz.nausch.org: | |
| ansible_ssh_host: 10.0.0.90 | |
| |
| centos7: | |
| vars: | |
| ansible_ssh_port: 22 | |
| ansible_ssh_user: ansible | |
| ansible_ssh_private_key_file: /home/django/.ssh/id_rsa_ansible | |
| hosts: | |
| www7.dmz.nausch.org: | |
| ansible_ssh_host: 10.0.0.97 | |
| |
| ffmucgluon: | |
| vars: | |
| ansible_ssh_port: 22 | |
| ansible_ssh_user: root | |
| ansible_ssh_private_key_file: /home/django/.ssh/id_rsa4096_freifunk_2014.pub | |
| contact_info: 'Django [BOfH] | django@nausch.org | chat -> @django' | |
| hosts: | |
| ff_pliening_gbw_ug: | |
| hostname: ff_pliening_gbw_ug | |
| latitude: -48.19861319429455 | |
| longitude: -168.2017571420684 | |
| branch: stable | |
| domain: ffmuc_muc_ost | |
| director: ffmuc_muc_ost | |
| modell: TP-Link TL-WDR4300 v1 | |
| ansible_ssh_host: 2001:608:a01:102:32b5:c2ff:fe56:62b1 | |
| |
| ff_pliening_gbw_egod: | |
| hostname: ffplieninggbwegod | |
| pretty_hostname: ff_pliening_gbw_egod | |
| latitude: 48.198652080 | |
| longitude: 11.797969940 | |
| branch: stable | |
| domain: ffmuc_muc_ost | |
| director: ffmuc_muc_ost | |
| modell: Ubiquiti UniFi-AC-MESH | |
| ansible_ssh_host: 2001:608:a01:102:1ae8:29ff:fea9:22ed | |
| |
| ff_pliening_gbw_ogod: | |
| hostname: ffplieninggbwogod | |
| pretty_hostname: ff_pliening_gbw_ogod | |
| latitude: 48.198699460 | |
| longitude: 11.798053090 | |
| branch: stable | |
| domain: ffmuc_muc_ost | |
| director: ffmuc_muc_ost | |
| modell: Ubiquiti UniFi-AC-MESH | |
| ansible_ssh_host: 2001:608:a01:102:1ae8:29ff:fec0:aaae | |
| |
| ff_pliening_gbw_dgod: | |
| hostname: ffplieninggbwdgod | |
| prettyhostname: ff_pliening_gbw_dgod | |
| latitude: 48.198671230 | |
| longitude: 11.798122820 | |
| branch: stable | |
| domain: ffmuc_muc_ost | |
| director: ffmuc_muc_ost | |
| modell: Ubiquiti UniFi-AC-MESH | |
| ansible_ssh_host: 2001:608:a01:102:1ae8:29ff:fec6:c8eb | |
| |
| ff_pliening_gbw_cpod: | |
| hostname: ffplieninggbwcpod | |
| pretty_hostname: ff_pliening_gbw_cpod | |
| latitude: 48.198726280 | |
| longitude: 11.798159030 | |
| branch: stable | |
| domain: ffmuc_muc_ost | |
| director: ffmuc_muc_ost | |
| modell: Ubiquiti UniFi-AC-MESH | |
| ansible_ssh_host: 2001:608:a01:102:1ae8:29ff:fec6:c8dd | |
| |
| ff_pliening_gbw_kvm_ol: | |
| hostname: ffplieninggbwkvmol | |
| pretty_hostname: ff_pliening_gbw_kvm_ol | |
| latitude: 48.198646720 | |
| longitude: 11.798047720 | |
| branch: stable | |
| domain: ffmuc_muc_ost | |
| director: ffmuc_muc_ost | |
| modell: Red Hat KVM | |
| ansible_ssh_host: 2001:608:a01:102:5054:ff:fe9e:b358 | |
| |
| ... #YAML end syntax</file> | |
| |
| $ ansible-playbook -v 08_set_location.yml | |
| <code>$ ansible-playbook -v 08_set_location.yml | |
| Using /etc/ansible/ansible.cfg as config file | |
| BECOME password: | |
| |
| PLAY [ffmucgluon] **************************************************************************************************************************************************************** | |
| |
| TASK [Set GEO location of our own ffmuc-nodes] *********************************************************************************************************************************** | |
| changed: [ff_pliening_gbw_egod] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:1ae8:29ff:fea9:22ed closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:1ae8:29ff:fea9:22ed closed."], "stdout": "", "stdout_lines": []} | |
| changed: [ff_pliening_gbw_dgod] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:1ae8:29ff:fec6:c8eb closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:1ae8:29ff:fec6:c8eb closed."], "stdout": "", "stdout_lines": []} | |
| changed: [ff_pliening_gbw_ogod] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:1ae8:29ff:fec0:aaae closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:1ae8:29ff:fec0:aaae closed."], "stdout": "", "stdout_lines": []} | |
| changed: [ff_pliening_gbw_cpod] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:1ae8:29ff:fec6:c8dd closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:1ae8:29ff:fec6:c8dd closed."], "stdout": "", "stdout_lines": []} | |
| changed: [ff_pliening_gbw_ug] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:32b5:c2ff:fe56:62b1 closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:32b5:c2ff:fe56:62b1 closed."], "stdout": "", "stdout_lines": []} | |
| changed: [ff_pliening_gbw_kvm_ol] => {"changed": true, "rc": 0, "stderr": "Shared connection to 2001:608:a01:102:5054:ff:fe9e:b358 closed.\r\n", "stderr_lines": ["Shared connection to 2001:608:a01:102:5054:ff:fe9e:b358 closed."], "stdout": "", "stdout_lines": []} | |
| |
| PLAY RECAP *********************************************************************************************************************************************************************** | |
| ff_pliening_gbw_cpod : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 | |
| ff_pliening_gbw_dgod : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 | |
| ff_pliening_gbw_egod : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 | |
| ff_pliening_gbw_kvm_ol : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 | |
| ff_pliening_gbw_ogod : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 | |
| ff_pliening_gbw_ug : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 | |
| </code> | |
| |
| https://gerardnico.com/infra/ansible/start | |
| */ | |