Wyszukiwanie w witrynie

Wyjaśnianie faktów Ansible na przykładach


Wprowadzenie do faktów Ansible

W tym samouczku wyjaśniono, czym są fakty dotyczące Ansible i jak gromadzić informacje o systemie, tj. fakty w podręcznikach Ansible.

Krótkie wprowadzenie do faktów dotyczących Ansible

Fakty to informacje o zarządzanych hostach.

Po uruchomieniu podręcznika ansible spróbuje zebrać informacje związane z systemem o zarządzanym hoście i zapisać je w pamięci do czasu ukończenia podręcznika.

Informacje mogą obejmować adres IP, system operacyjny, system plików i inne. Gromadzeniem informacji zajmuje się moduł „konfiguracja”.

Nie ma potrzeby definiowania modułu instalacyjnego. Zamiast tego ansible automatycznie użyje modułu instalacyjnego i zbierze fakty.

Spójrz na następujący przykład.

Utwórz podręcznik i dodaj następującą definicję zabawy. Definicja gry zawiera tylko nazwę gry i hosty docelowe. Dla tej zabawy nie utworzono żadnego zadania.

- name: Stats collection
  hosts: all

Jak widać z poniższych wyników, kiedy uruchamiam podręcznik, zbieranie faktów jest przesyłane jako pierwsze zadanie, mimo że w podręczniku nie zdefiniowaliśmy żadnego zadania.

PLAY [Stats collection] *******************************************************************************************

TASK [Gathering Facts] ********************************************************************************************
ok: [rocky.anslab.com]
ok: [master.anslab.com]
ok: [ubuntu.anslab.com]

PLAY RECAP ********************************************************************************************************
master.anslab.com          : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
rocky.anslab.com           : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
ubuntu.anslab.com          : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

Fakty nazywane są także zmiennymi podręcznika.

Jak używać zmiennych w podręcznikach Ansible

Wyłączanie gromadzenia faktów

Nie każdy podręcznik wymaga gromadzenia faktów. Możesz pominąć zbieranie faktów, dodając „gather_facts: false” do definicji gry.

- name: Stats collection
  hosts: all
  gather_facts: false

Jak korzystać z modułu konfiguracji

Jak powiedziałem w poprzedniej sekcji, ansible używa modułu instalacyjnego do zbierania faktów. Zobaczmy kilka sposobów użycia modułu instalacyjnego jako polecenia adhoc, a następnie zobaczymy, jak jawnie używać modułu instalacyjnego w podręczniku.

Dane wyjściowe polecenia setup będą w formacie JSON. Uruchom następującą komendę na hoście docelowym, aby uzyskać dane wyjściowe.

ansible m1 -m setup | less

Zbieranie faktów za pomocą Ansible

Jak widać na powyższym obrazku, gromadzonych jest mnóstwo informacji związanych z systemem. Niektóre informacje mogą być przydatne, inne nie.

Typ danych Fakty

Informacje przechowywane w faktach są podzielone na trzy różne typy danych.

  • AnsibleUnsafeText
  • Słownik
  • Lista

Poniższy podręcznik służy do demonstrowania typów danych na podstawie danych wyjściowych. Używam type_debug, aby znaleźć typ danych.

- name: Facts Data type
  hosts: m2
  gather_facts: true
  tags: datatype

  tasks:

    - name: AnsibleUnsafeText
      debug: 
        var: ansible_facts['distribution'] | type_debug 

    - name: dict
      debug:
        var: ansible_facts['eth0']['ipv4'] | type_debug

    - name: List
      debug:
        var: ansible_facts['eth0']['ipv6'] | type_debug

Przykładowy wynik:

ansible-playbook facts_data_type.yml

TASK [AnsibleUnsafeText] ****************************************************************************************************************************************************************************************
ok: [rocky.anslab.com] => {
    "ansible_facts['distribution'] | type_debug": "AnsibleUnsafeText"
}

TASK [dict] *****************************************************************************************************************************************************************************************************
ok: [rocky.anslab.com] => {
    "ansible_facts['eth0']['ipv4'] | type_debug": "dict"
}

TASK [List] *****************************************************************************************************************************************************************************************************
ok: [rocky.anslab.com] => {
    "ansible_facts['eth0']['ipv6'] | type_debug": "list"
}

Filtrowanie faktów i Gather_subset

Możesz zastosować filtry, aby pobrać sekcję danych z danych wyjściowych. Powiedzmy, że jeśli chcę pobrać architekturę maszyny, polecenie będzie wyglądało następująco.

ansible m2 -m setup -a "filter=ansible_architecture"

