Ansible: dapatkan alamat IP host target saat ini


102

Bagaimana Anda mendapatkan alamat IP host saat ini dalam sebuah peran?

Saya tahu Anda bisa mendapatkan daftar grup tempat host adalah anggota dan nama host dari host tetapi saya tidak dapat menemukan solusi untuk mendapatkan alamat IP.

Anda bisa mendapatkan nama host dengan menggunakan {{inventory_hostname}}dan grup dengan menggunakan{{group_names}}

Saya telah mencoba hal-hal seperti {{ hostvars[{{ inventory_hostname }}]['ansible_ssh_host'] }} danip="{{ hostvars.{{ inventory_hostname }}.ansible_ssh_host }}"

Jawaban:


127

Daftar semua alamat disimpan dalam sebuah fakta ansible_all_ipv4_addresses, alamat default di ansible_default_ipv4.address.

---
- hosts: localhost
  connection: local
  tasks:
    - debug: var=ansible_all_ipv4_addresses
    - debug: var=ansible_default_ipv4.address

Lalu ada alamat yang ditetapkan ke setiap antarmuka jaringan ... Dalam kasus seperti itu, Anda dapat menampilkan semua fakta dan menemukan salah satu yang memiliki nilai yang ingin Anda gunakan.


Bagaimana Anda menampilkan semua bendera?
SJC

1
Bisakah Anda mencantumkan semua bendera dari dalam tugas?
SJC

2
@SJC Flag? Maksud Anda fakta, bukan? Ya, jalankan setup:modul dengan register: allfactsdan tampilkan dengan- debug: var=allfacts
techraf

4
nilai gather_factsharus agar trueini berfungsi. itu benar secara default tetapi seseorang dapat mengubahnya menjadi salah jika info tentang host tidak diperlukan.
shshnk

1
@poige Mungkin tidak benar jika Anda mengajukan pertanyaan baru, seperti yang Anda lakukan.
techraf

70

Anda bisa mendapatkan alamat IP dari hostvars, dikt ansible_default_ipv4dan kunciaddress

hostvars[inventory_hostname]['ansible_default_ipv4']['address']

dan alamat IPv6 masing-masing

hostvars[inventory_hostname]['ansible_default_ipv6']['address']

Contoh pedoman:

---
- hosts: localhost
  tasks:
    - debug: var=hostvars[inventory_hostname]['ansible_default_ipv4']['address']
    - debug: var=hostvars[inventory_hostname]['ansible_default_ipv6']['address']

Ini mungkin gagal dalam beberapa kasus, lihat ini: medium.com/opsops/…
RafalS

25

Anda dapat menggunakan di template.j2 Anda {{ ansible_eth0.ipv4.address }}dengan cara yang sama seperti yang Anda gunakan {{inventory_hostname}}.

ps: Silakan merujuk ke blogpost berikut untuk mendapatkan informasi lebih lanjut tentang CARA MENGUMPULKAN INFORMASI TENTANG REMOTE HOSTS DENGAN FAKTA GATHERS YANG ANSIBLE .

'berharap itu akan membantu seseorang suatu hari nanti ッ


13
Berhati-hatilah. Saat ini antarmuka jaringan default tidak selalu 'eth0'. Kadang-kadang disebut ens3atau enp2s0dan semacamnya. Anda hanya memiliki taruhan yang lebih baik jika Anda menggunakan ansible_default_ipv4dan jika tidak berfungsi, maka beralihlah kembali mencari beberapa default yang waras.
Gabor Garami

4
Ini mungkin digunakan untuk bekerja di masa lalu tetapi dengan Ansible 2.7 variabel ini tidak ditentukan.
Dirk

5

Jika Anda menginginkan IP publik eksternal dan Anda berada di lingkungan cloud seperti AWS atau Azure, Anda dapat menggunakan modul ipify_facts :

# TODO: SECURITY: This requires that we trust ipify to provide the correct public IP. We could run our own ipify server.
- name: Get my public IP from ipify.org
  ipify_facts:

Ini akan menempatkan IP publik ke dalam variabel ipify_public_ip.


Ini tidak selalu berhasil. Bagi saya ipify_public_ipvariabel kosong
Davide

2
Untuk AWS, inventory_hostname akan menjadi alamat ip.
Berend de Boer

Plugin ini dapat berfungsi dalam keadaan tertentu, jika Anda mengakses internet dari belakang NAT, itu tidak akan berfungsi. Pada dasarnya ini berfungsi ketika server dapat diakses ke internet dan dapat mengunjungi situs web ipify.org untuk menyelesaikan IP eksternal mereka saat mengakses situs.
slm

1
@Berender Salah. inventory_hostnameadalah apa pun yang diatur dalam inventaris. Bisa jadi nama host seperti yang diatur dalam .ssh/config.
Teresa e Junior

@slm seperti yang saya katakan, jika Anda mencari IP publik eksternal. Jika Anda berada di belakang NAT, Anda tidak akan memiliki IP eksternal yang dapat diakses publik sehingga Anda tidak akan menggunakan metode ini.
Simon Woodside

