あきろぐ

いろいろめもするよ🐈🐈🐈

Ansibleでインベントリに書いたIPアドレスを変数として使いたい

概要

最近Ansibleを頻繁に使っていて、こういう使い方ないかなと思って調べたのでそのやり方を整理。
やりたいことは、「インベントリファイルにグループ別にIPアドレスを記載しているので、そのIPアドレスを変数として使いgroup_varsディレクトリ配下のグループ別変数ファイルにIPアドレスをべた書きしないようにする」です。

環境

  • CentOS7.6
  • Ansible2.8.5

解決方法

作成したインベントリファイルは、以下の通りです。

[compute]
192.168.13.xx
192.168.13.xx
192.168.13.xx
192.168.13.xx
192.168.13.xx

[zabbix]
192.168.13.xx
192.168.13.xx

computeグループに属するIPアドレス一覧を取得したい

以下のようにgroup_vars配下の変数ファイルを作成します。

compute_ip_list: "{{ groups['compute']|join('/n') }}"

上記のようにjoinを使って書いてTemplateファイルで使用すると、computeグループのIPアドレスが改行された状態でリモートホスト内で展開されます。

例えば、以下のようなtemplateファイル、playbookを作成します。

compute_ip.txt.j2
{{ compute_ip_list }}

playbook_copy_file.yml
---
- hosts: compute
  user: "{{ login_user }}"
  tasks:
     - name: copy ip list
       template:
          src: compute_ip.txt.j2
          dest: "{{ remote_dir }}/compute_ip.txt"

上記のように設定して、Ansibleを実行すると以下のようにリモートホスト内で展開されます。

compute_ip.txt
192.168.13.xx
192.168.13.xx
192.168.13.xx
192.168.13.xx
192.168.13.xx

こちらのサイトを参考にしました。
codeday.me

Zabbixグループの1番目に記載したIPアドレスを取得したい

グループに属するIPアドレスを全て取得する方法は分かったけど、グループに属する1つのIPアドレスを取得したいときはリストを使って変数ファイルに記載します。

# zabbixグループに属する1番目のIPアドレスを取得する
zabbix_ip_1: "{{ groups['zabbix'][0] }}"

このように書けば、グループに属する1つのIPアドレスを指定することができます。
しかし、リスト番号にマッチするものがないとplaybook実行時にエラーを吐くので注意してください。
こちらの解決策は、Ansibleユーザー会のSlackで教えていただきました!(ありがとうございます!)
ansible-users.connpass.com

一応、グループに1つのホストしか属していない場合でも以下の書き方は使うことができます。

compute_ip_list: "{{ groups['compute']|join('/n') }}"

まとめ

  • インベントリファイルのIPアドレスを使って変数を作成できる
  • 例えばjoinメソッドやリストを使うことができる
  • Ansibleおもしろい

おしまい!