はじめに
こんにちは!
最近しゃぶしゃぶが食べた過ぎる、BFT名古屋支店の池上(いけちゃんまん)です。
最近Ansibleについて学んでいてそろそろアウトプットしなきゃと思ったのでこの記事を書き始めました。
今回はtemplate Moduleを使ってhostsファイルを設定します。Ansible初心者向けの記事となっています。
template Moduleとは
template Moduleはcopy Module同様、対象ホストにファイルを転送するModuleです。copy Moduleはファイルをそのまま転送しますが、 template Moduleは送信元のファイルにplaybook内で定義された変数を埋め込んでから転送します。 templateファイルはPythonのテンプレートエンジンであるJinja2形式で記述します。Jinja2ではファイル内に変数を埋め込んだり、if文、for文などを使用して記述を分けたりループさせたりすることができます。
今回使用したModule引数
・src:コピー元のファイルパスを設定
相対パスファイル名 (※ファイルはrolename/template/ファイル名 に配置)
・dest:コピー先のファイルを指定
・owner:コピー先のファイルの所有ユーザを指定
・group:コピー先のファイルの所有グループを指定
・mode:コピー先のファイルのパーミッションを指定
準備するもの
1.playbookファイル
(/etc/ansible/roles/template_hosts_ntlt/tasks/main.yml)
2.Jinja2ファイル
(/etc/ansible/roles/template_hosts_ntlt/templates/test.j2)
3.変数ファイル
(/etc/ansible/roles/template_hosts_ntlt/vars/main.yml)
4.実行playbookファイル
(/etc/ansible/test_ntlt.yml)
各ファイルの内容
1.playbookファイル
Playbookファイルの中身を軽く説明します。主なtemplate Moduleの引数は、src,dest,owner,group,modeです。引数については先ほど説明したので重要なsrcについてのみ説明します。srcは相対パスを指定した場合、同じRole内のtemplatesディレクトリ内のファイル(※今回であればroles/template_hosts_ntlt/templates/)からの相対パスを検索します。指定するファイルはJinja2ファイル(ジンジャファイル)です。
今回のPlaybookファイルで処理されている内容を説明します。
処理されている内容は主に3つあります。
1.test.j2ファイルを/etc/hostsファイルに転送する
src: test.j2
dest: /etc/hosts
2.転送したファイルの所有者とグループをrootにし、ファイルの権限を644にする
owner: root
group: root
mode: '0644'
3.rootユーザで実行をできるようにする
become: yes
- name: Template a file to /etc/hosts ansible.builtin.template: src: test.j2 dest: /etc/hosts owner: root group: root mode: '0644' become: yes
次にJinja2ファイルについて説明します。
2.Jinja2ファイル (元々の/etc/hostsに追記)
Jinja2ファイルではファイルの変数を埋め込むための箱を準備しています。変数は変数ファイルに準備してあります。このjinja2ファイルに変数を入れたものが/etc/hostsに転送されます。
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf: # [network] # generateHosts = false 127.0.0.1 localhost 127.0.1.1 LAPTOP-VR4UUR5G.localdomain LAPTOP-VR4UUR5G{{ ipnum1 }} {{ hostname1 }} {{ ipnum2 }} {{ hostname2 }} {{ ipnum3 }} {{ hostname3 }} {{ ipnum4 }} {{ hostname4 }} {{ ipnum5 }} {{ hostname5 }} {{ ipnum6 }} {{ hostname6 }} {{ ipnum7 }} {{ hostname7 }}
# The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouteri
3.変数ファイル
変数ファイルはすごく簡単です。Jinja2ファイルに入る変数を定義しているだけです。Jinja2ファイルの{{ ipnum1 }} に変数ファイルで設定している172.11.11.1が入ります。
hostname1: dands001ntlt hostname2: dands002 hostname3: danfs001 hostname4: danfs002 hostname5: danbt001 hostname6: danap001 hostname7: danev001 ipnum1: 172.11.11.1 ipnum2: 172.11.11.2 ipnum3: 172.11.11.3 ipnum4: 172.11.11.4 ipnum5: 172.11.11.5 ipnum6: 172.11.11.6 ipnum7: 172.11.11.7
4.実行playbookファイル
今回は自身に対してansibleの設定を流しているので対象hostはlocalhostです。rolesにはrolename(今回であればtemplate_hosts_ntlt) を書きます。
- hosts:対象host
roles:
- rolename(今回であればtemplate_hosts_ntlt)
この規則で書くだけです。
- hosts: localhost roles: - template_hosts_ntlt
実行してみた
実行前hostsファイル
まず実行前のhostsファイルを確認します。この状態ではhostsファイルには何も書いてないことがわかります。
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf: # [network] # generateHosts = false 127.0.0.1 localhost 127.0.1.1 LAPTOP-VR4UUR5G.localdomain LAPTOP-VR4UUR5G# The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters
実行コード
/etc/ansibleデイレクトリに移動
cd /etc/ansiblePlaybookの文法が間違っていないか確認します。
ansible-playbook -i hosts test_ntlt.yml --syntax-checkPlaybookの内容で適切に変更されるか確認します。
ansible-playbook -i hosts test_ntlt.yml -Cの実行内容のchanged=1からhostsファイルが変更されることがわかります。
ansible-playbook -i hosts test_ntlt.yml -CPLAY [localhost] ******************************************************************
TASK [Gathering Facts] ************************************************************ ok: [localhost]
TASK [template_hosts_ntlt : Template a file to /etc/hosts] **************** changed: [localhost]
PLAY RECAP ************************************************************************ localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Playbook本実行
※実行結果は先ほどと同じものが出るので割愛しますが、-C同様changed=1になっていることを確認してください。
ansible-playbook -i hosts test_ntlt.yml
実行後hostsファイル
実行後の/etc/hostsファイルを確認してみます。Jinja2ファイルで作成した変数の中に、変数ファイルで定義した変数が入っていることが確認できました。
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf: # [network] # generateHosts = false 127.0.0.1 localhost 127.0.1.1 LAPTOP-VR4UUR5G.localdomain LAPTOP-VR4UUR5G172.11.11.1 dands001ntlt 172.11.11.2 dands002 172.11.11.3 danfs001 172.11.11.4 danfs002 172.11.11.5 danbt001 172.11.11.6 danap001 172.11.11.7 danev001
# The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouteri
まとめ
このようにしてtemplate Moduleでhosts設定をしました。今回作成したファイルのいいところは、hostsファイルに追加でIPアドレスを入れたい時があれば playbookファイルは変更せずに、Jinja2ファイルと変数ファイルを変更すればいいという点です。
読んでいただきありがとうございました。