本記事は、以下の記事の続きとなります。
前回の記事ではAnsibleでWindowsサーバーの設定をするために、実行環境を準備しました。本記事では実際にWindowsサーバーの設定をしていきます。
設定項目
本記事ではWindows Server 2019の以下の設定を、Playbookで実施したいと思います。
- ファイアウォール無効化
- タイムゾーン変更
- リージョン変更
- ユーザー作成
余談ですが、本当は日本語化もAnsibleで実施できるよう試行錯誤したのですが、言語パックのインストールにかなり時間がかかってしまい、日本語化は手動で実施したほうが早いという決断に至りました…
Playbook作成
前回の記事で作成したAnsible実行環境用仮想マシンにSSH接続し、Playbookを作成していきます。
Ansibleのベストプラクティス
AnsibleのPlaybookの構成にはベストプラクティスがあります。
前回の記事では、以下のようにディレクトリを構成していました。
ansible/ ├ inventory/ │ └ hosts └ test-playbook.yaml
このままでももちろんデプロイは可能ですが、今回はAnsibleのベストプラクティスに基づいてディレクトリ構成を見直していきます。
- 見直し後のディレクトリ構成
ansible/ ├ inventory/ │ └ hosts ├ group_vars/ # 変更点1 │ └ windows.yaml ├ roles/ # 変更点2 │ └ windows/ │ └ tasks/ │ └ main.yaml └ site.yaml # 変更点3
変更点は主に3つです。
- グループ変数ファイルの追加
- ロールの追加
- site.yamlの追加
各変更点について説明していきます。
グループ変数ファイルの追加
まずグループ変数ファイルの追加についてです。
今まではグループ変数をhosts
ファイルに直接記載しておりましたが、group_vars
ディレクトリ配下に「グループ名.yaml」を作成し、YAMLファイルに変数を記載します。
hosts
ファイルに直接変数を記載しても問題はないですが、ホストや変数が増えた場合には変数ファイルを分けたほうが変数の管理がし易くなります。
グループ変数についてはこちらのページもご参照ください。
- 変更後のhostsファイル
hosts
ファイルからWindowsグループ変数を削除しました。
[windows] xx.xx.xx.xx # hostsからwindowsグループ変数を削除
- 新規作成したwindows.yaml
新規作成したwindows.yaml
に、hosts
ファイルから削除したwindowsグループ変数を記載します。
変数の記載方法が変わっているため注意してください。
※タスクで使用する変数も追加で記載しています。
# The variables file used by the playbooks in the windows group. ansible_connection: winrm ansible_user: xxxxx ansible_password: xxxxx ansible_winrm_server_cert_validation: ignore win_firewall_state: disabled win_timezone: Tokyo Standard Time win_location: 122 win_user_name: xxxxx win_user_password: xxxxx
ロールの追加
Ansibleにはロールという概念があります。
前回の記事ではtest-playbook.yaml
に処理を直接記載していました。
実行するタスクが少なければ特に問題はないですが、処理するタスクが膨大になると1つのPlaybookでは管理が複雑になってしまうため、ロールを使用してタスクを分割していくことが望ましいです。
各ロールの配下にはtask, handlers, defaults, vars, ...などどいった定義ディレクトリを作成しますが、今回使用するのはtasks
のみです。
また、それぞれの定義ディレクトリにはmain.yaml
が含まれている必要があります。
tasks
にはロールで実行されるタスクを記載します。{{ 変数名 }}
で、グループ変数ファイルに記載した変数を使用することができます。
今回は以下のように記載しました。
- tasks/main.yaml
--- - name: Disable firewall win_firewall: state: "{{ win_firewall_state }}" profiles: - Domain - Private - Public tags: disable_firewall - name: Set timezone win_timezone: timezone: "{{ win_timezone }}" tags: win_timezone - name: Set the region location win_region: location: "{{ win_location }}" tags: win_region - name: create new user win_user: name: "{{ win_user_name }}" password: "{{ win_user_password }}" state: present groups: - Users tags: user_setting
site.yamlの追加
site.yamlは、ホストに対してどのロールを使用するのかを記載するPlaybookです。
本記事では以下のように記載しました。
- site.yaml
--- - name: Windows Setting hosts: windows roles: - windows
Playbookの実行
それではPlaybookを実行していきましょう。
Ansible実行環境用仮想マシンで以下のコマンドを実行します。
cd /home/<SSHしたユーザー名> cd ansible ansible-playbook -i inventory/hosts site.yaml
全てchanged
となり、正常に実行できたようです。
設定確認
Playbookが正常に実行できたため、実際に設定できているか確認してみます。 まず、ファイアウォールの無効化から確認します。
3つ全て無効化できていました。
次に、タイムゾーンの設定を確認します。
タイムゾーンも「(UTC+09:00) Osaka, Sapporo, Tokyo」に変更できていました。
リージョンも同様に「Japan」に変更できています。
最後に、コンピューターの管理画面からユーザーが追加できていることを確認します。
ユーザー名は伏せていますが、Playbookで指定したUsersグループにユーザーが追加できていることを確認できました!
Playbookのタスクに記載した処理は、全て正常に実行できていました。
Ansibleの冪等性
最後に、Ansibleを理解する上で避けては通れない「冪等性」について少しご説明します。
Ansibleでは冪等性を担保したPlaybookを作成する必要があります。
Ansibleにおける冪等性とは、何度Playbookを実行してもサーバーの状態が変わらないということです。
先ほど実行したPlaybookをもう一度実行してみましょう。
実行してみると結果は全てok
となり、changed
は0であることが分かります。サーバーの状態が変更されるとchanged
となり、サーバーの状態が変更されなかった場合はok
となるため、このPlaybookは冪等であると言えます。
Playbookを作成する際は冪等性を担保できるよう、各モジュールの特性を意識して作成しましょう!
Ansibleの冪等性については、こちらのページをご参照ください。
まとめ
今回はPlaybookの構成を見直し、実際にWindowsサーバーを設定してみました。
Linuxに対する実行よりも事前準備の手順が多く少し大変ですが、一回設定してしまえばその後のWindowsサーバーのメンテナンスも楽になると思います。
ぜひ試してみていただけたら嬉しいです。