rocky.anslab.com | SUCCESS => {
    "ansible_facts": {
        "ansible_architecture": "x86_64",
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false
}

Dane można także filtrować za pomocą wzorców.

ansible m2 -m setup -a "filter=*architecture"

rocky.anslab.com | SUCCESS => {
    "ansible_facts": {
        "ansible_architecture": "x86_64",
        "ansible_userspace_architecture": "x86_64",
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false
}

Możesz także użyć gather_subset, aby uzyskać określony podzbiór faktów. Na przykład, jeśli potrzebujesz tylko informacji związanych z siecią, możesz użyć "gather_subset=network".

ansible m2 -m setup -a "gather_subset=network"

Podobnie istnieją inne podzbiory, takie jak all, min, hardware, sieć i wirtualny itd. Domyślnie ustawione jest "all".

Możesz poprzedzić symbol ! dowolnym podzbiorem, który nie będzie zbierał określonego podzbioru. Na przykład poniższe polecenie zbierze wszystkie fakty z wyjątkiem informacji związanych z siecią.

ansible m2 -m setup -a "gather_subset=!network"

Zapisywanie faktów do pliku

Możesz zapisać fakty do pliku używając flagi --tree. Ścieżkę katalogu należy przekazać jako argument do flagi --tree.

ansible all -m setup --tree /home/vagrant/facts

W tym przypadku ansible zbierze fakty dla wszystkich grup i zapisze dane wyjściowe z nazwą serwera w katalogu /home/vagrant/facts.

ls -l ~/facts
total 68
-rw-rw-r-- 1 vagrant vagrant 21092 Apr 27 05:36 master.anslab.com
-rw-rw-r-- 1 vagrant vagrant 18336 Apr 27 05:36 rocky.anslab.com
-rw-rw-r-- 1 vagrant vagrant 21093 Apr 27 05:36 ubuntu.anslab.com

Korzystanie z modułu konfiguracji w podręczniku

Nie wszystkie dane zebrane w faktach zostaną wykorzystane w Twoich podręcznikach. Możesz więc jawnie skorzystać z modułu instalacyjnego i zebrać interesujące Cię dane.

Jeśli spojrzysz na poniższy podręcznik, jedyne dane, które mnie interesują, to informacje o dystrybucji węzłów zarządzanych. Korzystając z tych informacji, napisałem oświadczenie warunkowe.

- name: Explicitly using setup module
  hosts: all
  gather_facts: false
  
  tasks:

    - name: Setup Module
      setup:
        filter: ansible_distribution

    - name: Doing something
      debug:
        msg: "Spotted RHEL based distro. Proceeding with activity..."
      when: ansible_distribution | lower in ["rocky","redhat","centos"]

W wynikach poniżej możesz zobaczyć zadania uruchamiane tylko w systemie Rocky Linux i pomijane w przypadku dystrybucji opartych na Ubuntu.

TASK [Setup Module] ***********************************************************************************
ok: [rocky.anslab.com]
ok: [master.anslab.com]
ok: [ubuntu.anslab.com]

TASK [Doing something] ********************************************************************************
skipping: [master.anslab.com]
skipping: [ubuntu.anslab.com]
ok: [rocky.anslab.com] => {
    "msg": "Spotted RHEL based distro. Proceeding with activity..."
}

W podręczniku możesz także użyć filtrów i gather_subset.

- name: Applying filter
  setup:
    filter:
      - 'ansible_distribution'
      - 'ansible_eth[0-3]'
- name: Using subsets
  setup:
    gather_subset:
      - '!all'
      - 'network'

Zmienność czasu działania z gromadzeniem faktów i bez nich

Gdy uruchomisz podręcznik dla dużego zestawu zarządzanych hostów, zbieranie faktów może spowolnić grę. Za pomocą polecenia time możesz sprawdzić czas działania podręcznika z faktami i bez nich.

Poniższe dane wyjściowe pokazują różnicę czasu z faktami i bez nich. Mój podręcznik ma mniejszą liczbę zadań i tylko 3 zarządzane hosty, więc nie będzie dużej różnicy w czasie wykonywania.

# With facts
time ansible-playbook facts.yml

real0m3.096s
user0m1.264s
sys    0m0.340s
Without facts
time ansible-playbook facts.yml

real0m2.112s
user0m0.887s
sys    0m0.265s

Wniosek

W tym artykule omówiliśmy fakty i sposób uruchamiania poleceń adhoc przy użyciu modułu instalacyjnego oraz sposób jawnego korzystania z modułu instalacyjnego w podręczniku.

Gromadzenie faktów jest procesem czasochłonnym, gdy walczysz z ogromną liczbą celów.

Powiązane artykuły