Stwórz niestandardowy moduł za pomocą Ansible-Python

Moduły Ansible

Ansible dostarcza pewną liczbę modułów (zwanych „biblioteką modułów”), które mogą być wykonywane bezpośrednio na zdalnych hostach lub za pośrednictwem Playbooków.

Użytkownicy mogą również pisać własne moduły. Moduły te mogą kontrolować zasoby systemowe, takie jak usługi, pakiety lub pliki (cokolwiek naprawdę), lub obsługiwać wykonywanie poleceń systemowych.

Dlaczego warto tworzyć własne moduły?

Jak powiedziano wcześniej, ansible ma wiele modułów do wykonywania różnych zadań. Ale różne środowiska mogą mieć różne wymagania, w których wolałbyś mieć własny moduł do obsługi systemu, środowiska lub projektu na swój własny sposób.

Zrozummy, jak możemy stworzyć własny moduł w prosty sposób.

Struktura folderów

Ważne jest, aby znać strukturę folderów i plików, zanim zaczniemy tworzyć własny moduł. Sprawdź poniższy obraz dla odniesienia. To nad czym musimy popracować to main.yaml i testing.py w folderze library.

root@ubuntu:~/ANSIBLEtesting# tree
.
└── playbooks
├── library
│ └── testing.py
└── main.yaml

2 katalogi, 2 pliki

Napisz swój pierwszy program w pythonie

Aby napisać ansible pragmatycznie, musimy zrozumieć narzędzia modułowe. Ansible udostępnia wiele narzędzi modułowych, które zapewniają funkcje pomocnicze, z których można korzystać podczas tworzenia własnych modułów. Narzędzie modułowe testing.py zapewnia główny punkt dostępu do biblioteki Ansible, a wszystkie moduły Ansible muszą, co najmniej, importować z testing.py.

from ansible.module_utils.basic import *

To zaimportuje wszystkie pliki module_utils, aby utworzyć moduł niestandardowy. Format wyjściowy pliku python to tylko JSON. Kiedy więc wydrukujesz dane wyjściowe pliku python, będą one musiały być w formacie JSON.

Kluczowe części obejmują zawsze importowanie kodu boilerplate z ansible.module_utils.basic w ten sposób:

from ansible.module_utils.basic import AnsibleModule
if __name__ == '__main__':
main()

Teraz zainicjuj klasę główną lub możesz pisać bezpośrednio do klasy głównej.

if __name__ == '__main__':
fields = {
"yourName": {"required": True, "type": "str"}
}
module = AnsibleModule(argument_spec=fields)
yourName = os.path.expanduser(module.params)
newName = firstProg(yourName)
module.exit_json(msg=newName)

AnsibleModule dostarcza wiele wspólnego kodu do obsługi zwrotów, parsuje argumenty i pozwala sprawdzać dane wejściowe. Tutaj yourName to dane wejściowe przekazane do pliku python. Dane wejściowe zostaną pobrane z ansible playbook.

Powodzenia są wykonywane w ten sposób:

module.exit_json(changed=True, something_else=12345)

A porażki są tak samo proste (gdzie msg jest wymaganym parametrem wyjaśniającym błąd):

module.fail_json(msg="Something fatal happened")

Ostateczny program w pythonie wygląda tak

#!/bin/env python
from ansible.module_utils.basic import *
import os, json
import re, sysdef firstProg(text):
text1 = "Hello " + text
return text1if __name__ == '__main__':
fields = {
"yourName": {"required": True, "type": "str"}
}
module = AnsibleModule(argument_spec=fields)
yourName = os.path.expanduser(module.params)
newName = firstProg(yourName)
module.exit_json(msg=newName)

Przygotuj swój playbook

Pamiętaj, że użyjemy nazwy niestandardowego modułu, takiej samej jak nazwa pliku pythona.

- hosts: all
remote_user: root
gather_facts: yes vars_prompt:
- name: giveName
prompt: "Please provide your name"
private: no
failed_when: giveName is undefined tasks:
- name: Python Execution
testing: yourName={{ giveName }}
register: result
- debug: var=result

Tutaj vars_prompt zapyta Cię o nazwę, a moduł testujący w zadaniu przekaże tę nazwę do skryptu pythona. Czy domyślasz się, jakie będzie wyjście? Sprawdźmy.

ansible-playbook main.yaml

Wnioski

Więcej szczegółów na temat modułów niestandardowych można znaleźć w dokumentacji Ansible. Z modułami niestandardowymi można zrobić o wiele więcej.

Ten artykuł został zaczerpnięty bezpośrednio z www.9tocloud.com

.