ホーム テクノロジー DEVOPS 9 Windows 管理用の Ansible Playbook の例

9 Windows 管理用の Ansible Playbook の例

管理者が 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 システム上の宛先の場所に正常にコピーされました。

Ansible Windows コピー
Ansible Windows コピー
Ansible 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のサービスを停止する方法を紹介します。

Ansible Windows Tomcat
Ansible Windows Tomcat
Ansible Windows 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 サービスを確認すると、停止状態になっています。

Ansible Windows Tomcat 停止
Ansible Windows Tomcat 停止
Ansible 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

環境変数ウィンドウに移動します。追加したばかりの新しい変数がここに存在することがわかります。

Ansible Windows 変数
Ansible Windows 変数
Ansible Windows 変数

レジストリの追加/編集

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 パラメータを使用して正常に追加されたことがわかります。

Ansible Windows レジストリ
Ansible Windows レジストリ
Ansible Windows レジストリ

ログの削除

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 モジュール を試すこともできます。

「 9 Windows 管理用の Ansible Playbook の例」についてわかりやすく解説!絶対に観るべきベスト2動画

Ansible 用に Windows ホストを構成する – ansible WinRM
運用事例から考えるAnsibleの利用方法
https://www.youtube.com/watch?v=8xxlf53YrYU&pp=ygU1IDkgV2luZG93cyDnrqHnkIbnlKjjga4gQW5zaWJsZSBQbGF5Ym9vayDjga7kvosmaGw9SkE%3D