2016年2月27日土曜日

[SOS JobScheduler] Ansible で Windowsのジョブを実行する


SOS JobScheduler のエージェントが有償ライセンスになったらしい。
でも、有償でなくても、同時に1タスクまでだったら起動できるみたい。

Unix系OSのジョブは、SSHで実行できるので、Windowsのジョブが実行できれば、エージェントがなくても、そんなに困らないと思う。
(エージェントを使いたい状況が、Windowsのジョブ実行以外で、思いつかない。。。)

そこで、JobSchedulerのエージェントを使わずに、Windowsのジョブを実行する方法を考えてみました。

Windowsに OpenSSHサービスを入れる方法もありますが、今回は、最近使い始めた Ansible を利用してWindowsのジョブを実行できるか試してみます。

AnsibleはWindowsに対してWindows Remote Management(WinRM)というものを使用して操作を行います。

Ansible で Windows を操作する環境をセットアップする方法は、下記URLが詳しいです。


Ansible + Windowsの準備


今回は、Windows2012を使用します。
AnsibleでWindowsを使用する手順は上記で紹介したページのとおり。

Windows2012では、PowerShell で以下のようにコマンドを実行しました。
Windows PowerShell
Copyright (C) 2012 Microsoft Corporation. All rights reserved.

PS C:\Users\Administrator> Get-NetConnectionProfile -IPv4Connectivity Internet


Name             : ネットワーク
InterfaceAlias   : イーサネット
InterfaceIndex   : 12
NetworkCategory  : Public
IPv4Connectivity : Internet
IPv6Connectivity : NoTraffic



PS C:\Users\Administrator> Set-NetConnectionProfile -InterfaceAlias (Get-NetConnectionProfile -IPv4Connectivity Internet).InterfaceAlias -NetworkCategory Private
PS C:\Users\Administrator> Get-NetConnectionProfile -IPv4Connectivity Internet


Name             : ネットワーク
InterfaceAlias   : イーサネット
InterfaceIndex   : 12
NetworkCategory  : Private
IPv4Connectivity : Internet
IPv6Connectivity : NoTraffic



PS C:\Users\Administrator> mkdir C:\work


    ディレクトリ: C:\


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2016/02/27      5:06            work


PS C:\Users\Administrator> cd C:\work
PS C:\work> Invoke-WebRequest -Uri https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1 -OutFile ConfigureRemotingForAnsible.ps1
PS C:\work> ls


    ディレクトリ: C:\work


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2016/02/27      5:08       6239 ConfigureRemotingForAnsible.ps1


PS C:\work> powershell -ExecutionPolicy RemoteSigned .\ConfigureRemotingForAnsible.ps1


wxf                 : http://schemas.xmlsoap.org/ws/2004/09/transfer
a                   : http://schemas.xmlsoap.org/ws/2004/08/addressing
w                   : http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
lang                : ja-JP
Address             : http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
ReferenceParameters : ReferenceParameters

OK



PS C:\work>

Windows側の準備は以上です。

こんどは、JobScheduler をインストールしたマシン(CentOS6)に、Ansible をインストールします。
[root@centos6 ansible]# yum install ansible python-pip
[root@centos6 ansible]# pip install pywinrm

イベントリファイル(hosts)を作成してCentOS6からWindows への疎通確認をします。
[root@centos6 ansible]# cat hosts
[windows]
10.1.0.114

[windows:vars]
ansible_ssh_user=administrator
ansible_ssh_pass=p@ssw0rd
ansible_ssh_port=5986
ansible_connection=winrm
[root@centos6 ansible]# ansible windows -i hosts -m win_ping
10.1.0.114 | success >> {
    "changed": false,
    "ping": "pong"
}

実行結果に success と表示されたら Ansible でWindowsを操作可能です。


テスト用バッチ処理の準備


テスト用に、Windows側に以下のような内容でバッチファイル(c:\work\test.bat)を用意します。
hostname
exit 0

CentOS6から Ansible でリモート実行して動作確認します。
[root@centos6 ansible]# ansible windows -i hosts -m raw -a "c:\work\test.bat"
10.1.0.114 | success | rc=0 >>

C:\Users\Administrator>hostname
WIN-F7P411FIOMA

C:\Users\Administrator>exit 0


[root@centos6 ansible]# echo $?
0


ジョブの登録と実行


JobScheduler 用にスタンドアローン・ジョブを作成します。
<job>
    <script  language="shell">
        <![CDATA[
ansible windows -i /home/jobs/ansible/hosts -m raw -a "c:\work\test.bat"
st=$?
echo "status=$st"
exit $st
        ]]>
    </script>
    <run_time />
</job>

即時実行するとジョブが正常終了し、ログが以下のように表示されます。
2016-02-27 15:09:57.854+0900 [info]   SCHEDULER-918  state=starting (at=2016-02-27 15:09:57.841+0900)
2016-02-27 15:09:57.854+0900 [info]   SCHEDULER-987  Starting process: '/bin/sh' '-c' '"/tmp/jobs/sos.MmXDIF"'
2016-02-27 15:09:58.444+0900 [info]   10.1.0.114 | success | rc=0 >>
2016-02-27 15:09:58.444+0900 [info]    
2016-02-27 15:09:58.444+0900 [info]   C:\Users\Administrator>hostname 
2016-02-27 15:09:58.444+0900 [info]   WIN-F7P411FIOMA 
2016-02-27 15:09:58.444+0900 [info]    
2016-02-27 15:09:58.444+0900 [info]   C:\Users\Administrator>exit 0  
2016-02-27 15:09:58.444+0900 [info]   
2016-02-27 15:09:58.444+0900 [info]   
2016-02-27 15:09:58.444+0900 [info]   status=0
2016-02-27 15:09:58.445+0900 [info]   SCHEDULER-915  Process event

つぎに、test.bat の終了ステータス を 1 にして 即時実行するとジョブが異常終了しログが以下のように表示されます。
2016-02-27 15:12:19.557+0900 [info]   SCHEDULER-918  state=starting (at=2016-02-27 15:12:19.544+0900)
2016-02-27 15:12:19.558+0900 [info]   SCHEDULER-987  Starting process: '/bin/sh' '-c' '"/tmp/jobs/sos.Bt5Hy7"'
2016-02-27 15:12:20.110+0900 [info]   10.1.0.114 | FAILED | rc=1 >>
2016-02-27 15:12:20.110+0900 [info]    
2016-02-27 15:12:20.110+0900 [info]   C:\Users\Administrator>hostname 
2016-02-27 15:12:20.110+0900 [info]   WIN-F7P411FIOMA 
2016-02-27 15:12:20.110+0900 [info]    
2016-02-27 15:12:20.110+0900 [info]   C:\Users\Administrator>exit 1  
2016-02-27 15:12:20.110+0900 [info]   
2016-02-27 15:12:20.110+0900 [info]   
2016-02-27 15:12:20.110+0900 [info]   status=2
2016-02-27 15:12:20.111+0900 [info]   SCHEDULER-915  Process event
2016-02-27 15:12:20.112+0900 [ERROR]  SCHEDULER-280  Process terminated with exit code 2 (0x2)
2016-02-27 15:12:20.546+0900 [WARN]   SCHEDULER-320  Could not send mail

なんとかなりそう。。