Ansible : 현재 대상 호스트의 IP 주소 가져 오기


101

역할에서 현재 호스트의 IP 주소를 어떻게 얻습니까?

호스트가 구성원 인 그룹 목록과 호스트의 호스트 이름을 얻을 수 있다는 것을 알고 있지만 IP 주소를 얻는 방법을 찾을 수 없습니다.

사용하여 호스트 이름을 얻을 수 있고 사용 {{inventory_hostname}}하여 그룹을 얻을 수 있습니다.{{group_names}}

내가 좋아하는 일을 시도 {{ hostvars[{{ inventory_hostname }}]['ansible_ssh_host'] }} 하고ip="{{ hostvars.{{ inventory_hostname }}.ansible_ssh_host }}"

답변:


126

모든 주소 목록은 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

그런 다음 각 네트워크 인터페이스에 할당 된 주소가 있습니다. 이러한 경우 모든 사실을 표시하고 사용하려는 값이있는 사실을 찾을 수 있습니다.


모든 플래그를 어떻게 표시합니까?
SJC

1
작업 내에서 모든 플래그를 나열 할 수 있습니까?
SJC

2
@SJC 플래그? 사실 말이죠? 예, 실행 setup:과 모듈 register: allfacts과 디스플레이- debug: var=allfacts
techraf

4
이 작업을 수행 gather_facts하려면 의 값이 이어야합니다 true. 기본적으로 true이지만 호스트에 대한 정보가 필요하지 않은 경우 false로 설정할 수 있습니다.
shshnk

1
@poige 당신이하는 것처럼 새로운 질문을하는 것은 틀릴 수 있습니다.
techraf

70

hostvars, dict ansible_default_ipv4및 key 에서 IP 주소를 가져올 수 있습니다.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

를 사용 {{ ansible_eth0.ipv4.address }}하는 것과 동일한 방식으로 template.j2 에서 사용할 수 있습니다 {{inventory_hostname}}.

추신 : ANSIBLE GATHERS 사실이있는 원격 호스트에 대한 정보를 수집하는 방법에 대한 자세한 내용은 다음 블로그 게시물을 참조하십시오 .

'언젠가 누군가에게 도움이되기를 바라며 ッ


13
특히 조심하세요. 요즘 기본 네트워크 인터페이스는 항상 'eth0'이 아닙니다. 그것은 때때로 ens3또는 enp2s0그런 것입니다. 사용 ansible_default_ipv4하고 작동하지 않는 경우 더 나은 베팅이 있으며 정상적인 기본값을 찾기 위해 다시 전환하십시오.
Gabor Garami 2014 년

4
이것은 아마도 과거에는 작동했지만 Ansible 2.7에서는이 변수가 정의되지 않았습니다.
Dirk

5

외부 공용 IP 를 원하고 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:

그러면 공용 IP가 변수에 배치 ipify_public_ip됩니다.


이것은 항상 작동하지 않습니다. 나를 위해 ipify_public_ip변수는 비어
다비드

2
AWS의 경우 inventory_hostname은 IP 주소입니다.
Berend de Boer

이 플러그인은 특정 상황에서 작동 할 수 있으며 NAT 뒤에서 인터넷에 액세스하는 경우 작동하지 않습니다. 기본적으로 이것은 서버가 인터넷에 액세스 할 수있을 때 작동하고 사이트에 액세스 할 때 외부 IP를 확인하기 위해 ipify.org 웹 사이트를 방문 할 수 있습니다.
slm

1
@BerenddeBoer 틀 렸습니다. inventory_hostname인벤토리에 설정된 것입니다. 에 설정된 호스트 이름 일 수 있습니다 .ssh/config.
Teresa e Junior

내가 말했듯이 @slm, 외부 공용 IP를 찾고 있다면. NAT 뒤에있는 경우 공개적으로 액세스 할 수있는 외부 IP가 없으므로이 방법을 사용하지 않습니다.
Simon Woodside

4

공용 IP를 찾는 또 다른 방법은 uri모듈 을 사용하는 것입니다 .

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

귀하의 IP는 ip_response.content


같은를 반환하는 또 다른 서비스 URL은 다음과 같습니다https://ipecho.net/plain
폴 파커

@PaulParker ipecho.net/plain KO 또는 API 토큰 요청 ... ifconfig.me 년 이후 더 좋고 안정적인 서비스 : +1
bastien

API 토큰을 요청한 적이 없습니다. 나는 서비스의 일관성에 대해 말할 수없고, 그것을 모니터링하지 않았지만 결코 실패하지 않았습니다.
Paul Parker

3

간단한 디버그 명령 :

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

호스트 IP 주소 얻기 :

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

예를 들어 템플릿에서 :

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

노트:

  • 인벤토리에서 DNS 이름을 사용할 수있을뿐만 아니라 IP가 아닌지 확인하는 것이 좋습니다.
  • 분명히이 영수증은 간접 호스트 사양 (예 : 점프 호스트 사용)에 대한 의도대로 작동하지 않을 것입니다.

그러나 여전히 사용 사례의 99 % (비상 적으로 말하면)를 제공합니다.


1
DNS가 환경에서 사용되지 않으면 어떻게 될까요?
techraf

(또는 고통을 느낍니다. 그렇지 않으면 그런 순진한 질문을하지 않을 것입니다.) — DNS가 인벤토리 1에서 사용되지 않는 경우 내 대답에 표시된대로 ansible_host를 직접 사용하십시오.
poige

1
Abs ansible_host문제의 호스트의 IP 주소가 아닌 경우 어떻게 합니까?
techraf apr

이것은 "그리고 무엇"이 아닙니다. 이전에 질문 한 질문이 계산되지 않는 이유는 "무엇"일뿐입니다. 잊지 마세요.
poige

1
나는 당신이 "실제 IP 주소"라고 부르는 것을 전혀 모른다. 비현실적인 것들을 알고 있습니까?
poige apr

1

일반 ansible_default_ipv4.address경우에 따라 생각하는 것과 다를 수 있습니다.

ansible_default_ipv4.address|default(ansible_all_ipv4_addresses[0])

0

다음 스 니펫은 원격 시스템의 공개 IP와 기본 IP (예 : LAN)를 반환합니다.

구성 파일을 사용할 때 혼동을 피하기 위해 ip를 따옴표로 인쇄합니다.

>> 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"
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.