Ansible:現在のターゲットホストのIPアドレスを取得します


100

役割で現在のホストのIPアドレスをどのように取得しますか?

ホストがメンバーになっているグループとホストのホスト名のリストを取得できることは承知していますが、IPアドレスを取得するための解決策が見つかりません。

ホスト名は次を使用して取得できます {{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

次に、各ネットワークインターフェイスに割り当てられたアドレスがあります...そのような場合、すべてのファクトを表示して、使用したい値を持つファクトを見つけることができます。


すべてのフラグをどのように表示しますか?
SJC 2016年

1
タスク内からすべてのフラグをリストできますか?
SJC 2016年

2
@SJCフラグ?事実だよね?はい、setup:モジュールを実行しregister: allfactsて表示- debug: var=allfacts
techraf

4
これが機能するには、の値がgather_facts必要trueです。デフォルトではtrueですが、ホストに関する情報が不要な場合はfalseに変更できます。
shshnk 2017

1
@poigeいつものように、新しい質問をすると正しくないかもしれません。
techraf

69

IPアドレスはhostvars、dict ansible_default_ipv4、key から取得できます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

25

template.j2 {{ ansible_eth0.ipv4.address }}では、と同じように使用できます{{inventory_hostname}}

ps:ANSIBLE GATHERSファクトを持つリモートホスト に関する情報を収集する方法の詳細については、次のブログ投稿を参照してください。

いつか誰かの助けになることを願ってッ


13
特に注意してください。現在、デフォルトのネットワークインターフェイスは常に「eth0」ではありません。ens3とか呼ばれることもあるenp2s0。あなたが使用ansible_default_ipv4して、それが機能しない場合は、より良い賭けがあります。それから、元のデフォルトを探して戻ってください。
Gabor Garami 2017

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変数は空です
Davide '28

2
AWSの場合、inventory_hostnameはIPアドレスになります。
Berend de Boer 2018

このプラグインは、特定の状況で機能します。NATの背後からインターネットにアクセスしている場合、機能しません。基本的に、これはサーバーがインターネットにアクセス可能で、サイトにアクセスするときにipify.org Webサイトにアクセスして外部IPを解決できる場合に機能します。
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
バスティアン

APIトークンを要求されたことはありません。サービスの一貫性について話すことはできません。監視していませんが、失敗したことはありません。
ポールパーカー

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

ホストの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"
}

1

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

テンプレートでは、例えば:

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

ノート:

  • インベントリで使用できるのはDNS名だけではないので、IPでないかどうかのチェックは、すでに追加されている方が適切です。
  • 明らかに、このレシートは、間接的なホスト仕様(たとえば、ジャンプホストの使用など)を意図したものとしては機能しません。

しかし、それでもユースケースの99%(比喩的に言えば)に対応しています。


1
また、環境でDNSが使用されていない場合はどうなりますか?
techraf

(または、私はあなたの痛みを感じます。そうでなければ、そのような素朴な質問をしません。)— DNSがインベントリで使用されていない場合は、私の回答に示されているようにansible_hostを直接使用します。
poige

1
ansible_host問題のホストのIPアドレスでない場合はどうなりますか?
techraf

これは「そして何」ではありません。それはあなたの以前に尋ねられた質問が数えられない「何」の原因に過ぎません、忘れないでください。
ページ

1
あなたが「実際のIPアドレス」と呼んでいるものの手がかりはありません。非現実的なものを知っていますか?
poige

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.