# 6. 変数やループ処理の実行
先ほどのplaybookではユーザとグループを作成しました。 しかし、実際は大量のユーザを作ったりサーバ毎にユーザ名を切り替えたりするなどの作業が必要です。
Ansible では、様々な変数をサポートしています。 これにより、プロジェクトの作成および保守がシンプルになり、エラーの数も低減されます。
この章では、Playbookで変数やループ処理を活用し、Webサーバの構築を体験します。
Ansibleの変数機能を使うことで、柔軟な構成管理や大量のリソース操作を効率化できます。
# [演習.6] 変数の追加と表示
Playbook内で変数を定義し、その値を表示します
以下の内容でPlaybookを作成します。
--- - name: 変数の追加と表示 hosts: all vars: username: "新人" home_dir: "/home/new_member" tasks: - name: 変数の値を表示 debug: msg: "ユーザー名: {{ username }}, ホームディレクトリ: {{ home_dir }}"
1
2
3
4
5
6
7
8
9
10以下のコマンドでPlaybookを実行します。
ansible-playbook -i inventory playbook.yml
1期待される出力例
TASK [変数の値を表示] ************************************************************ ok: [host00] => { "msg": "ユーザー名: 新人, ホームディレクトリ: /home/new_member" } ok: [host01] => { "msg": "ユーザー名: 新人, ホームディレクトリ: /home/new_member" }
1
2
3
4
5
6
7
# [発展演習.1] インベントリファイルで変数を定義する方法
先ほどの演習では変数をplaybookに記載しましたが、インベントリに関連付けた値になることもあります インベントリは使い回す状況にもかかわらず毎回playbookに記載するのは非効率であり、そのような場合はインベントリファイルに変数を定義することができます
- インベントリファイル(例:
inventory
)に変数を記載します。[all] host00 username=新人 home_dir=/home/new_member host01 username=新人 home_dir=/home/new_member
1
2
3 - Playbookは変数定義なしでOKです。
--- - name: インベントリ変数の表示 hosts: all tasks: - name: 変数の値を表示 debug: msg: "ユーザー名: {{ username }}, ホームディレクトリ: {{ home_dir }}"
1
2
3
4
5
6
7 - 実行コマンド
ansible-playbook -i inventory playbook.yml
1 - 動作確認 - 先ほどの演習と同じ結果が表示されれば成功です
# [発展演習.2] コマンドラインオプションで変数を渡す方法
変数の定義は実行に明け渡すことで定義することも可能です。 先ほどのインベントリから変数を削除し、今度はコマンドへの追加として明け渡してみましょう
- Playbookは変数定義なしでOKです。
--- - name: コマンドライン変数の表示 hosts: all tasks: - name: 変数の値を表示 debug: msg: "ユーザー名: {{ username }}, ホームディレクトリ: {{ home_dir }}"
1
2
3
4
5
6
7 - 実行コマンド(
-e
オプションで変数を渡します)ansible-playbook -i inventory playbook.yml -e "username=新人 home_dir=/home/new_member"
1 - 動作確認 - 先ほどの演習と同じ結果が表示されれば成功です
# [発展演習.3] 変数を使ってユーザ・グループを作成するplaybookを作る
ここまでの知見を活用してサーバのセットアップを行ってみましょう。
- 事前演習で作成した web00 app ホストに以下の要件でセットアップを行います
以下の要件を満たす playbook を作成してください
# 要求仕様
項目 | 内容 |
---|---|
Playbook名 | use_variable.yml |
対象グループ | web |
対象ホスト | web00, app00 |
タスク1 | 変数を使ったLinuxユーザの作成 |
タスク2 | 変数(リスト)を使ったLinuxユーザの作成(ループ) |
タスク3 | 変数(リスト)を使ったパッケージのインストール |
タスク4 | サービス(httpd)の起動 |
タスク5 | 変数を使ったHTMLコンテンツの作成 |
# tasks作成のヒント
# 基本形
- name: "演習.6 ユーザ・グループを作成するplaybookを作る"
hosts: exercise
gather_facts: false
tasks:
---ここにtaskを記載する---
1
2
3
4
5
2
3
4
5
# tasks作成のヒント
- パッケージのインストールにはansible-builtin-package (opens new window)を使います
- Ansibleでループを扱うにはこちら (opens new window)を使います
# playbookの作成
まずはこれまでの知識を使って自分で作ってみましょう 分からなければ開いて内容を確認しながら作成してみましょう 必要に応じてインベントリの更新も行ってください
use_variable.yml 例
---
- name: "演習.6 変数・ループを使ったWebサーバ構築"
hosts: web
gather_facts: false
vars:
web_user: web_user00
app_users:
- app_user01
- app_user02
- app_user03
packages:
- httpd
html_content: "Hello bootcamp"
tasks:
- name: webユーザの作成
ansible.builtin.user:
name: "{{ web_user }}"
state: present
- name: appユーザの作成(ループ)
ansible.builtin.user:
name: "{{ item }}"
state: present
loop: "{{ app_users }}"
- name: パッケージのインストール(ループ)
ansible.builtin.package:
name: "{{ item }}"
state: present
loop: "{{ packages }}"
- name: サービス(httpd)の起動
ansible.builtin.systemd:
name: httpd
state: started
enabled: true
- name: HTMLコンテンツの作成
ansible.builtin.copy:
dest: /var/www/html/index.html
content: "{{ html_content }}"
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
30
31
32
33
34
35
36
37
38
39
40
41
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
30
31
32
33
34
35
36
37
38
39
40
41
# playbookの実行
- playbookが作成できたならば以下の通り実行します
ansible-playbook -i inventories/hosts use_variable.yml
1 - 期待される出力例
TASK [webユーザの作成] *********************************************************** changed: [web00] changed: [app00] TASK [appユーザの作成(ループ)] ************************************************** changed: [web00] => (item=app_user01) changed: [web00] => (item=app_user02) changed: [web00] => (item=app_user03) changed: [app00] => (item=app_user01) changed: [app00] => (item=app_user02) changed: [app00] => (item=app_user03) TASK [パッケージのインストール(ループ)] ***************************************** changed: [web00] => (item=httpd) changed: [app00] => (item=httpd) TASK [サービス(httpd)の起動] ***************************************************** changed: [web00] changed: [app00] TASK [HTMLコンテンツの作成] ****************************************************** changed: [web00] changed: [app00]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 - ここまで正常に完了したらdocker-compose.ymlに記載された通り18080ポートでwebサーバが起動しているはずなので http::localhost:18080/ へアクセスしてみましょう
- Hello bootcamp の文字が表示されれば成功です
CC BY-SA Licensed | Copyright (c) 2023, Internet Initiative Japan Inc.