Jak pracować ze zmiennymi i faktami Ansible — część 8
Wspomnieliśmy o zmiennych w tej serii Ansible, żeby trochę pobudzić umysł. Zmienna, podobnie jak w wielu językach programowania, jest zasadniczo kluczem reprezentującym wartość.
Co stanowi prawidłową nazwę zmiennej?
Nazwa zmiennej zawiera litery, cyfry, podkreślenia lub kombinację 2 lub wszystkich z nich. Należy jednak pamiętać, że nazwa zmiennej musi zawsze zaczynać się od litery i nie powinna zawierać spacji.
Przyjrzyjmy się kilku przykładom prawidłowych i niedopuszczalnych nazw zmiennych:
Prawidłowe przykłady nazw zmiennych:
football
foot_ball
football20
foot_ball20
Przykłady nieprawidłowych nazw zmiennych:
foot ball
20
foot-ball
Omówmy typy zmiennych:
1. Zmienne podręcznika
Zmienne Podręcznika są dość łatwe i proste. Aby zdefiniować zmienną w podręczniku, po prostu użyj słowa kluczowego vars przed zapisaniem zmiennych z wcięciem.
Aby uzyskać dostęp do wartości zmiennej, należy umieścić ją pomiędzy podwójnymi nawiasami klamrowymi ujętymi w cudzysłów.
Oto prosty przykład podręcznika:
- hosts: all
vars:
greeting: Hello world!
tasks:
- name: Ansible Basic Variable Example
debug:
msg: "{{ greeting }}"
W powyższym podręczniku zmienna powitanie jest zastępowana wartością Witaj, świecie! po uruchomieniu podręcznika. Podręcznik po prostu wypisuje komunikat Witaj, świecie! po uruchomieniu.
Dodatkowo możesz mieć listę lub tablicę zmiennych, jak pokazano:
Poniższy podręcznik przedstawia zmienną o nazwie kontynenty. Zmienna zawiera 5 różnych wartości – nazw kontynentów. Dostęp do każdej z tych wartości można łatwo uzyskać, używając indeksu 0 jako pierwszej zmiennej.
Poniższy przykład podręcznika pobiera i wyświetla Azję (indeks 1).
- hosts: all
vars:
continents:
- Africa
- Asia
- South America
- North America
- Europe
tasks:
- name: Ansible List variable Example
debug:
msg: "{{ continents [1] }}"
Lista zmiennych może mieć podobną strukturę, jak pokazano:
vars:
Continents: [Africa, Asia, South America, North America, Europe]
Aby wyświetlić wszystkie pozycje na liście, użyj modułu with_items. Spowoduje to przejście przez wszystkie wartości w tablicy.
- hosts: all
vars:
continents: [Africa, Asia, South America, North America, Europe]
tasks:
- name: Ansible array variables example
debug:
msg: "{{ item }}"
with_items:
- "{{ continents }}"
Innym typem zmiennej Ansible jest zmienna słownikowa.
Zmienne słownikowe są dodatkowo obsługiwane w podręczniku. Aby zdefiniować zmienną słownikową, wystarczy wskazać parę klucz-wartość tuż pod nazwą zmiennej słownikowej.
hosts: switch_f01
vars:
http_port: 8080
default_gateway: 10.200.50.1
vlans:
id: 10
port: 2
W powyższym przykładzie vlans jest zmienną słownikową, natomiast id i port to pary klucz-wartość.
hosts: switch_f01
vars:
http_port: 8080
default_gateway:
vlans:
id: 10
port: 20
tasks:
name: Configure default gateway
system_configs:
default_gateway_ip: “{{ default_gateway }}“
name: Label port on vlan 10
vlan_config:
vlan_id: “{{ vlans[‘id’] }}“
port_id: 1/1/ {{ vlans[‘port’] }}
W przypadku port_id, ponieważ zaczynamy wartość od tekstu, a nie zmiennej, cudzysłowy nie są konieczne, aby otaczać nawiasy klamrowe.
2. Zmienne specjalne
Ansible udostępnia listę predefiniowanych zmiennych, do których można odwoływać się w szablonach i podręcznikach Jinja2, ale użytkownik nie może ich zmieniać ani definiować.
Łącznie listę predefiniowanych zmiennych Ansible określa się jako Fakty dotyczące Ansible i są one gromadzone podczas wykonywania podręcznika.
Aby uzyskać listę wszystkich zmiennych Ansible, użyj modułu setup w poleceniu ad-hoc Ansible, jak pokazano poniżej:
ansible -m setup hostname
Wyświetla dane wyjściowe w formacie JSON, jak pokazano:
ansible -m setup localhost
Z wyników wynika, że niektóre przykłady zmiennych specjalnych Ansible obejmują:
ansible_architecture
ansible_bios_date
ansible_bios_version
ansible_date_time
ansible_machine
ansible_memefree_mb
ansible_os_family
ansible_selinux
Istnieje wiele innych zmiennych specjalnych Ansible. To tylko kilka przykładów.
Tych zmiennych można użyć w szablonie Jinja2, jak pokazano:
<html>
<center>
<h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
<h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>
3. Zmienne zapasowe
Na koniec na liście znajdują się zmienne inwentaryzacyjne Ansible. Inwentarz to plik w formacie INI, który zawiera wszystkie hosty, którymi będzie zarządzał Ansible.
W inwentarzach możesz przypisać zmienną do systemu hosta, a później użyć jej w podręczniku.
[web_servers]
web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=ubuntu http_port=8080
Powyższe można przedstawić w pliku YAML podręcznika, jak pokazano:
---
web_servers:
web_server_1:
ansible_user=centos
http_port=80
web_server_2:
ansible_user=ubuntu
http_port=8080
Jeśli systemy hosta korzystają z tych samych zmiennych, można zdefiniować inną grupę w pliku inwentaryzacji, aby uczynić ją mniej uciążliwą i uniknąć niepotrzebnych powtórzeń.
Na przykład:
[web_servers]
web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=centos http_port=80
Powyższe można ustrukturyzować następująco:
[web_servers]
web_server_1
web_server_2
[web_servers:vars]
ansible_user=centos
http_port=80
W pliku playbooka YAML zostanie to zdefiniowane w następujący sposób:
---
web_servers:
hosts:
web_server_1:
web_server_2:
vars:
ansible_user=centos
http_port=80
Fakty dotyczące Ansibla
Podczas uruchamiania podręczników pierwszym zadaniem wykonywanym przez Ansible jest wykonanie zadania instalacyjnego. Jestem pewien, że musiałeś natknąć się na dane wyjściowe:
TASK: [Gathering facts] *********
Fakty Ansible to nic innego jak właściwości systemu lub informacje o zdalnych węzłach, z którymi się łączysz. Informacje te obejmują architekturę systemu, wersję systemu operacyjnego, informacje o systemie BIOS, godzinę i datę systemu, czas pracy systemu, adres IP i informacje o sprzęcie, żeby wymienić tylko kilka.
Aby uzyskać informacje o dowolnym systemie, po prostu użyj modułu konfiguracji, jak pokazano w poleceniu poniżej:
ansible -m setup hostname
Na przykład:
ansible -m setup database_server
Spowoduje to wydrukowanie dużego zestawu danych w formacie JSON, jak pokazano:
Fakty Ansible są przydatne, pomagając administratorom systemu w wyborze operacji, które należy wykonać, na przykład w zależności od systemu operacyjnego mogą dowiedzieć się, które pakiety oprogramowania należy zainstalować i jak mają być skonfigurowane itp.
Niestandardowe fakty
Czy wiesz również, że możesz tworzyć własne, niestandardowe fakty, które będą zbierane przez Ansible? Tak, możesz. Jak więc sobie z tym poradzić? Zmieńmy biegi i zobaczmy, jak to zrobić.
Pierwszym krokiem jest utworzenie katalogu /etc/ansible/facts.d w węźle zarządzanym lub zdalnym.
W tym katalogu utwórz plik(i) z rozszerzeniem .fact
. Ten plik(i) zwróci dane w formacie JSON, gdy podręcznik zostanie uruchomiony w węźle sterującym Ansible, co obejmuje inne fakty pobierane przez Ansible po uruchomieniu podręcznika.
Oto przykład niestandardowego pliku faktów o nazwie date_time.fact, który pobiera datę i godzinę.
mkdir -p /etc/ansible/facts.d
vim /etc/ansible/facts.d/date_time.fact
Dodaj w nim następujące linie.
#!/bin/bash
DATE=`date`
echo "{\"date\" : \"${DATE}\"}"
Zapisz i wyjdź z pliku.
Teraz przypisz uprawnienia do wykonywania:
chmod +x /etc/ansible/facts.d/date_time.fact
Teraz utworzyłem podręcznik w węźle kontrolnym Ansible o nazwie check_date.yml.
---
- hosts: webservers
tasks:
- name: Get custom facts
debug:
msg: The custom fact is {{ansible_local.date_time}}
Dołącz plik faktów do zmiennej ansible_local. ansible_local przechowuje wszystkie niestandardowe fakty.
Teraz uruchom podręcznik i obserwuj, jak Ansible pobiera informacje zapisane w pliku faktów:
ansible_playbook check_date.yml
Wniosek
W ten sposób dotarliśmy do końca samouczka dotyczącego pracy ze zmiennymi i faktami Ansible.