Proの初期設定をAnsibleなどでやってみる。Proの初期設定をAnsibleなどでやってみる。ベータ版ということもあり、特に入力周りに問題があり表示が崩れるためまだ常用するとは行かないが、それでもAnsibleを実行するくらいの役には十分立つ。10はOSに更新プログラムが当たると勝手に再起動することがあるのが非常に困りものである。そこを何とかしたい、というのが当初のモチベーション。Pro用の初期設定をほとんど自動でやってしまおうというのがこの記事の目的である。あるMacの初期設定をAnsibleで、ってやつのWindows版を書きたかったという話でもある。1607で実施しているが、将来この記事を書き直すことがあれば将来のバージョンに対応したものに書き換わっている可能性がある。今回、関係するファイルはすべて同じフォルダに置くものとしている。Ansibleのplaybookとインベントリファイルは改行コードがLFで文字コードがUTF-8、それ以外は改行コードがCRLFで文字コードがWindows-31Jとする。Linuxを機能として有効化するのだが、実際に使えるようになるまでに一度OS再起動が必要になってしまう。1そこで再起動前の処理と再起動後の処理を別々のバッチファイルに分け、かつ再起動後にその分の処理を自動で実行されるようにすることとする。最初の1つのバッチファイルを実行したらセットアップ完了まで何も触らなくても良いようにしている(エラー発生時はエラー内容を確認したいので除く)。いうわけで1st_step.batという名前のバッチファイルをまず作る。このバッチファイルは管理者ユーザで実行する必要がある。0レジストリ「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\(適当な何か)」キーに適当な名前の値と、実行したいバッチファイルをデータとして登録することでOS再起動後に登録したバッチファイルが実行される。NT\CurrentVersion\Winlogon」のAutoAdminLogonとDefaultPasswordを使って一時的に自動ログインが行われるようにして、OS再起動後に何も触らなくても勝手にバッチファイルが実行されるようにしている。その際のログインユーザは現在と同じユーザとなり、RunOnceExに書いた実行したいバッチファイルは管理者権限付きで実行される。「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\(適当な何か)」の方はOS再起動直後に自動で消滅するのでこちらで消す必要はない。addで、片やSet-ItemPropertyで行っているのはパスワードの取得がPowershell使う方法しか思いつかなかったからと、どちらの方法もメモとして残しておきたかったからだ。このパスワードは以下のように記述したAnsibleのインベントリファイル(この後のAnsibleの実行で使用する)のansible_password項に平文で書いてあったものをもらってきている。ansible_user項は現在のユーザである。windows.hosts[local_windows]local_windows[local_windows:vars]ansible_host=localhostansible_user=(ユーザ名)ansible_password=(パスワード)ansible_port=5986ansible_connection=winrmansible_winrm_server_cert_validation=ignore何度か出てくる「%~dp0」はこのバッチファイルの置かれているフォルダのパスに置換される。http://pentan.info/server/windows/cmd/dp0.html「ネットワークプロファイルをプライベートに変更する」「Ansibleのターゲットとなる準備をするスクリプトを実行する」はAnsibleでWindowsを操作する準備をするに書いた通りの事前準備である。Linuxの中ではなくWindows側なので、操作される準備が必要になる。offしてないのは処理の様子を見たかったからでありわざとである。Windowsだとcdで別のドライブに移れないのでpushdを使っている。/dとか打つくらいならpushdの方が好みなので。AnsibleのPlaybookを動かすまでOS再起動後に実行されるバッチファイルは2nd_step.batというファイル名にしてある。/yでインストールしているが、これだとrootユーザがパスワードなしで作られる。Linuxは今はSSHサーバとか上げてないし、外から直接触れないからそんなに問題にはならないだろうから今回はそのままにしてあるが、外から触れるようだと何らかの手当は必要だろう。winrmサービスは自動だが遅延開始なので、OS起動直後に利用したい場合は明示的にサービスを開始しないとまだ開始されていないことがあり得ることに注意。このバッチファイルはAnsibleのplaybookが実行されるまでのインストールに掛かる時間がかなりあるので、そのような配慮をする必要はないが一応サービスを上げておくこととした。Linux内でAnsibleをインストールしてplaybookである2nd_step.ymlを実行。"(コマンド)"で渡すことができる。playbookの最後でOSを再起動するので、どこかでエラーが出た時だけpauseに辿り着いてエラー内容を確認することができる、という寸法である。2nd_step.ymlの中身は以下の通り。2.2で追加されたwin_shellモジュールとwin_commandモジュールだが、結果としてpowershellで実行させたいものはwin_shellモジュールで、cmdで実行させたいものはwin_commandモジュールで実行するのが見た目にわかりやすそうだったのでそうしている。win_commandはパイプとか使えないのでcmdでもパイプとかを含む場合はwin_shellを使わないとならないが、今回そのようなものは1つもない。ローカルグループポリシーで操作できるものはレジストリを触っても同じ効果が出るはずだが、ここではPolicyFileEditorというツールを使ってローカルグループポリシーを操作することにしている。これはレジストリを触って値を変更するとローカルグループポリシーエディタ(OSに元からついてるやつ)で見ると変更した値が反映されていないように見えるのが気持ち悪いからである。ローカルグループポリシーで最大の目的である勝手に再起動を防ぐのをやっている。この設定で更新プログラムがインストールされて、OS再起動が必要でも再起動待ちの状態になる。「自動更新を構成する」の(この設定は使用されない)と書かれているものは、ローカルグループポリシーエディタで設定すると使われないけど勝手に設定されるやつをこっちでも設定しておいた、という話。あとCortana重いから切る。レジストリの変更でもいろいろやっている。この辺りは趣味の問題でもある。NTPクライアントの設定は本当にこれで正しいのか調べても正直確信が持てない。Defenderの更新をタスクスケジューラーで実施する」のところではいくつかのテクニックが使用されている。}}で囲んだ上にスペースまで巻き込むようにしてやっとできた。1607ではその手法では期待通りの動きにならない。「1回」、継続時間を「無期限」にする必要がある。https://shimajun.blogspot.jp/2016/08/windows-10-anniversary-update_7.html「PolicyFileEditorを使ってスタート画面のレイアウトを一旦ストアだけにする」のは「予定と近況」などのタイルはまったく使わないので全消去したいが、全消去したレイアウトファイルは適用に失敗するようなので、適当な何か1つだけ残したものをまず適用してからその1つを削除しようというもの。ストアだけ残したレイアウトファイルをstart_layout_store.xmlという名前にしている。(エクスポートファイルのフルパス)でエクスポートしたものを編集したものだ。適当な何か1つ、としたが要素名が「start:Tile」のものと「start:SecondaryTile」のものがあり、「start:SecondaryTile」のものはコマンドで削除する方法が見当たらなかったので残すのは「start:Tile」のものである必要があり、また必ず存在するもので、かつ後で一緒にタスクバーからも消したいものを1つ選んだ結果がストアである。</DefaultLayoutOverride></LayoutModificationTemplate>で、これを適用するにはまたOS再起動が必要になるので3rd_stepへ続く。自動実行のためにまた「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\(適当な何か)」キーを使用するが、前回と同じ名前だと実行してくれないようだったので、適当な何かの部分は前回は「1」だが今回は「2」。アプリのインストールに関するあれこれ今度のバッチファイルは3rd_step.batとしている。エラー発生時は実行内容を確認するため一旦停止pause3rd_step.batの内容について説明は2nd_step.batのところの内容でカバーできているので、playbookである3rd_step.ymlの説明に移る。chocolateyからautohotkey.installをインストールさせる。02nd_step.ymlで適用したレイアウトファイルの適用を解除してあるが、これは適用したままだとレイアウトがこの内容で固定されるため、この後のコマンドで変更できないからである。レイアウトの内容自体は解除後も適用された内容のままである。これでまたOS再起動が必要になる。3rd_step.ymlではアプリのインストールも行っている。これらは別に2nd_step.ymlでやっても良かったが、先に設定の反映をしたかったので時間が掛かるものを後に回した。Chocolateyでインストールされるいくつかのアプリはautohotkey.portalに依存しているが、残念ながら現在autohotkey.portalのインストールは失敗する。Webブラウザで開けばわかるがCAPTCHAを入力しないと本来のダウンロードURLに進めなくなったため。日本以外でそのような書き込みをまだ見たことがないのでもしかしたらおま国なのかもしれない。http://techmeou.hatenadiary.jp/entry/2016/10/06/005430そこでGitHubからダウンロードできるautohotkey.installの方をまずインストールしている。これをインストールしておけばautohotkey.portalに依存しているアプリもignore_dependenciesをyesにする必要があるがインストール可能となる。後始末とか最後に実行されるバッチファイル4th_step.batは以下の通り。pause)スタート画面のレイアウトにストアだけ残しておいたので、タスクバーにあるものもろとも外してしまう。Shell.Application).NameSpace('shell:AppsFolder')が空で返ってきてしまうのでバッチファイル側でないとできなかった。4th_step.ymlではOS再起動は行わないため、pauseを行うのはerrorlevelが1の時、としてみた。-cのエラー時に1以外のリターンコードになる可能性があるかは不明。absentこれが最後の処理なので自動ログインを解除して、OS起動時に認証が必要な状態に戻す。今後の目標この企画は2016-09から始めて、たまに手を加えている程度のものなので将来に渡ってもあまり進捗はないと思われるが、一応やりたいことを挙げておく。一部の処理をsysprepで行う1台でansible-playbookを実行するだけでたくさんのWindowsマシンの初期設定ができるようにしたかったのだが、現状バッチファイル側で行っていることも多く、そこまで持っていくには一部の処理はsysprepに一部の処理を記載したUnattend.xmlを食わせる必要がありそう。この辺りまだ調査してない。そこまでやるなら1台だけでansible-playbookを実行する理由もなくなる気がするのだが。最初に実行するバッチファイルもUnattend.xmlに定義するだろうから、それを1台だけに限定する必要が感じられない。Remove-AppxPackage"とか実行しているのだが、このコマンドはこれら不要なアプリのインストールが完了するまでは実行しても意味がないのでバッチファイルに組み込めていない。そもそも不要なアプリがインストールされるのを阻害したかったのだけど、その方法が見つかっていない。これもUnattend.xmlでできると予想している。設定ファイルやレジストリの書き換えでやるには辛くてGUIで設定した方が良さそうなものの設定はAutoHotKeyを駆使するしかないかな。そもそもChocolateyでインストールできない、サイレントインストールもできないアプリとかインストールしたければそうせざるを得ない。Linuxの設定自体はほとんどしていない表示崩れ対策はSSHサーバインストールしてSSHで繋いで使うとかなのかなあ。ここをどうにかしないとまだ常用する気にはなれない。その他、まだ達成していないことがいくつか特にスタートアップに登録するためのコマンドを見つけられなかったのが心残りである。Updateでは再起動しなくても良くなる模様。upLoginユーザーは見つかりませんでした。