उत्तर देने योग्य: वर्तमान लक्ष्य होस्ट का IP पता प्राप्त करें


100

आपको एक भूमिका में वर्तमान होस्ट का आईपी पता कैसे मिलता है?

मुझे पता है कि आप उन समूहों की सूची प्राप्त कर सकते हैं जो होस्ट होस्ट के सदस्य और होस्टनाम हैं, लेकिन मैं आईपी एड्रेस प्राप्त करने के लिए एक समाधान खोजने में असमर्थ हूं।

आप होस्टनाम का उपयोग करके {{inventory_hostname}}और समूह का उपयोग करके प्राप्त कर सकते हैं{{group_names}}

मैंने कोशिश की है जैसे {{ hostvars[{{ inventory_hostname }}]['ansible_ssh_host'] }} औरip="{{ hostvars.{{ inventory_hostname }}.ansible_ssh_host }}"

जवाबों:


124

सभी पतों की एक सूची को एक तथ्य ansible_all_ipv4_addresses, एक डिफ़ॉल्ट पते में संग्रहीत किया जाता है ansible_default_ipv4.address

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

फिर प्रत्येक नेटवर्क इंटरफ़ेस को असाइन किए गए पते हैं ... ऐसे मामलों में आप सभी तथ्यों को प्रदर्शित कर सकते हैं और उस मूल्य को पा सकते हैं, जिसका आप उपयोग करना चाहते हैं।


आप सभी झंडे कैसे प्रदर्शित करते हैं?
एसजेसी

1
क्या आप किसी कार्य के सभी झंडे सूचीबद्ध कर सकते हैं?
एसजेसी

2
@ एसजेसी झंडे? आप तथ्यों का मतलब है, है ना? हां, setup:मॉड्यूल के साथ चलाएं register: allfactsऔर - debug: var=allfacts
Techraf

4
काम करने के लिए इसका मूल्य gather_factsहोना चाहिए true। यह डिफ़ॉल्ट रूप से सही है, लेकिन कोई इसे झूठे में बदल सकता है यदि मेजबानों के बारे में जानकारी की आवश्यकता नहीं है।
shshnk

1
यदि आप एक नया प्रश्न पूछते हैं, तो यह गलत हो सकता है।
टेकफ़र

69

आप आईपी पते से hostvars, तानाशाह ansible_default_ipv4और चाबी प्राप्त कर सकते हैंaddress

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

और IPv6 पता क्रमशः

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

एक उदाहरण प्लेबुक:

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

यह कुछ मामलों में विफल हो सकता है, इसे देखें: medium.com/opsops/…
RafalS

25

आप अपने टेम्पलेट में उपयोग कर सकते हैं। जे 2 {{ ansible_eth0.ipv4.address }}उसी तरह से जिसका आप उपयोग करते हैं {{inventory_hostname}}

पीएस: कृपया निम्नलिखित ब्लॉगर्स के बारे में अधिक जानकारी के लिए नीचे दिए गए जानकारी के बारे में अधिक जानकारी पाने के लिए कृपया हमारे साथ जुड़े रहे

'उम्मीद है कि यह किसी को एक दिन मदद मिलेगी someone


13
अतिरिक्त सावधानी बरतें। आजकल डिफ़ॉल्ट नेटवर्क इंटरफ़ेस हमेशा 'eth0' नहीं होता है। यह कभी-कभी कहा जाता है ens3या enp2s0ऐसी चीजें। आपके पास बस बेहतर दांव हैं यदि आप उपयोग करते हैं ansible_default_ipv4और यदि यह काम नहीं कर रहा है, तो वापस कुछ समझदार चूक की तलाश करें।
गबरू

4
यह संभवत: अतीत में काम करता था, लेकिन Ansible 2.7 के साथ यह चर अपरिभाषित है।
डिर्क

5

यदि आप बाहरी सार्वजनिक आईपी चाहते हैं और आप AWS या Azure जैसे क्लाउड वातावरण में हैं, तो आप 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:

यह सार्वजनिक आईपी को चर में रखेगा ipify_public_ip


यह हमेशा काम नहीं करता है। मेरे लिए ipify_public_ipचर खाली है
Davide

2
AWS के लिए, इन्वेंट्री_होस्टनेम आईपी एड्रेस होगा।
बेर्न्ड डी बोअर

