2019年9月29日日曜日

Ansible で Inventory ファイルに記載されている IP 情報を取得する方法

概要

Inventory ファイルに記載されている IP アドレスを playbook 内で使いたい場合はあると思います
そんな場合には Magic Variables を使いましょう

環境

  • CentOS 7.7.1908
  • ansible-playbook 2.8.5

サンプルコード

debug_hosts グループ内で定義されているホストの IP アドレスを取得してみたいと思います

  • vim main.yml
- hosts: target
  tasks:
    - name: debug inventry
      vars:
        msg: |
          {% for item in groups['debug_hosts'] %}
          {{ hostvars[item].ansible_host }}
          {% endfor %}
      debug:
        msg: "{{ msg.split('\n') }}"
#      debug:
#        msg: "{{ groups }}"

インベントリファイルは以下の通りです

  • vim inv
target:
  hosts:
    localhost:
      ansible_host: 127.0.0.1
debug_hosts:
  hosts:
    host1:
      ansible_host: 192.168.200.10
    host2:
      ansible_host: 192.168.200.11

ansible 自体は localhost に実行します

実行

  • ansible-playbook -i inv main.yml

結果

ok: [localhost] => { "msg": [ "192.168.200.10", "192.168.200.11", "" ] }

解説

まず groups 変数にインベントリファイルに定義したグループの情報が含まれています
ただ groups にはホスト名までの情報しかなく IP アドレスの情報は含まれていません
そこで登場するのが hostvars です
これもマップで管理されておりホスト名をキーにするとそのホストの情報が取得できます
その中に ansible_host というフィールドがありここで IP アドレスを管理しています

サンプルでは debug + template を使っていますが playbook ないで使う場合は好きなリソースを使ってください
また見やすくするように一旦 vars を使っていますがこれも playbook 内では不要かなと思います

参考サイト

0 件のコメント:

コメントを投稿