AnsibleでWindowsサーバーを設定してみた-設定編-

本記事は、以下の記事の続きとなります。

blog.jbs.co.jp

前回の記事では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サーバーのメンテナンスも楽になると思います。

ぜひ試してみていただけたら嬉しいです。

執筆担当者プロフィール
近藤 結梨香

近藤 結梨香(日本ビジネスシステムズ株式会社)

業務では主にAzureに携わっています。映画好きで良く映画館に籠っています。

担当記事一覧