Daftar SEMUA variabel yang mungkin untuk host atau grup dengan perintah ad hoc?

25

Variabel yang mungkin berasal dari berbagai sumber. Sebagai contoh adalah mungkin untuk menyediakan host_vars dan group_vars dengan membuat file YAML dalam subfolder bernama host_varsdan group_varsmasing-masing folder yang berisi file inventaris.

Bagaimana saya bisa membuat daftar semua variabel Ansible akan tahu tentang grup atau host di dalam buku pedoman? Catatan: Saya mencoba ansible -m debug -e 'var=hostvars' hostdan ansible -m debug -e '- debug: var=hostvars'tidak berhasil.

Petunjuk: ansible <group|host> -m setupadalah tidak jawaban yang benar seperti itu tidak mencakup semua variabel yang berasal dari sumber-sumber lain (hanya berisi { "ansible_facts" : { ... } }Bahkan itu bahkan tidak termasuk variabel yang disediakan oleh script persediaan dinamis (melalui. _metaDan sebagainya).

Versi yang memungkinkan: 1.9.1.

0xC0000022L
sumber

Jawaban:

26

ansible -m debug -a "var=hostvars[inventory_hostname]"sepertinya berhasil. Sumber variabel yang valid ( host_vars, group_vars, _metadalam persediaan dinamis, dll) semua diperhitungkan.

Dengan skrip inventaris dinamis 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

Anda bisa mendapatkan:

$ 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"
        }
    }
}
yaegashi
sumber
Dengan ansible 2.0.2, ini sepertinya tidak berfungsi lagi. Outputnya adalahlocalhost | SUCCESS => { "hostvars": "<ansible.vars.hostvars.HostVars object at 0x7f320943da10>" }
Zulakis
Disarankan edit untuk digunakan "var=hostvars[inventory_hostname]"pada> 2.0
stuart-warren
Untuk 1.9.4 itu tidak mengembalikan barang-barang yang dikembalikan olehansible my.hostname.example.com -m setup -i ../my/inventory/hosts.example -u root
akostadinov
1
Ini berhasil untuk sayaansible host-name -m debug -a "var=[var_name]" -i inventory/testing/hosts
Montaro
2

FYI: Ini proyek github menunjukkan Anda bagaimana untuk daftar 90% dari variabel di semua host. Saya merasa lebih bermanfaat secara global daripada perintah host tunggal. README mencakup instruksi untuk membuat laporan inventaris sederhana. Bahkan lebih berharga untuk menjalankan ini di akhir buku pedoman untuk melihat semua Fakta. Untuk juga men-debug perilaku Tugas menggunakan daftar:

Larry Cepat
sumber
2

Menambahkan tip kecil ke jawaban yang benar-benar bagus di atas, jika Anda ingin melihat-lihat secara terprogram Anda bisa

Gunakan jawaban yang ada untuk hostvars :

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

Tetapi ansible_facts kosong karena debugtidak menjalankan setupmodul. Jadi Anda perlu mencoba sesuatu yang ekstra seperti jqsetelah memangkas output agar json valid.

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

Saya pikir orang mungkin menemukan ini berguna ketika menyelidiki dinding raksasa teks yang kembali pada fakta yang memungkinkan ketika Anda hanya ingin satu hal jq .ansible_facts.ansible_devices.vda.size

KCD
sumber