Windowsにて、踏み台サーバ経由でAnsibleを利用する方法

クライアントがWindows10の環境にて、踏み台サーバ経由でAnsibleを利用する方法を記載します。AnsibleのPlaybookの実行はwsl上で実行するのですが、Ansibleの各種定義ファイルはWindowsファイルシステムに置いてある方が管理しやすいことも多く、その点を踏まえた解決策となっています。

クライアント側の環境

サーバー側の情報

サーバー種類 IPアドレス ログインユーザー 秘密鍵のパス
踏み台サーバー 3.112.22.113 bastion-user /mnt/c/_/work/ssh-key/ansible-sample-public/id_rsa
操作対象サーバー 172.31.52.134 target-user /mnt/c/_/work/ssh-key/ansible-sample-private/id_rsa

秘密鍵パーミッションを変更

まずは、Ansibleで接続するための各種sshの設定を実施します。

sshで利用する秘密鍵パーミッション400 である必要があるので、Windowsファイルシステムに置いた秘密鍵パーミッションを変更しておきます。wsl側からWindows側ファイルのパーミッションを変更するには、wslのマウント設定を変更しておく必要があります。詳しくは以前の記事にて。

WindowsのWSLで、Ansbileを利用する方法 - goodbyegangsterのブログ

ssh_agentの設定

最近のWindowsには、ssh-agnetが入っているのです。デフォルトでは、スタートアップの種類が「無効」になっているので、「自動」に変更した後、サービスを開始しておきます。管理者権限で実行します。

> sc config ssh-agent start=auto
[SC] ChangeServiceConfig SUCCESS
> sc start ssh-agent
SERVICE_NAME: ssh-agent
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
        PID                : 6012
        FLAGS              :

続いて、このWindows側にいるssh-agentをwsl側から利用できるようにします。そのためのモジュールがGitHubに公開されているので、バイナリ版のzipフォルダをダウンロード、解凍して、適当なパスに置いておきます。僕は C:\tools\ssh-agent-wsl に置きました。

GitHub - rupor-github/ssh-agent-wsl: An ssh-agent compatible helper for interacting with Windows ssh-agent service from processes running on the Windows Subsystem for Linux (WSL).

wls側に移動して、 .bash_profile に以下のssh-agent-wsl起動コマンドを記述します。

eval "$(/mnt/c/tools/ssh-agent-wsl/ssh-agent-wsl -r)"

一度wslから抜けて入り直すと、Windows側で起動しているssh-agentとプロセスの共有ができています。psコマンドで確認。

$ ps -aef | grep ssh-agent-wsl | grep -v grep
User      8     1  0 03:08 tty1     00:00:00 /mnt/c/tools/ssh-agent-wsl/ssh-agent-wsl -r
User     10     8  0 03:09 tty1     00:00:00 /init /mnt/c/tools/ssh-agent-wsl/pipe-connector.exe 00000000

起動したssh-agentに、今回利用する秘密鍵パスフレーズを登録しておきます。

$ ssh-add /mnt/c/_/work/ssh-key/ansible-sample-public/id_rsa
Enter passphrase for /mnt/c/_/work/ssh-key/ansible-sample-public/id_rsa:
Identity added: /mnt/c/_/work/ssh-key/ansible-sample-public/id_rsa (/mnt/c/_/work/ssh-key/ansible-sample-public/id_rsa) 
$
$ ssh-add /mnt/c/_/work/ssh-key/ansible-sample-private/id_rsa
Enter passphrase for /mnt/c/_/work/ssh-key/ansible-sample-private/id_rsa:
Identity added: /mnt/c/_/work/ssh-key/ansible-sample-private/id_rsa (/mnt/c/_/work/ssh-key/ansible-sample-private/id_rsa)
$
$ ssh-add -l
2048 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxE /mnt/c/_/work/ssh-key/ansible-sample-public/id_rsa (RSA)
2048 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8 /mnt/c/_/work/ssh-key/ansible-sample-private/id_rsa (RSA)
$

Windowsssh-agentは、登録情報を永続保存してくれるため、Windowsを再起動した後でもこの情報は記憶されています。

ssh_configの用意

ssh接続時に利用するssh_configファイルを用意しておきます。以下がサンプルです。

Host bastion
  HostName 3.112.22.113
  User bastion-user
  IdentityFile /mnt/c/_/work/ssh-key/ansible-sample-public/id_rsa
  IdentitiesOnly yes
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null

Host private
  HostName 172.31.52.134
  User target-user
  IdentityFile /mnt/c/_/work/ssh-key/ansible-sample-private/id_rsa
  IdentitiesOnly yes
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null
  ProxyJump bastion-user@bastion

ProxyJump の設定をいれておくと、まずProxyJumpで指定したサーバーに接続してから、対象のサーバーに転送してくれます。以下は、opensshのマニュアルです。

SSH_CONFIG (5)

このファイルも、Windows側に用意したAnsibleのプロジェクトフォルダ内に配置しておきます。僕は c:\_\work\ansible に置いています。これでssh接続に関する設定は完了です。操作対象サーバーに接続できることを、最後に確認しておきます。

$ ssh -F /mnt/c/_/work/ansible/ssh_config private
Warning: Permanently added '3.112.22.113' (ECDSA) to the list of known hosts.
Warning: Permanently added '172.31.52.134' (ECDSA) to the list of known hosts.
Last login: Tue Mar 12 18:25:30 2019 from ip-172-31-38-3.ap-northeast-1.compute.internal

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[target-user@ip-172-31-52-134 ~]$

接続できますね。

Ansibleの設定

ssh_configを設定した各ホストに対して、Ansibleからの接続確認を行います。まずは、Ansibleコンフィグファイル ansible.cfg を作成して、Ansibleのプロジェクト・フォルダ(c:_\work\ansible)に配置します。

[defaults]
host_key_checking = False

[ssh_connection]
ssh_args = -F ssh_config

known_hostsの確認を無視する設定と、sshコネクション時に参照するssh_configファイルを指定しています。続いてInventoryファイル hosts を作成して、Ansibleのプロジェクト・フォルダ(c:_\work\ansible)に配置します。

[bastion-group]
bastion

[private-group]
private

wsl側で、カレントディレクトリをAnsibleプロジェクト・フォルダに移動して、Ansible接続確認コマンドを実行します。

$ cd /mnt/c/_/work/ansible
$ ansible all -i hosts -m ping
bastion | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
private | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

接続できますね。