AnsibleでIPアドレスが特定のレンジに含まれるかの判別
データセンタ、クラウドのゾーンごとに処理を分岐したいときにIPアドレスをみて判別できるようにしたかったが、意外とすんなりいかなかったのでメモ。
TL;DR
こんな感じでwhen句を書いてあげるとあるIPアドレスが特定のレンジに含まれているかを判別してくれます。
- name: test debug: msg: work when: ansible_default_ipv4.address | ipaddr('10.0.2.0/24') | ipaddr('bool')
ansible_default_ipv4.addressが10.0.2.0/24の範囲に含まれているとworkと出力する。
解説
使うのはAnsibleのipaddr filter
https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters_ipaddr.html
前半部分
ipアドレスリスト | ipaddr('172.30.0.0/16')
この書き方で、ipアドレスリストの中で172.30.0.0/16の範囲内のipを抽出します。
% cat test.yml --- - hosts: Vag1 gather_facts: True tasks: - set_fact: testip: - "192.168.1.2" - "10.0.2.15" - name: test debug: msg: "{{ testip | ipaddr('10.0.2.0/24') }}"
これを実行すると
[koh@kohs-MacBook-Pro] ~/vag_test % ansible-playbook test.yml PLAY [Vag1] *************************************************************************************************************************** TASK [set_fact] *********************************************************************************************************************** ok: [Vag1] TASK [test] *************************************************************************************************************************** ok: [Vag1] => { "msg": [ "10.0.2.15" ] } PLAY RECAP **************************************************************************************************************************** Vag1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [koh@kohs-MacBook-Pro] ~/vag_test %
2つのIPのうち、10.0.2.0/24の範囲に含まれる10.0.2.15のみが出力される。
後半部分
ipアドレス | ipaddr('bool')
これで、ipアドレスが有効なipアドレスであればTrueを返す。
% cat test2.yml --- - hosts: Vag1 gather_facts: True tasks: - set_fact: testip: - "192.168.1.2" - "10.0.2.15.14.22" - "hogehoge" - "" - name: test debug: msg: "{{ item | ipaddr('bool') }}" with_items: "{{ testip }}"
これで実行すると
[koh@kohs-MacBook-Pro] ~/vag_test % ansible-playbook test2.yml PLAY [Vag1] **************************************************************************************************************************** TASK [set_fact] **************************************************************************************************************************** ok: [Vag1] TASK [test] **************************************************************************************************************************** ok: [Vag1] => (item=192.168.1.2) => { "msg": true } ok: [Vag1] => (item=10.0.2.15.14.22) => { "msg": false } ok: [Vag1] => (item=hogehoge) => { "msg": false } ok: [Vag1] => (item=) => { "msg": false } PLAY RECAP **************************************************************************************************************************** Vag1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [koh@kohs-MacBook-Pro] ~/vag_test %
上2つを組み合わせて、ansible_default_ipv4.addressとかを判別してあげるとそのホストのIPを機械的に判別できます。