概要
最近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') }}"