Wyświetl WSZYSTKIE zmienne Ansible dla hosta lub grupy za pomocą polecenia ad hoc?


25

Odpowiadalne zmienne pochodzą z różnych źródeł. Można na przykład udostępnić zmienne hosta i zmienne grupy, tworząc pliki YAML w podfolderze o nazwie host_varsi group_varsodpowiednio w folderze zawierającym plik ekwipunku.

Jak mogę wymienić wszystkich zmiennych ansibl byłoby wiedzieć o grupie lub hosta wewnątrz Playbook? Uwaga: próbowałem ansible -m debug -e 'var=hostvars' hosti ansible -m debug -e '- debug: var=hostvars'bezskutecznie.

Wskazówka: nieansible <group|host> -m setup jest poprawną odpowiedzią, ponieważ nie zawiera wszystkich zmiennych pochodzących z innych źródeł (zawiera tylko . W rzeczywistości nie obejmuje nawet zmiennych dostarczanych przez dynamiczny skrypt inwentaryzacji (poprzez i tak dalej).{ "ansible_facts" : { ... } }_meta

Wersja odpowiadająca: 1.9.1.

Odpowiedzi:


26

ansible -m debug -a "var=hostvars[inventory_hostname]"wydaje się działać. Prawidłowe źródła zmiennych ( host_vars, group_vars, _metaw inwentarzu dynamicznym, etc.) są brane pod uwagę.

Z dynamicznym skryptem inwentaryzacji hosts.sh:

#!/bin/sh
if test "$1" = "--host"; then
        echo {}
else
        cat <<EOF
{
  "ungrouped": [ "x.example.com", "y.example.com" ],
  "group1": [ "a.example.com" ],
  "group2": [ "b.example.com" ],
  "groups": {
    "children": [ "group1", "group2" ],
    "vars": { "ansible_ssh_user": "user" }
  },
  "_meta": {
    "hostvars": {
      "a.example.com": { "ansible_ssh_host": "10.0.0.1" },
      "b.example.com": { "ansible_ssh_host": "10.0.0.2" }
    }
  }
}
EOF
fi

Możesz dostać:

$ chmod +x hosts.sh
$ ansible -i hosts.sh a.example.com -m debug -a "var=hostvars[inventory_hostname]"
a.example.com | success >> {
    "var": {
        "hostvars": {
            "ansible_ssh_host": "10.0.0.1", 
            "ansible_ssh_user": "user", 
            "group_names": [
                "group1", 
                "groups"
            ], 
            "groups": {
                "all": [
                    "x.example.com", 
                    "y.example.com", 
                    "a.example.com", 
                    "b.example.com"
                ], 
                "group1": [
                    "a.example.com"
                ], 
                "group2": [
                    "b.example.com"
                ], 
                "groups": [
                    "a.example.com", 
                    "b.example.com"
                ], 
                "ungrouped": [
                    "x.example.com", 
                    "y.example.com"
                ]
            }, 
            "inventory_hostname": "a.example.com", 
            "inventory_hostname_short": "a"
        }
    }
}

W przypadku ansible 2.0.2wydaje się, że to już nie działa. Dane wyjściowe tolocalhost | SUCCESS => { "hostvars": "<ansible.vars.hostvars.HostVars object at 0x7f320943da10>" }
Zulakis,

Sugerowana edycja do zastosowania "var=hostvars[inventory_hostname]"w ansible> 2.0
stuart-warren

W wersji 1.9.4 nie zwraca rzeczy zwróconych przezansible my.hostname.example.com -m setup -i ../my/inventory/hosts.example -u root
akostadinov,

1
To zadziałało dla mnieansible host-name -m debug -a "var=[var_name]" -i inventory/testing/hosts
Montaro,

2

FYI: Ten projekt github pokazuje, jak wyświetlić 90% zmiennych na wszystkich hostach. Uważam, że jest to bardziej przydatne na całym świecie niż polecenia dla jednego hosta. Plik README zawiera instrukcje tworzenia prostego raportu inwentaryzacyjnego. Jeszcze bardziej wartościowe jest uruchomienie tego na końcu podręcznika, aby zobaczyć wszystkie fakty. Aby również debugować zachowanie zadania, użyj rejestru:


2

Dodając małą wskazówkę do naprawdę dobrej powyższej odpowiedzi, jeśli chcesz programowo szturchać, możesz

Użyj istniejącej odpowiedzi dla hostów :

ansible -m debug myhost -a "var=hostvars[inventory_hostname].ansible_version"

Ale ansible_facts jest pusty, ponieważ debugnie uruchamia setupmodułu. Musisz więc spróbować czegoś dodatkowego jqpo przycięciu danych wyjściowych, aby było prawidłowe json.

ansible -m setup myhost | sed 's#.*SUCCESS =>##' | jq .ansible_facts.ansible_all_ipv4_addresses

Pomyślałem, że ludzie mogą to uznać za przydatne podczas badania gigantycznej ściany tekstu, która powraca w wiarygodnych faktach, kiedy chcesz tylko czegoś takiego jq .ansible_facts.ansible_devices.vda.size

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.