Ansible: mevcut hedef sunucunun IP adresini alın


103

Bir rolde mevcut ana bilgisayarın IP adresini nasıl alırsınız?

Ev sahibinin üyesi olduğu grupların listesini ve ana bilgisayarın ana bilgisayar adını alabileceğinizi biliyorum, ancak IP adresini almak için bir çözüm bulamıyorum.

Ana bilgisayar adını {{inventory_hostname}}ve grubunu kullanarak alabilirsiniz.{{group_names}}

Gibi şeyler denedim {{ hostvars[{{ inventory_hostname }}]['ansible_ssh_host'] }} veip="{{ hostvars.{{ inventory_hostname }}.ansible_ssh_host }}"

Yanıtlar:


128

Tüm adreslerin bir listesi bir gerçekte saklanır ansible_all_ipv4_addresses, varsayılan bir adres ansible_default_ipv4.address.

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

Sonra her ağ arayüzüne atanmış adresler vardır ... Bu gibi durumlarda tüm gerçekleri görüntüleyebilir ve kullanmak istediğiniz değere sahip olanı bulabilirsiniz.


Tüm bayrakları nasıl görüntülüyorsunuz?
SJC

1
Bir görev içindeki tüm bayrakları listeleyebilir misiniz?
SJC

2
@SJC Bayrakları? Gerçekleri kastediyorsun, değil mi? Evet, setup:modülü şununla çalıştır register: allfactsve göster- debug: var=allfacts
techraf

4
Bunun işe yaraması için değeri gather_factsolmalıdır true. varsayılan olarak doğrudur, ancak ana bilgisayarlar hakkında bilgi gerekmiyorsa yanlış hale getirilebilir.
shshnk

1
@poige Sizin gibi yeni bir soru sorarsanız yanlış olabilir.
techraf

72

IP adresini hostvarsdikte ansible_default_ipv4ve anahtarından alabilirsinizaddress

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

ve IPv6 adresi sırasıyla

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

Örnek bir oyun kitabı:

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

1
Bu bazı durumlarda başarısız olabilir, şuna
RafalS

26

Template.j2'nizde {{ ansible_eth0.ipv4.address }}kullandığınız gibi kullanabilirsiniz {{inventory_hostname}}.

ps: ANSIBLE TOPLAR GERÇEKLERİ OLAN UZAK HOSTLAR HAKKINDA BİLGİ NASIL TOPLANACAK hakkında daha fazla bilgi için lütfen aşağıdaki blog yayınına bakın .

'bir gün birine yardım edeceğini umuyorum ッ


13
Ekstra dikkatli olun. Günümüzde varsayılan ağ arayüzü her zaman 'eth0' değildir. Bazen denir ens3ya enp2s0ve bu tür şeyler. Eğer kullanırsanız ansible_default_ipv4ve çalışmıyorsa daha iyi bahislere sahipsiniz , o zaman bazı aklı başında varsayılanları aramaya geri dönün.
Gabor Garami

4
Bu muhtemelen geçmişte çalışıyordu, ancak Ansible 2.7 ile bu değişken tanımsız.
Dirk

5

Harici genel IP istiyorsanız ve AWS veya Azure gibi bir bulut ortamındaysanız ipify_facts modülünü kullanabilirsiniz :

# 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:

Bu, genel IP'yi değişkene yerleştirecektir ipify_public_ip.


Bu her zaman işe yaramaz. Benim için ipify_public_ipdeğişken boş
Davide

2
AWS için envanter_hostname ip adresi olacaktır.
Berend de Boer

Bu eklenti belirli koşullar altında çalışabilir, internete bir NAT arkasından erişiyorsanız çalışmaz. Temel olarak bu, sunucular internetten erişilebilir olduğunda çalışır ve siteye erişirken harici IP'lerini çözmek için ipify.org web sitesine girebilir.
slm

1
@BerenddeBoer Yanlış. inventory_hostnameenvanterde ayarlanmış olan şeydir. İçinde belirtildiği gibi bir ana bilgisayar adı olabilir .ssh/config.
Teresa e Junior

@slm, eğer harici genel IP arıyorsanız, dediğim gibi. Bir NAT'ın arkasındaysanız, herkese açık bir harici IP'ye sahip olmayacağınız için bu yöntemi kullanmazsınız.
Simon Woodside

4

Genel IP bulmanın başka bir yolu da urimodülü kullanmaktır :

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

IP adresiniz olacak ip_response.content


Aynısını döndüren başka bir hizmet url'si şudur:https://ipecho.net/plain
Paul Parker

@PaulParker ipecho.net/plain KO görünüyor veya api token'a sor ... ifconfig.me yıllardan beri daha iyi ve istikrarlı hizmet: +1
bastien

Hiç bir API belirteci istenmedi. Hizmetin tutarlılığı hakkında konuşamıyorum, onu izlemedim, ama beni asla hayal kırıklığına uğratmadı.
Paul Parker

3

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

yani şablonda, örneğin:

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

Notlar:

  • Envanterde sadece DNS adı kullanılamayacağından, IP olup olmadığının kontrol edilmesi daha iyidir
  • Açıkçası, bu makbuz dolaylı ana bilgisayar belirtimleri için tasarlandığı gibi çalışmaz (örneğin atlama ana bilgisayarlarını kullanmak gibi)

Ancak yine de (mecazi anlamda) kullanım durumlarının% 99'una hizmet ediyor.


1
Peki ya ortamda DNS kullanılmıyorsa?
techraf

(Ya da acınızı hissediyorum. Aksi takdirde böyle saf sorular sormazsınız.) - Envanterde DNS kullanılmıyorsa, cevabımda belirtildiği gibi doğrudan ansible_host kullanın.
2018

1
Abs ansible_host, söz konusu sunucunun IP adresi değilse ne olur ?
techraf

bu "ve ne" değil. Bu sadece "ne" çünkü daha önce sorduğunuz sorunuz sayılmaz, unutmayın.
2018, 2

1
"Gerçek IP adresi" olarak adlandırdığınız şey hakkında hiçbir fikrim yok. Gerçek olmayan bazılarını biliyor musun?
2018

3

Basit hata ayıklama komutu:

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

çıktı:

"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"
    }, 

ana bilgisayar ip adresini al:

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"
}

3

Sadece ansible_ssh_hostdeğişken kullan

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

Sonuç

TASK [Show host's ip] *********************************************************************************************************************************************************************************************
ok: [host1] => {
     "msg": "1.2.3.4"
}

1

Düz bazı durumlardaansible_default_ipv4.address düşündüğünüz gibi olmayabilir , şunu kullanın:

ansible_default_ipv4.address|default(ansible_all_ipv4_addresses[0])

0

Aşağıdaki kod parçası uzak makinenin genel ipini ve ayrıca varsayılan ip'i (yani: LAN) döndürür

Bu, yapılandırma dosyalarını kullanırken karışıklığı önlemek için ipleri tırnak içinde yazdıracaktır.

>> 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
Yaptığınız bazı yorumlar bu yanıtı iyileştirebilir
Marged
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.