BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

template Moduleを使ってhostsファイルを設定してみた

はじめに

こんにちは! 最近しゃぶしゃぶが食べた過ぎる、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
次は実行playbookファイルの説明です。

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/ansible
Playbookの文法が間違っていないか確認します。
ansible-playbook -i hosts test_ntlt.yml --syntax-check
Playbookの内容で適切に変更されるか確認します。
ansible-playbook -i hosts test_ntlt.yml -Cの実行内容のchanged=1からhostsファイルが変更されることがわかります。
ansible-playbook -i hosts test_ntlt.yml -C

PLAY [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-VR4UUR5G

172.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ファイルと変数ファイルを変更すればいいという点です。
読んでいただきありがとうございました。