このブログは、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がインストールされます。
おかたづけ
このままだとユーザーが作成されっぱなしで困るので、下記の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
感想
Playbookに行わせたい処理をガシガシ書くだけで複数のデバイスの環境を自動的に構築することが出来るのはとても時短になるので良いポイントだと思いました。
また、PlaybookもYAML形式でかなり見通し良く出来るため、後から見た時に「ここなにやってたっけ?」となるのが少なくなるのでオススメです!
本記事がお役に立てましたら幸いです。