bagaimana cara mengakses variabel host dari host yang berbeda dengan Ansible?

45

Katakanlah memiliki host yang mengumpulkan beberapa data dan itu dalam sebuah grup [collectors]. Saya juga memiliki host di grup [reporters]. Jadi saya ingin mengatur variabel pada reporter dari groups['collectors'][0]alamat ip. Tetapi playbook untuk mengatur reporter tidak berjalan dalam [collectors]grup sehingga fakta-fakta untuk host ini tidak dikumpulkan. Apakah ada cara untuk tidak melakukan hardcode alamat ip?

hryamzik
sumber

Jawaban:

87

Anda dapat mengakses hampir semua fakta / variabel inventaris dengan melakukan sesuatu seperti ini:

{{ hostvars['foo.example.com']['ansible_eth0']['ipv4']['address'] }}

atau, jika Anda ingin melakukannya melalui indeks ke grup:

{{ hostvars[groups['collectors'][0]]['ansible_eth0']['ipv4']['address'] }}

Trik besarnya adalah Anda perlu mengumpulkan fakta-fakta untuk semua host / grup yang Anda minati. Jadi, Anda ingin memodifikasi buku pedoman Anda yang bertentangan dengan grup reporter untuk menyertakan tugas no-op (dummy) yang diterapkan ke grup kolektor. Itu akan menyebabkan Ansible mengumpulkan fakta tentang tuan rumah kolektor sehingga mereka dapat diakses dari grup reporter. Jadi, Anda mungkin ingin menambahkan sesuatu seperti ini ke bagian atas buku pedoman reporter Anda:

- hosts: collectors
  name: Gather facts from collectors
  tasks: [ ]

Kurung kosong pada dasarnya berarti bahwa tidak ada tugas yang akan dieksekusi, tetapi ini masih akan memaksa Anda untuk mengumpulkan fakta tentang kolektor sehingga Anda kemudian dapat merujuknya pada tugas yang Anda jalankan terhadap wartawan Anda.

Edit # 1

Terpikir oleh saya bahwa saya juga harus menyebutkan bahwa pada versi 1.8 dari Ansible, ada fitur caching fakta yang sekarang tersedia. Caching fakta bergantung pada server redis untuk menyimpan fakta di antara run playbook. Dengan mengaktifkannya, satu buku pedoman dapat merujuk fakta yang diperoleh oleh buku pedoman lain yang dijalankan sebelumnya. Contoh dokumentasi Ansible memberi:

Bayangkan, misalnya, infrastruktur yang sangat besar dengan ribuan host. Caching fakta dapat dikonfigurasikan untuk dijalankan setiap malam, tetapi konfigurasi satu set kecil server dapat menjalankan ad-hoc atau secara berkala sepanjang hari. Dengan fakta-caching diaktifkan, tidak akan perlu untuk "memukul" semua server untuk referensi variabel dan informasi tentang mereka.

Bruce P.
sumber
2
Apakah ada cara untuk menetapkan indeks asosiatif sebagai variabel? dalam contoh localhost yang mungkin --extra-vars "metamorphosis_ip = 172.16.3.73" -a "echo {{hostvars [{{metamorphosis_ip}}] ['inv_domain']}}"
corretge
Untuk menambah jawaban di atas, pastikan bahwa Anda merujuk ke FAQ yang Mungkin ada di sini: docs.ansible.com/ansible/faq.html yang menjelaskan berbagai hal secara terperinci, seperti perulangan pada sekelompok host atau mengatur variabel untuk mendapatkan host tertentu dalam sebuah grup.
einarc
Terima kasih atas gagasan mengambil fakta dari sebuah simpul dengan daftar tugas kosong.
pedz