Windows PCをAnsibleでセットアップできるようにする
↑の続編。
やろうとしていること
localhostで建てたAnsibleサーバから、localhost自身のWindowsのセットアップを行う。
準備
WinRMのセットアップ
AnsibleでWindowsを操作するには、Windows側でWinRMサービスによるリモートログインをできるようにしなければならない。
これについては既存のいろいろなページがあるので、そちらに詳説を譲る。
AnsibleでWindowsを操作する準備をする #Windows - Qiita
具体的には以下の操作を管理者権限で起動したPowerShellで実行する。
mkdir C:\work cd C:\work Invoke-WebRequest -Uri https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1 -OutFile ConfigureRemotingForAnsible.ps1 powershell -ExecutionPolicy RemoteSigned .\ConfigureRemotingForAnsible.ps1
リモートログイン可能ユーザの作成
適当なユーザを作成し、Remote Management Users
グループに所属させる。私はここでAdministrators
グループにも所属させておいた。両方必要っぽいが確証はない。
WinRM FW ルール作成
やってないがやったほうがいい。localhostだけに絞ればセキュリティリスクはほぼ無くなる。
Ansible実行
Hello World
適当なフォルダを作って、cygansible.bat
とhosts
ファイルをそこに入れる。
cygansible.bat
に下記を保存。
set CHERE_INVOKING=yes if exist C:\cygwin64 ( set CYGROOT=C:\cygwin64 ) if exist C:\cygwin ( set CYGROOT=C:\cygwin ) start /wait /d "%~dp0" /b %CYGROOT%\bin\bash --login -i -c "ansible windows -i hosts -m win_ping -vvvv" pause
hosts
に下記を保存。
[windows] localhost [windows:vars] ansible_user={作ったユーザ名} ansible_password={作ったユーザのパスワード} ansible_port=5986 ansible_connection=winrm ansible_winrm_server_cert_validation=ignore
cygansible.bat
を実行する。
下記の結果が返ってきたら◎
localhost | SUCCESS => { "changed": false, "invocation": { "module_args": { "data": "pong" } }, "ping": "pong" }
ソフトのインストールをしてみる
一気に応用まで飛んでしまう…*1
今回は試しにPython 3.9.0b3 64bitをインストールしてみる。
まず、cygansible.bat
を下記のように書き換えます。書き換えたのは「start」コマンドの行。
echo off set PBNM=%1 if ""%PBNM%""=="""" ( set PBNM=playbook.yml ) set CHERE_INVOKING=yes if exist C:\cygwin64 ( set CYGROOT=C:\cygwin64 ) if exist C:\cygwin ( set CYGROOT=C:\cygwin ) start /wait /d "%~dp0" /b %CYGROOT%\bin\bash --login -i -c "ansible-playbook -i hosts %PBNM%" pause
このbatはあくまでランチャとして設計しているので、今後書き換えることは無いはず。ファイル名 AnsibleLauncher.bat
とかのほうがいい気がしてきた。
次に、同じディレクトリにplaybook.yml
を下記の内容で作成する。
- hosts: windows tasks: - name: Make Package temp dir win_file : path=C:\\ansibletemp state=directory - name: Copy packages win_copy: src: ./packages dest: C:\\ansibletemp - name: Install python3.9.0b3 64bit win_package: path: C:\\ansibletemp\\packages\\python-3.9.0b3-amd64.exe Product_Id: '{B87E9F93-E59E-45EC-8F4E-E82507F65277}' arguments: - /quiet - InstallAllUsers=1 expected_return_code: [0, 1603] state: present
最後に、python-3.9.0b3-amd64.exeをカレントのpackagesフォルダに放り込んでおく。
この状態でcygansible.bat
を叩けばOK。
ちなみに、アンインストールしたい場合はdestruct.yml
を下記で作ってcygansible.batの引数にdestruct.ymlを付け足して実行…でいけるはずだけど、少しゴミが残った。win_packageモジュールに頼らずにコマンド直接実行したほうがいいかもしれない。
- hosts: windows tasks: - name: Uninstall Python 3.9.0b3 Utility Scripts (64-bit) win_package: Product_Id: '{2947B5D0-220C-4FA8-9621-D45FCD53F8C1}' expected_return_code: [0, 1603] state: absent - name: Uninstall Python 3.9.0b3 Core Interpreter (64-bit) win_package: Product_Id: '{BE06FCF0-173D-4573-A5D5-121CF319CC42}' expected_return_code: [0, 1603] state: absent - name: Uninstall Python 3.9.0b3 Standard Library (64-bit) win_package: Product_Id: '{E8FE43B2-E203-481E-BE7A-69FB652DA44B}' expected_return_code: [0, 1603] state: absent - name: Uninstall Python 3.9.0b3 Executables (64-bit) win_package: Product_Id: '{B87E9F93-E59E-45EC-8F4E-E82507F65277}' expected_return_code: [0, 1603] state: absent - name: Uninstall Python 3.9.0b3 pip Bootstrap (64-bit) win_package: Product_Id: '{55C77B34-40CB-4D26-83EA-35039B058243}' expected_return_code: [0, 1603] state: absent - name: Uninstall Python 3.9.0b3 Tcl/Tk Support (64-bit) win_package: Product_Id: '{DE00B206-A0CB-459C-B7FA-D2466D6AE331}' expected_return_code: [0, 1603] state: absent - name: Uninstall Python 3.9.0b3 Test Suite (64-bit) win_package: Product_Id: '{E13B3EF8-7EFB-455B-989B-E790CE9B6333}' expected_return_code: [0, 1603] state: absent - name: Uninstall Python 3.9.0b3 Development Libraries (64-bit) win_package: Product_Id: '{680D9CDC-2C16-4046-B89E-3DF557EC79F1}' expected_return_code: [0, 1603] state: absent - name: Uninstall Python 3.9.0b3 Documentation (64-bit) win_package: Product_Id: '{FAB7925F-FB0B-410B-AE68-73E4465A70BB}' expected_return_code: [0, 1603] state: absent
やってみて思ったこと
構成管理ツールを幸せに使うには、ある程度パッケージ側を作るときに構成管理ツールを意識して作らないといけないと痛感した。
まあけどそれは他の手法で自動化するときにも同じことが言えそう。
*1:ここまで来たら著者的にはdockerなどのIaCの思想がそのまま転用できてしまう気がする。基礎思想さえあればあとは何が来てもなんとかなります。