クライアントがWindows10の環境にて、踏み台サーバ経由でAnsibleを利用する方法を記載します。AnsibleのPlaybookの実行はwsl上で実行するのですが、Ansibleの各種定義ファイルはWindows側ファイルシステムに置いてある方が管理しやすいことも多く、その点を踏まえた解決策となっています。
クライアント側の環境
- Windows10
- wsl(Ubuntu 18.04)
サーバー側の情報
| サーバー種類 | 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 に置きました。
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) $
Windowsのssh-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のマニュアルです。
このファイルも、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"
}
接続できますね。