यह प्लगइन कुछ निश्चित परिस्थितियों में काम कर सकता है, यदि आप एक नेट के पीछे से इंटरनेट एक्सेस कर रहे हैं, तो यह काम नहीं करेगा। मूल रूप से यह तब काम करता है जब सर्वर इंटरनेट तक पहुंच रखते हैं और साइट तक पहुंचते समय अपने बाहरी आईपी को हल करने के लिए ipify.org वेबसाइट को हिट कर सकते हैं।
SLM

1
@BerenddeBoer गलत। inventory_hostnameसूची में जो कुछ भी सेट किया गया है। यह होस्ट नाम के रूप में सेट किया जा सकता है .ssh/config
टेरेसा ई जूनियर

@ एसएलएम जैसा कि मैंने कहा, यदि आप बाहरी सार्वजनिक आईपी की तलाश कर रहे हैं। यदि आप NAT के पीछे हैं, तो आपके पास बाहरी रूप से सुलभ IP नहीं होगा, इसलिए आप इस विधि का उपयोग नहीं करेंगे।
साइमन वुडसाइड

4

सार्वजनिक आईपी खोजने के लिए एक और तरीका uriमॉड्यूल का उपयोग करना होगा :

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

आपका आईपी अंदर होगा ip_response.content


एक और सेवा यूआरएल जो समान रिटर्न करता है वह है:https://ipecho.net/plain
पॉल पार्कर

@PaPParker ipecho.net/plain को KO लगता है या एपीआई टोकन मांगते हैं ... ifconfig.me सालों से बेहतर और स्थिर सेवा: +1
bastien

एपीआई टोकन के लिए कभी नहीं पूछा गया। मैं सेवा की स्थिरता से बात नहीं कर सकता, मैंने इसकी निगरानी नहीं की है, लेकिन इसने मुझे कभी विफल नहीं किया।
पॉल पार्कर

2

सरल डिबग कमांड:

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

उत्पादन:

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

होस्ट आईपी पता प्राप्त करें:

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

1

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

इसलिए टेम्पलेट में, उदाहरण के लिए:

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

टिप्पणियाँ:

  • चूंकि इन्वेंट्री चेक में न केवल डीएनएस नाम का उपयोग किया जा सकता है, अगर यह आईपी पहले से बेहतर नहीं है
  • जाहिर है कि यह रसीद अप्रत्यक्ष मेजबान विशिष्टताओं के लिए काम नहीं करेगी (जैसे कि जंप मेजबानों का उपयोग करना, उदाहरण के लिए)

लेकिन फिर भी यह उपयोग के मामलों का 99% (आलंकारिक रूप से बोलना) कार्य करता है।


1
और अगर पर्यावरण में DNS का उपयोग नहीं किया जाता है तो क्या होगा?
टेकफ़र

(या, मैं आपका दर्द महसूस करता हूं। अन्यथा आप इस तरह के भोले-भाले सवाल नहीं पूछेंगे।) - अगर डीएनएस का उपयोग इन्वेंट्री में नहीं किया जाता है तो सीधे मेरे जवाब में बताए अनुसार ansible_host का उपयोग करें।
पोइज

1
यदि ansible_hostप्रश्न में मेजबान का आईपी पता नहीं है तो क्या होगा ?
टेकफ़र

यह "और क्या" नहीं है। यह सिर्फ "क्या" है क्योंकि आपके पहले पूछे गए सवाल को गिना नहीं जाता है, मत भूलना।
2

1
मुझे कोई सुराग नहीं है कि आप "वास्तविक आईपी पते" के रूप में क्या कह रहे हैं। क्या आप कुछ असत्य जानते हैं?
2

1

प्लेन ansible_default_ipv4.addressवह नहीं हो सकता है जो आप कुछ मामलों में सोचते हैं , उपयोग करें:

ansible_default_ipv4.address|default(ansible_all_ipv4_addresses[0])

0

निम्नलिखित स्निपेट रिमोट मशीन के सार्वजनिक आईपी को लौटा देगा और डिफ़ॉल्ट आईपी (यानी: LAN)

यह कॉन्फ़िगर फ़ाइलों का उपयोग करने में भ्रम से बचने के लिए आईपी के उद्धरण भी मुद्रित करेगा।

>> 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
आपके द्वारा कुछ टिप्पणियों से इस उत्तर में सुधार होगा
Marged

0

बस उपयोग ansible_ssh_hostचर

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

परिणाम

TASK [Show host's ip] *********************************************************************************************************************************************************************************************
ok: [host1] => {
     "msg": "1.2.3.4"
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.