Wyszukiwanie w witrynie

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.