RundeckでWindowsに対しジョブを実行する

Rundeckでは対象のノードに処理を実施する場合、ssh接続してコマンドを実行するのだが、Windowsに対しジョブを実行する場合はWinRMを使うのがよさそうだ。
Windows 10とかならsshサーバも使えるようになったし、それ使えばいいんだろうけど、いかんせんWindows Server 2008/2012 R2などにはsshサーバの機能はない(OpenSSHとか入れればできる)。

できればWindowsとして提供されている機能でアクセスしたいなぁ…ということで、WinRMを用いての接続をする。
プラグインはこちら。なお、触ってみた限りRundeck側でスクリプトを書いて、それを転送して実行する使い方はできなそうだ。
スクリプトを実行する場合は、事前に転送しておいて対象のPATHを指定してキックするようにしよう。

1.Windows側でWinRMの設定

まずは、Windows側でWinRMの設定を行う。

winrm qc
PS C:\Users\Administrator> winrm qc
WinRM サービスは、既にこのコンピューターで実行されています。
WinRM は、管理用にこのコンピューターへのリモート アクセスを許可するように設定されていません。
次の変更を行う必要があります:

ローカル ユーザーにリモートで管理権限を付与するよう LocalAccountTokenFilterPolicy を構成してください。

変更しますか [y/n]? y

WinRM はリモート管理用に更新されました。

ローカル ユーザーにリモートで管理権限を付与するよう LocalAccountTokenFilterPolicy を構成しました。

次に、LinuxからWinRM経由でアクセスできるよう、Basic認証を許可する。

winrm set winrm/config/client/auth '@{Basic="true"}'
winrm set winrm/config/service/auth '@{Basic="true"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'

PS C:\Users\Administrator> winrm set winrm/config/client/auth '@{Basic="true"}'
Auth
    Basic = true
    Digest = true
    Kerberos = true
    Negotiate = true
    Certificate = true
    CredSSP = false

PS C:\Users\Administrator> winrm set winrm/config/service/auth '@{Basic="true"}'
Auth
    Basic = true
    Kerberos = true
    Negotiate = true
    Certificate = false
    CredSSP = false
    CbtHardeningLevel = Relaxed

PS C:\Users\Administrator> winrm set winrm/config/service '@{AllowUnencrypted="true"}'
Service
    RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GR;;;IU)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)
    MaxConcurrentOperations = 4294967295
    MaxConcurrentOperationsPerUser = 1500
    EnumerationTimeoutms = 240000
    MaxConnections = 300
    MaxPacketRetrievalTimeSeconds = 120
    AllowUnencrypted = true
    Auth
        Basic = true
        Kerberos = true
        Negotiate = true
        Certificate = false
        CredSSP = false
        CbtHardeningLevel = Relaxed
    DefaultPorts
        HTTP = 5985
        HTTPS = 5986
    IPv4Filter = *
    IPv6Filter = *
    EnableCompatibilityHttpListener = false
    EnableCompatibilityHttpsListener = false
    CertificateThumbprint
    AllowRemoteAccess = true

これで、Windows側の設定は完了。

2.Rundeck側の設定

次に、Rundeck側の設定を行う。
まず、以下のコマンドでプラグインのjarファイルを適切なPATHに配置する。

wget https://github.com/rundeck-plugins/rundeck-winrm-plugin/releases/download/v1.3.3/rundeck-winrm-plugin-1.3.3.jar -P /var/lib/rundeck/libext/
chown -R rundeck. /var/lib/rundeck/libext/

次に、リモートノードとして追加するため、「/var/rundeck/projects/プロジェクト名/etc/resources.xml」に以下のように追記する。

<project>
  <node name="localhost" description="Rundeck server node" tags="" hostname="localhost" osArch="amd64" osFamily="unix" osName="Linux" osVersion="3.10.0-327.el7.x86_64" username="rundeck"/>
  ...
  <node name="サーバ名" connectionType="WINRM_NATIVE" node-executor="overthere-winrm" winrm-password-option="winrmPassword" winrm-protocol="https" winrm-auth-type="basic" username="ユーザ名" winrmPassword="パスワード" hostname="IPアドレス:5986"/></span>
</project>

設定記述後、サービスを再起動する。

systemctl restart rundeckd

3.ジョブの作成

次に、ジョブの作成を行う。
基本的には通常のジョブ作成とたいして変わらないのだが、オプションとして「winrmPassword」という項目を作成して、デフォルト値に接続用のパスワードを入れる必要がある。

設定したら、あとはジョブを実行するだけだ。
とりあえず、hostnameコマンドなどを実行した結果が以下。

無事、ジョブが実行できた。
ほかでWinRMを利用しないのであれば、ファイアウォールなどでRundeckホスト以外からの対象ポートへのアクセスは制限しておくといいだろう。