Ansibleを使ってWindows環境を構築する編 [その2]

このブログは、N高等学校とVRChatの世界からやってきた株式会社ArmorisアルバイトのShaderoが書いています。
あるもりすぶろぐの内容は個人の意見です。

弊社が提供する様々なトレーニングプログラムでは、トレーニングを行う際に、演習端末としてWindows環境を用意しています。
そこで先日、Ansibleというツールを使用して、端末の環境構築を効率的に行えるようにしました。
もっとも、実際に使いこなすには様々な試行錯誤がありました。
そこで今回は備忘も兼ねて、その際にいろいろ試したことなども含めてまとめました。

構築したい環境

前回はAnsibleを用いてホストサーバーに接続出来るように様々な準備を行いました。
今回からは以下を満たす環境を実際に作ります!

  • 以下の条件を満たした環境を準備
    • 環境要件
      • 管理者アカウントが存在するWindows環境を準備する
    • 構築内容

f:id:Armoris:20220216183747p:plain

今回はホストサーバーにトレーニング用のユーザーを作成する所までを行います!
作成したユーザーにトレーニングに必要なソフトをインストールしたり、レジストリを編集するなどは次回行います。

環境

ホストサーバー

Name Version
Windows 10 Pro 20H2
WinRM 3.0

Ansibleサーバー

Name Version
MacOS Big Sur 11.4
Ansible 2.11.6

Playbookとは

Playbookとは、YAML形式のファイルです。
そのファイルにホストサーバーに行わせたい処理を書くことで、望んだ環境にする事が出来ます。
また、Playbookがあればコマンド一つで複数のデバイスを自動的に設定することもできるため、手作業で行うよりも大幅に時間を短縮する事が出来ます。

ユーザーを作成するPlaybookを書いてみる

さっそくPlaybookを書いていきます。
ここではホストサーバーに新しいユーザーを作成するPlaybookを書きます。

下記のPlaybookを記述したymlファイルを作成します。(ファイル名として本記事ではbefore.ymlを使用)

- hosts: training          # 実行対象のホストの指定
  gather_facts: false      # 対象ホストの情報を取得して変数に格納するかどうかの設定
  vars:                    # 変数の記述
    # userNameやpasswordの値は、作成するユーザーに合わせて要変更
    userName: AnsibleTest
    password: password
  tasks:
    - name: ユーザーを作成
      win_user:
        name: '{{ userName }}'
        password: '{{ password }}'
        state: present
        groups:
          - Users
          - Remote Desktop Users

    - name: ユーザープロファイルを作成
      win_user_profile:
        username: '{{ userName }}'
        state: present

以下、上記コードの解説。

  • 1行目
    • 対象サーバーの指定。
    • 記述する際は、インベントリ内のグループ名やホスト名などを指定。
    • allも指定可能で、その場合はインベントリ内の全てのサーバーが対象になります。
  • 2行目
    • 対象ホストのOSやホストネームなどのシステム情報を収集し、変数(後述)に格納するかどうかの設定。
    • システム情報を収集するのは僅かに時間がかかるため、使わない場合はfalseにすることをお勧めします。
  • 3~6行目
    • 変数の記述。
    • 予め変数を定義したり、タスクの実行結果を変数として格納し使用することが可能。
    • 変数を使用する際は、値全体ををシングル、又はダブルクォートで囲った上で{{ (変数名) }}と記述。
  • 7行目以降
    • タスクと呼ばれる、対象サーバーに行わせたい処理を記述する箇所。
    • このPlaybookでは、ホストサーバーに新しいユーザーが作成されます。
    • ユーザーを作成するタスク以外に、ホストサーバーにファイルを転送するタスクや、レジストリを変更するタスクなど、様々な種類がありますが、各種タスクの使い方についてはAnsible公式ドキュメントを参照する事をお勧めします。

下記のコマンドで実行するとホストサーバーに新しくユーザーが作成されたのが分かります。

$ ansible-playbook before.yml

f:id:Armoris:20220215155414p:plain

f:id:Armoris:20220215155903p:plain

エラーが出る場合

AnsibleをMacOSで実行するとERROR! A worker was found in a dead stateと書かれたエラーが出る場合があります。
その場合は下記のコマンドで環境変数を登録すると正常に動く場合があります。(.bash_profileに登録するとなお良い)

$ export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES

あとがき

今回はホストサーバーにユーザーを作成するPlaybookを作成しました。
次回は今回作成したPlaybookを改良して、作成したユーザーにソフトをインストールしたり、レジストリを編集するタスクを追加します!

本記事がお役に立てましたら幸いです。