4

Cara lain untuk menemukan IP publik adalah dengan menggunakan urimodul:

    - name: Find my public ip
      uri: 
        url: http://ifconfig.me/ip
        return_content: yes
      register: ip_response

IP Anda akan masuk ip_response.content


Url layanan lain yang mengembalikan hal yang sama adalah:https://ipecho.net/plain
Paul Parker

@PaulParker ipecho.net/plain tampaknya KO atau meminta token api ... ifconfig.me layanan yang lebih baik dan stabil sejak tahun: +1
bastien

Tidak pernah dimintai token API. Saya tidak dapat berbicara tentang konsistensi layanan, saya belum memantaunya, tetapi tidak pernah mengecewakan saya.
Paul Parker

3

Perintah debug sederhana:

ansible -i inventory/hosts.yaml -m debug -a "var=hostvars[inventory_hostname]" all

keluaran:

"hostvars[inventory_hostname]": {
    "ansible_check_mode": false, 
    "ansible_diff_mode": false, 
    "ansible_facts": {}, 
    "ansible_forks": 5, 
    "ansible_host": "192.168.10.125", 
    "ansible_inventory_sources": [
        "/root/workspace/ansible-minicros/inventory/hosts.yaml"
    ], 
    "ansible_playbook_python": "/usr/bin/python2", 
    "ansible_port": 65532, 
    "ansible_verbosity": 0, 
    "ansible_version": {
        "full": "2.8.5", 
        "major": 2, 
        "minor": 8, 
        "revision": 5, 
        "string": "2.8.5"
    }, 

dapatkan alamat ip host:

ansible -i inventory/hosts.yaml -m debug -a "var=hostvars[inventory_hostname].ansible_host" all

zk01 | SUCCESS => {
    "hostvars[inventory_hostname].ansible_host": "192.168.10.125"
}

2

http://docs.ansible.com/ansible/latest/plugins/lookup/dig.html

jadi di template, misal:

{{ lookup('dig', ansible_host) }}

Catatan:

  • Karena tidak hanya nama DNS yang dapat digunakan dalam inventaris, periksa apakah itu bukan IP lebih baik ditambahkan
  • Cukup jelas tanda terima ini tidak akan berfungsi sebagaimana dimaksud untuk spesifikasi host tidak langsung (seperti menggunakan host lompat, misalnya)

Tapi tetap melayani 99% (secara kiasan) kasus penggunaan.


1
Dan bagaimana jika DNS tidak digunakan di lingkungan?
techraf

(Atau, saya merasakan sakit Anda. Jika tidak, Anda tidak akan mengajukan pertanyaan naif seperti itu.) - Jika DNS tidak digunakan dalam inventaris, gunakan saja ansible_host langsung seperti yang ditunjukkan dalam jawaban saya.
poige

1
Abs bagaimana jika ansible_hostbukan alamat IP dari host yang dimaksud?
techraf

ini bukan "dan apa". Itu hanya "apa" karena pertanyaan yang Anda tanyakan sebelumnya tidak dihitung, jangan lupa.
poige

1
Saya tidak tahu apa yang Anda sebut sebagai "alamat IP asli". Apakah Anda tahu beberapa yang tidak nyata?
poige

1

Biasa ansible_default_ipv4.addressmungkin tidak seperti yang Anda pikirkan dalam beberapa kasus , gunakan:

ansible_default_ipv4.address|default(ansible_all_ipv4_addresses[0])

0

Potongan berikut akan mengembalikan ip publik dari mesin jarak jauh dan juga ip default (yaitu: LAN)

Ini akan mencetak ip dalam tanda kutip juga untuk menghindari kebingungan dalam menggunakan file konfigurasi.

>> main.yml

---
- hosts: localhost
  tasks:
    - name: ipify
      ipify_facts:
    - debug: var=hostvars[inventory_hostname]['ipify_public_ip']
    - debug: var=hostvars[inventory_hostname]['ansible_default_ipv4']['address']
    - name: template
      template:
        src: debug.j2
        dest: /tmp/debug.ansible

>> templates/debug.j2

public_ip={{ hostvars[inventory_hostname]['ipify_public_ip'] }}
public_ip_in_quotes="{{ hostvars[inventory_hostname]['ipify_public_ip'] }}"

default_ipv4={{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}
default_ipv4_in_quotes="{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}"


2
Beberapa komentar Anda akan memperbaiki jawaban ini
Marged

0

Cukup gunakan ansible_ssh_hostvariabel

playbook_example.yml

- hosts: host1
  tasks:
  - name: Show host's ip
    debug:
      msg: "{{ ansible_ssh_host }}"

hosts.yml

[hosts]
host1   ansible_host=1.2.3.4

Hasil

TASK [Show host's ip] *********************************************************************************************************************************************************************************************
ok: [host1] => {
     "msg": "1.2.3.4"
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.