川獺の外部記憶

なんでも残しておく闇鍋みたいな備忘録

Windows PCをAnsibleでセットアップできるようにする

kawauso-lab.hatenablog.jp

↑の続編。

やろうとしていること

localhostで建てたAnsibleサーバから、localhost自身のWindowsのセットアップを行う。

準備

WinRMのセットアップ

AnsibleでWindowsを操作するには、Windows側でWinRMサービスによるリモートログインをできるようにしなければならない。

これについては既存のいろいろなページがあるので、そちらに詳説を譲る。

Ansibleで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.bathostsファイルをそこに入れる。

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の思想がそのまま転用できてしまう気がする。基礎思想さえあればあとは何が来てもなんとかなります。