久しぶりにAnsibleのお話なのですが、重宝するマジック変数のinventory_hostnameを紹介します。約8種類くらい変数があるのですが、inventory_hostnameを使えばもっとコードがキレイになります。早速いってみましょう。
■そもそもマジック変数とは
「定義済み変数」で、主に、インベントリ(hostsなど)に関する情報を元に変数化します。
■inventory_hostnameについて
インベントリに書かれたホスト名を参照して変数化してしまいます。実際に例を出してみると、Apacheの設定ファイルがサーバ毎に違った場合によく使うかと思います。以下にplaybookの階層を貼っときます。そもそも自分はサーバ毎にわざわざwith_itemsで、このサーバにはこのファイルを指定!他のサーバにはこのファイルを指定!のように書いていくと可読性が悪くなります。ここらへんを変数化したいなというわけでマジック変数使うわけです。
■階層
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$ tree apache apache ├── files │ ├── web01 │ │ ├── conf │ │ │ ├── httpd.conf │ │ │ └── magic │ │ ├── conf.d │ │ │ ├── README │ │ ├── conf.modules.d │ │ │ ├── 00-base.conf │ │ │ ├── 00-dav.conf │ │ │ ├── 00-lua.conf │ │ │ ├── 00-mpm.conf │ │ │ ├── 00-proxy.conf │ │ │ ├── 00-ssl.conf │ │ │ ├── 00-systemd.conf │ │ │ ├── 01-cgi.conf │ │ │ └── 10-php.conf │ │ └── sites-enabled │ │ ├── web01.conf │ │ └── www.web01.jp.conf │ └── web02 │ └── sites-enabled │ ├── web02.conf │ └── www.web02.jp.conf └── tasks ├── conf.yml └── main.yml |
・hosts
1 2 3 4 5 6 7 |
$ cat hosts # file: hosts [web] web01 web02 webxxx |
■inventory_hostnameを使わないコード
1 2 3 4 5 6 7 8 9 10 11 12 |
- name: copy httpd conf copy: src: "roles/apache/files/{{ item.src }}" dest: "/etc/httpd/{{ item.dest }}" backup: yes owner: root group: root with_items: - { src: "role/apache/files/web01/", dest: . } - { src: "role/apache/files/web02/", dest: . } - { src: "role/apache/files/web03/", dest: . } - { src: "role/apache/files/web04/", dest: . } |
■inventory_hostnameを使ったコード
1 2 3 4 5 6 7 8 9 10 |
--- - name: copy httpd conf copy: src: "roles/apache/files/{{ item.src }}" dest: "/etc/httpd/{{ item.dest }}" backup: yes owner: root group: root with_items: - { src: "{{ inventory_hostname }}/", dest: . } |
定義済み変数によってwith_itemsが一行になり、メンテナンス性が良くなります。
■inventory_hostnameでansibleを実行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$ ansible-playbook -i hosts site.yml -l web01 --tags httpd-conf PLAY [localhost] *************************************************************** skipping: no hosts matched PLAY [web01] **************************************************************** TASK [setup] ******************************************************************* ok: [web01] TASK [copy httpd conf] ********************************************************* changed: [web01] > (item={u'dest': u'.', u'src': u'web01/'}) $ ansible-playbook -i hosts site.yml -l web02 --tags httpd-conf PLAY [web02] **************************************************************** TASK [setup] ******************************************************************* ok: [web02] TASK [copy httpd conf] ********************************************************* changed: [web02] > (item={u'dest': u'.', u'src': u'web02/'}) PLAY RECAP ********************************************************************* web02 : ok=2 changed=1 unreachable=0 failed=0 |
ちゃんと変数化されてweb2台とも別々に反映された!
■まとめ
他のマジック変数いろいろ試してみよう。infrastracure as a Code!!!!楽だ!
参考: https://docs.ansible.com/ansible/2.9_ja/reference_appendices/special_variables.html
0件のコメント