# 5. Ansible によるサーバセットアップ

ここまでで一通り、Ansible playbook の作り方を学びました。 では、ここからは実際にサーバのセットアップを行っていきます。

# サーバ構築用のplaybook を作成する

前回、Playbook は一連のターゲットホストに対して複数の複雑なタスクを簡単に反復可能な方法で実行できるようにすると記載しました。

今回は前回の「対象ホストに対して ping 応答を確認する」とは異なり、 実際にサーバに対して何らかの操作を施すものを作ります。

# [実践演習] ユーザ・グループを作成するplaybookを作る

以下の要件を満たす playbook を作成してください

# 要求仕様

  • 作成する playbook 名
    • create_group.yml
  • 操作対象のターゲットグループ
    • グループ名
      • exercise
    • 対象ホスト
      • host00, host01
  • 実行タスク
    • タスク1
      • Linux ユーザグループの作成
        • グループ名, GID
          • bootcamp, 1750
    • タスク2
      • Linux ユーザ の作成
        • ユーザ名, UID
          • bootcampuser, 4000

# tasks作成のヒント

# 動作確認

playbookが作成できたならば以下の通り実行します。

ansible-playbook create_group.yml
1

実行ログ

SSH password:

PLAY [演習.5 ユーザ・グループを作成するplaybookを作る] ***********************************************************************************************************************************************************************************

TASK [ユーザグループを作成する] **********************************************************************************************************************************************************************************************************
changed: [host00]
changed: [host01]

TASK [ユーザを作成する] ******************************************************************************************************************************************************************************************************************
ok: [host01]
ok: [host00]

PLAY RECAP *******************************************************************************************************************************************************************************************************************************
host00                     : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
host
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 作成されたことの確認

ansibleコマンドが無事に実行できたならば、 ansible-exerciseのリポジトリにあるチェック用のplaybookを使ってグループとユーザの確認を行います。

分からなければ以下をそのままコピーして確認用のplaybookを作成します

---
- name: "演習.5 ユーザ・グループを作成するplaybookを作る"
  hosts: exercise
  gather_facts: false
  tasks:
    - name: グループ 'bootcamp' の情報を取得
      ansible.builtin.command: getent group bootcamp
      register: bootcamp_group
      ignore_errors: true
      changed_when: false

    - name: ユーザ 'bootcampuser' の情報を取得
      ansible.builtin.command: getent passwd bootcampuser
      register: bootcampuser_user
      ignore_errors: true
      changed_when: false

    - name: グループ 'bootcamp' が存在し、GID 1750 を持っているか確認
      ansible.builtin.assert:
        that:
          - "bootcamp_group.rc == 0"
          - "bootcamp_group.stdout.split(':')[2] == '1750'"
        fail_msg: "'bootcamp' グループが GID 1750 を持っていません。"

    - name: ユーザ 'bootcampuser' が存在し、UID 4000 を持っているか確認
      ansible.builtin.assert:
        that:
          - "bootcampuser_user.rc == 0"
          - "bootcampuser_user.stdout.split(':')[2] == '4000'"
        fail_msg: "'bootcampuser' ユーザが UID 4000 を持っていません。"
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
ansible-playbook assert_group.yml
1

正しくグループとユーザが作成されていれば正常終了するはずです。

# 参考情報

# syntax-check・dryrunの活用

Ansible を使う上で、playbook が正しく作る事ができたか事前に確認したくなることはないでしょうか。 幸い、Ansible には事前に書式をチェックする(Syntax check)や実行チェック(dryrun)機能が備わっています。

Playbook の書式チェックには --syntax-checkオプションを使います。 先ほどのコマンドの例で言えば以下のように実行します。

ansible-playbook -i inventories/hosts create_group.yml --syntax-check
1

これは playbook が正しく記述されているかどうかをチェックするコマンドになります。 --syntax-checkは簡単に実行できる反面、あくまで書式のチェックを行うだけなので タスクの実行チェックはなされません。

例えば、 http サーバをインストールし、起動する。といったタスクを作ろうとしたときに httpd の起動 -> httpd のインストール と書いていてもそれぞれの書式が正しければ syntax-check は OK となってしまいます。

従って、Playbook が正しく実行できるか?と言うことを事前に調べるにはチェックモード(dryrun)を用います。

ansible-playbook -i inventories/hosts create_group.yml -C
1

こちらのコマンドであれば、実際に Playbook を順番に試行し、実行できるか否かを チェックするため、より深く知ることが可能です。 では Ansible はこのドライランの時はどのように動作をしているのでしょうか? それはモジュール毎に -Cオプション付きで実行された時の動作が記載されており 条件分岐を行っています。

しかし、dryrunもsyntax-check同様万能ではありません。 Ansibleにおけるdryrunの実装はモジュールに委ねられており、Ansible全体としての動作を保証していません。 例えば、コマンドモジュール(command)のようなモジュールはチェックモードの分岐がなく、処理そのものがスキップされてしまいます。 こういったタスクが含まれている場合、コマンドの結果を次のタスクに受け渡す、 といったタスクが失敗してしまうので注意して使う必要があります。


CC BY-SA Licensed | Copyright (c) 2023, Internet Initiative Japan Inc.