クライアントが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" }
接続できますね。