管理者が ansible-playbook を使用してリモート Windows システム上で実行できるいくつかの操作を示します。
Ansible は、今日の市場で最も使用されている DevOps ツールの 1 つです。 Windows サーバーの構成と管理に使用される一連の Windows モジュールを提供します。 Windows サーバーを管理したい Windows に Ansible がすでにインストールされていると仮定します。
以下は、Windows 管理者が日常的に実行する一般的なタスクの一部です。 Ansible を使用して Windows を管理することがいかに簡単であるかに驚かれるでしょう。
私の Ansible Windows コントローラー マシンの IP アドレスは 192.168.0.106 で、リモート Windows システムの IP アドレスは 192.168.0.102 です。始める前に、必ず
win_ping
モジュールを実行して、Windows リモート サーバーに接続できるかどうかを確認してください。
@MSEDGEWIN10 ~
$ ansible win -m win_ping
192.168.0.102 | SUCCESS => {
"changed": false,
"ping": "pong"
}
リモートホストへの接続は成功しました。
それでは、Ansible Playbook を始めましょう…
ファイルのコピー
win_copy は 、ローカル サーバーからリモート Windows ホストにファイルをコピーする Ansible モジュールです。このモジュールを使用して 1 つの PDF をコピーします。
以下の YAML コードを使用して、ソースと宛先のパスを指定します。
@MSEDGEWIN10 ~
$ vi copy.yml
---
- hosts: win
tasks:
- name: Copy File
win_copy:
src: C:\output.pdf
dest: C:\ansible_examples\
remote_src: yes
win_copy の ansible-playbook を実行します。
@MSEDGEWIN10 ~
$ ansible-playbook copy.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Copy File] *****************************************************************************************************************************
changed: [192.168.0.102]
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=2 changed=1 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0
ファイルはリモート Windows システム上の宛先の場所に正常にコピーされました。
MSI のインストール/アンインストール
MSI ファイルを使用してアプリケーションをインストールするには、 win_get_url を使用してダウンロードする MSI ファイルのパスを指定し、 win_package モジュールを使用してそれをインストールする必要があります。現在の状態は、MSI がマシンにインストールされ、アプリケーションが現在の状態であることを意味します。
ここではApacheをインストールしています。
使用する YAML コード:
@MSEDGEWIN10 ~
$ vi msi.yml
---
- name: Installing Apache MSI
hosts: win
tasks:
- name: Download the Apache installer
win_get_url:
url: https://archive.apache.org/dist/httpd/binaries/win32/httpd-2.2.25-win32-x86-no_ssl.msi
dest: C:\ansible_examples\httpd-2.2.25-win32-x86-no_ssl.msi
- name: Install MSI
win_package:
path: C:\ansible_examples\httpd-2.2.25-win32-x86-no_ssl.msi
state: present
MSI を使用してインストールするには、ansible-playbook を実行します。
@MSEDGEWIN10 ~
$ ansible-playbook msi.yml
PLAY [Installing Apache MSI] *****************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Download the Apache installer] *********************************************************************************************************
changed: [192.168.0.102]
TASK [Install MSI] ***************************************************************************************************************************
changed: [192.168.0.102]
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=3 changed=2 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0
次に、Windows システムに移動し、Apache アプリケーションが正常にインストールされたかどうかを確認します。
C:\Users\>cd C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin
C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin>httpd -v
Server version: Apache/2.2.25 (Win32)
Server built: Jul 10 2013 01:52:12
引数を指定して MSI を使用してアプリケーションをインストールすることもできます。以下は上記と同じ例ですが、状態の代わりに、インストール引数を使用して Apache をインストールしています。
使用する YAML コード:
---
- name: Installing Apache MSI
hosts: win
tasks:
- name: Download the Apache installer
win_get_url:
url: https://archive.apache.org/dist/httpd/binaries/win32/httpd-2.2.25-win32-x86-no_ssl.msi
dest: C:\ansible_examples\httpd-2.2.25-win32-x86-no_ssl.msi
- name: Install MSI
win_package:
path: C:\ansible_examples\httpd-2.2.25-win32-x86-no_ssl.msi
arguments:
- /install
- /passive
- /norestart
MSI ファイルを使用してアプリケーションをアンインストールするには、 win_package モジュールを使用する必要があります。存在しない状態は、アプリケーションが MSI ファイルを使用してアンインストールされることを意味します。
ここでは、Apache をアンインストールします。
@MSEDGEWIN10 ~
$ vi uninstall_msi.yml
---
- name: UnInstalling Apache MSI
hosts: win
tasks:
- name: UnInstall MSI
win_package:
path: C:\ansible_examples\httpd-2.2.25-win32-x86-no_ssl.msi
state: absent
MSI を使用してアンインストールするには、ansible-playbook を実行します。
@MSEDGEWIN10 ~
$ ansible-playbook uninstall_msi.yml
PLAY [UnInstalling Apache MSI] *****************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [UnInstall MSI] *************************************************************************************************************************
changed: [192.168.0.102]
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=2 changed=1 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0
ここで、Apache のバージョンを確認すると、アプリケーションがアンインストールされたため、以下の出力が得られます。
C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin>httpd -v 'httpd' is not recognized as an internal or external command,
operable program or batch file.
ソフトウェアのアンインストール (.EXE)
ソフトウェアの製品 ID を使用して、.exe ファイルでソフトウェアをアンインストールすることもできます。
@MSEDGEWIN10 ~
$ vi uninstall.yml
---
- hosts: win
tasks:
- name: Uninstall 7-Zip from the exe
win_package:
path: C:\Program Files\7-Zip\Uninstall.exe
product_id: 7-Zip
arguments: /S
state: absent
ansible-playbook を実行して 7-Zip をアンインストールします。
@MSEDGEWIN10 ~
$ ansible-playbook uninstall.yml
PLAY [win] *************************************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************************************
ok: [192.168.0.102]
TASK [Uninstall 7-Zip from the exe] ***********************************************************************************************************************************************************
changed: [192.168.0.102]
PLAY RECAP *************************************************************************************************************************************************************************************
192.168.0.102 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Windows サービスの停止/開始/再起動
win_service ansible モジュールは、サービスを開始、停止、または再起動するために使用されます。ここではTomcatのサービスを停止する方法を紹介します。
YAML ファイルでサービス名を指定し、状態を停止に設定する必要があります。
@MSEDGEWIN10 ~
$ vi service.yml
---
- hosts: win
tasks:
- name: Stop service Tomcat
win_service:
name: Tomcat8
state: stopped
ansible-playbook を実行して Tomcat サービスを停止します。
@MSEDGEWIN10 ~
$ ansible-playbook service.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Stop service Tomcat] ****************************************************************************************************************
changed: [192.168.0.102]
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=2 changed=1 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0
Windows システム上で Tomcat サービスを確認すると、停止状態になっています。
状態を開始、再起動、または一時停止に定義して、サービスのステータスを変更できます。
事実の収集
win_disk_facts Ansible モジュールを使用すると、ターゲット ホストのすべてのディスク情報を取得できます。
@MSEDGEWIN10 ~
$ vi disk.yml
---
- hosts: win
tasks:
- name: Get disk facts
win_disk_facts:
- name: Output first disk size
debug:
var: ansible_facts.disks[0].size
- name: Convert first system disk into various formats
debug:
msg: '{{ disksize_gib }} vs {{ disksize_gib_human }}'
vars:
# Get first system disk
disk: '{{ ansible_facts.disks|selectattr("system_disk")|first }}'
# Show disk size in Gibibytes
disksize_gib_human: '{{ disk.size|filesizeformat(true) }}'
disksize_gib: '{{ (disk.size/1024|pow(3))|round|int }} GiB'
ansible-playbook を実行してディスク情報を取得します。
@MSEDGEWIN10 ~
$ ansible-playbook disk.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Get disk facts] ************************************************************************************************************************
ok: [192.168.0.102]
TASK [Output first disk size] ****************************************************************************************************************
ok: [192.168.0.102] => {
"ansible_facts.disks[0].size": "1000204886016"
}
TASK [Convert first system disk into various formats] ****************************************************************************************
ok: [192.168.0.102] => {
"msg": "932 GiB vs 931.5 GiB"
}
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=4 changed=0 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0
win_command Ansible モジュールを使用すると、リモート ホストでコマンドを実行し、CPU 情報やデバイスの詳細などを取得できます。
@MSEDGEWIN10 ~
$ vi check.yml
---
- hosts: win
tasks:
- name: Get disk facts
win_command: wmic cpu get caption, deviceid, name, numberofcores, maxclockspeed, status
register: usage
- debug: msg="{{ usage.stdout }}"
ansible-playbook を実行してリモート システム情報を取得します。
@MSEDGEWIN10 ~
$ ansible-playbook check.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Get facts] ************************************************************************************************************************
changed: [192.168.0.102]
TASK [debug] *********************************************************************************************************************************
ok: [192.168.0.102] => {
"msg": "Caption DeviceID MaxClockSpeed
Name
NumberOfCores Status \r\r\nIntel64 Family 6 Model 142 Stepping 9 CPU0 2712 Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz 2 OK \r\r\n\r\r\n"
}
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=3 changed=1 unreachable=0 failed=0
skipped=0 rescued=0
ignored=0
コマンドの実行
ウィンドウ上で実行するコマンドは何であれ、ansible win_command モジュールを通じて実行できます。 YAML ファイルでコマンドを指定するだけです。ここではディレクトリを作成しているだけです。
@MSEDGEWIN10 ~
$ vi commands.yml
---
- hosts: win
tasks:
- name: run an executable using win_command
win_command: whoami.exe
- name: run a cmd command
win_command: cmd.exe /c mkdir C:\test
ansible-playbook を実行して win_command 操作を実行します。
@MSEDGEWIN10 ~
$ ansible-playbook commands.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [run an executable using win_command] ***************************************************************************************************
changed: [192.168.0.102]
TASK [run a cmd command] *********************************************************************************************************************
changed: [192.168.0.102]
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=3 changed=2 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0
環境変数
Windows システムには、JAVA_HOME などの複数の環境変数があります。 win_environment ansible モジュールを使用すると、Windows システムで環境変数を追加または変更できます。この例では、Windows 環境変数リストに新しい変数を追加しています。
@MSEDGEWIN10 ~
$ vi env.yml
---
- hosts: win
tasks:
- name: Set an environment variable for all users
win_environment:
state: present
name: NewVariable
value: New Value
level: machine
ansible-playbook を実行して、リモート Windows マシンに環境変数を追加します。
@MSEDGEWIN10 ~
$ ansible-playbook env.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Set an environment variable for all users] *********************************************************************************************
changed: [192.168.0.102]
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=2 changed=1 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0
環境変数ウィンドウに移動します。追加したばかりの新しい変数がここに存在することがわかります。
レジストリの追加/編集
win_regedit ansible モジュールは、リモート Windows マシン上でレジストリの詳細を追加または編集するために使用されます。追加/更新するレジストリとコンテンツのパスを指定する必要があります。ここでは、HKLM:\SOFTWARE パス内に新しいレジストリ エントリ GeekFlare を作成し、このレジストリに名前とデータを追加しています。
@MSEDGEWIN10 ~
$ vi registry.yml
---
- hosts: win
tasks:
- name: Creating a registry
win_regedit:
path: HKLM:\SOFTWARE\GeekFlare
- name: Modifying a registry, adding name and data
win_regedit:
path: HKLM:\SOFTWARE\GeekFlare
name: Geek
data: Flare
ansible-playbook を実行してレジストリを追加します。
@MSEDGEWIN10 ~
$ ansible-playbook registry.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Creating a registry] *******************************************************************************************************************
changed: [192.168.0.102]
TASK [Modifying a registry, adding name and data] ********************************************************************************************
changed: [192.168.0.102]
PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=3 changed=2 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0
リモート システムのレジストリ エディタに移動すると、このレジストリが Name パラメータと Data パラメータを使用して正常に追加されたことがわかります。
ログの削除
win_eventlog ansible モジュールは、Windows イベント ログを Windows システムに追加、クリア、または削除するために使用されます。
Windows Powershell に移動し、リモート Windows マシン上に存在する EventLogs を一覧表示します。
PS C:\Users\> Get-EventLog -List
Max(K) Retain OverflowAction Entries Log
------ ------ -------------- ------- ---
20,480 0 OverwriteAsNeeded 33,549 Application
20,480 0 OverwriteAsNeeded 0 HardwareEvents
512 7 OverwriteOlder 20 Internet Explorer
20,480 0 OverwriteAsNeeded 0 Key Management Service
128 0 OverwriteAsNeeded 190 OAlerts
Security
20,480 0 OverwriteAsNeeded 44,828 System
15,360 0 OverwriteAsNeeded 3,662 Windows PowerShell
次に、Internet Explorer のすべてのソースからログを削除する方法を説明します。
@MSEDGEWIN10 ~
$ vi log.yml
---
- hosts: win
tasks:
- name: Remove Internet Explorer Logs
win_eventlog:
name: Internet Explorer
state: absent
ansible-playbook を実行して、リモート Windows マシンから Internet Explorer を削除します。
@MSEDGEWIN10 ~
$ ansible-playbook log.yml
PLAY [win] *************************************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************************************
ok: [192.168.0.102]
TASK [Remove Internet Explorer Logs] **********************************************************************************************************************************************
changed: [192.168.0.102]
PLAY RECAP *************************************************************************************************************************************************************************************
192.168.0.102 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ここで、再度 EventLogs を一覧表示すると、Internet Explorer のログが削除されていることがわかります。
PS C:\Users\> Get-EventLog -List
Max(K) Retain OverflowAction Entries Log
------ ------ -------------- ------- ---
20,480 0 OverwriteAsNeeded 33,549 Application
20,480 0 OverwriteAsNeeded 0 HardwareEvents
20,480 0 OverwriteAsNeeded 0 Key Management Service
128 0 OverwriteAsNeeded 190 OAlerts
Security
20,480 0 OverwriteAsNeeded 44,835 System
15,360 0 OverwriteAsNeeded 56 Windows PowerShell
以上、リモート Windows 管理に使用できる Ansible Playbook についての説明でした。さあ、これらのプレイブックを試してみてください。利用可能な他の Ansible Windows モジュール を試すこともできます。