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

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

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

前回はホストサーバーに新しくユーザーを作成する所まで行いました。
今回は作成したユーザーにトレーニングに必要なソフトのインストールや、レジストリの編集を行います!
(本シリーズで構築する環境の概要は前回をご覧ください。)

環境

ホストサーバー

Name Version
Windows 10 Pro 20H2
WinRM 3.0

Ansibleサーバー

Name Version
MacOS Big Sur 11.4
Ansible 2.11.6

別ユーザーで特定のタスクを実行できるようにする

前回作成したPlaybookを改良して、作成したユーザーにWindows Terminalのインストールやレジストリの編集を行います。

ソフトのインストールとレジストリの編集をするタスクを書いて終わり!…と行きたいところですが、普通に記述すると作成したユーザーではなく、Ansibleでログインしているユーザーでタスクが実行されてしまい、Ansibleでログインしているユーザーのレジストリが変わったりソフトがインストールされてしまいます。
そこでAnsibleでログインしているユーザーではなく、作成したユーザーでタスクを実行するためには少し準備が必要です。

/etc/ansible/hostsファイルにansible_become_method=runasを追加して下記のようにします。

    [servers]
    (ホストサーバーのIPアドレス)

    [servers:vars]
    ansible_user='(Ansibleでログインする際に使うホストサーバーのユーザー名)'
    ansible_password='(Ansibleでログインする際に使うホストサーバーのユーザーのパスワード)'
    ansible_port=5986
    ansible_connection=winrm
    ansible_winrm_server_cert_validation=ignore
    ansible_become_method=runas

これによりAnsibleでログインしているユーザーとは別のユーザーでタスクを実行出来るようになります。

作成したユーザーでレジストリの編集やソフトウェアのインストールを行う

準備を行ったので、さっそく作成したユーザーにWindows Terminalのインストールやレジストリの編集を行います。
前回作成したPlaybookに以下を追記します。

    - name: 作成したユーザーのエクスプローラー上で、ファイルの拡張子と隠しファイルを表示するようにレジストリを変更
      win_regedit:
        path: '{{ item.path }}'
        name: '{{ item.name }}'
        type: dword
        data: '{{ item.data }}'
      with_items:
        - path: HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
          name: HideFileExt
          data: 0
        - path: HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced
          name: Hidden
          data: 1
      become: yes
      become_user: '{{ userName }}'
      vars:
        ansible_become_pass: '{{ password }}'

    - name: 作成したユーザーにGitをインストール (Bucketを追加するのに必要)
      community.windows.win_scoop:
        name: git
      become: yes
      become_user: '{{ userName }}'
      vars:
        ansible_become_pass: '{{ password }}'

    - name: Windows Terminalをインストールをするために必要なBucketを追加
      community.windows.win_scoop_bucket:
        name: extras
      become: yes
      become_user: '{{ userName }}'
      vars:
        ansible_become_pass: '{{ password }}'

    - name: 作成したユーザーにWindows Terminalをインストール
      community.windows.win_scoop:
        name: windows-terminal
      become: yes
      become_user: '{{ userName }}'
      vars:
        ansible_become_pass: '{{ password }}'

下記の部分がAnsibleで実行しているユーザーとは別のユーザーで特定のタスクを実行するために必要な記述です。
上記のPlaybookではPlaybook内で作成したユーザーで実行するようにしており、これにより新しく作成したユーザーに、特定のソフトのインストールや、レジストリの書き換えを実現しています。

become: yes
  become_user: '(実行したい別のユーザー名)'
  vars:
    ansible_become_pass: '(実行したい別のユーザーのパスワード)'

少し脱線

今回Windows TerminalのインストールにはScoopを用いました。
Windows向けのパッケージマネージャとしてはwingetやChocolateyあたりが有名だと思うのですが、大体のソフトをユーザーディレクトリにインストールしてくれ、環境が汚れにくいため今回はScoopを採用しました。

また、今回は本Playbookで作成したユーザーの初回ログイン前にソフトをインストールする場合を想定してPlaybookを構築しているのですが、Chocolateyだと一部ソフト(WSL版Ubuntu)を初回ログイン前にインストールしようとすると失敗したので別の物を使おうとしたのも理由の一つです。
(正直なところ何故失敗したのかは調べきれておらず、完全にChocolateyが原因なのか断定出来ないため、これは参考程度にしていただけると幸いです。)

ちなみにScoopモジュールは任意のソフトをインストールする時にScoop本体がない場合、自動的にScoopをインストールしてくれるため事前にインストールする必要はありません(とても便利)

動作確認

上記のPlaybookを実行すると、今までの動作に加え、作成したユーザーでエクスプローラーを開いた時にファイルの拡張子と隠しファイルが表示され、Windows Terminalがインストールされます。

f:id:Armoris:20220215164014p:plain

f:id:Armoris:20220215164028p:plain

おかたづけ

このままだとユーザーが作成されっぱなしで困るので、下記のPlaybookファイルを作成、実行してユーザーを削除します。
(削除するユーザーは予めサインオフさせてください。サインオフしていない場合ユーザープロファイルを削除するタスクが失敗する可能性があります。)

- hosts: servers
  gather_facts: false
  vars:
    username: AnsibleTest
  tasks:
    - name: ユーザーを削除
      win_user:
        name: '{{ username }}'
        state: absent

    - name: ユーザープロファイルを削除
      win_user_profile:
        name: '{{ username }}'
        state: absent

f:id:Armoris:20220201161822p:plain

感想

Playbookに行わせたい処理をガシガシ書くだけで複数のデバイスの環境を自動的に構築することが出来るのはとても時短になるので良いポイントだと思いました。
また、PlaybookもYAML形式でかなり見通し良く出来るため、後から見た時に「ここなにやってたっけ?」となるのが少なくなるのでオススメです!

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