こんにちは、技術4課の城です。
タイトルのとおり、踏み台として用意したLinuxサーバーを経由して、プライベートサブネットに配置されたWindowsサーバーにAnsibleで接続してみました。
以前、こちらのブログにて紹介しましたDocker for Windowsの環境から実施しています。
構成について
構成イメージは下記となります。
Dockerfileについて
踏み台経由でアクセスするには、踏み台にSSH接続する必要があり、Dockerfileにインストールするパッケージを追加しています。
Dockerイメージの構築やコンテナへの接続については前述のブログをご参照ください。
FROM amazonlinux MAINTAINER ****@serverworks.co.jp RUN yum install -y \ python27-pip.noarch \ openssh-clients \ screen \ vim && \ yum -y reinstall glibc-common && \ yum remove -y python27-chardet.noarch && \ pip install --upgrade pip && \ pip install ansible==2.5.0 && \ pip install pywinrm && \ yum clean all && \ mkdir /prj-data ENV LANG ja_JP.UTF-8 CMD ["/bin/bash"]
ポートフォワーディングの設定について
ローカルフォワードの設定をします。
1行目ですと、ローカルホスト(Dockerコンテナ)のポート15986のトラフィックをリモートホスト(10.200.0.155)のポート5986に転送するという設定です。
cat ~/.ssh/config LocalForward localhost:15986 10.200.0.155:5986 LocalForward localhost:15987 10.200.20.10:5986
インベントリについて
インベントリについては下記用意しました。
それぞれのホストがlocalhost、前項で設定したポートに設定しています。
bash-4.2# cat hosts/inventory.yml all: children: servers: hosts: windows2016-private01: ansible_host: localhost ansible_ssh_pass: XXXXXXXXXXXXXXXXXXXX ansible_ssh_port: 15986 windows2016-private02: ansible_host: localhost ansible_ssh_pass: XXXXXXXXXXXXXXXXXXXX ansible_ssh_port: 15987 vars: ansible_ssh_user: Administrator ansible_connection: winrm ansible_winrm_server_cert_validation: ignore
秘密鍵の用意
秘密鍵はローカルからマウントしたディレクトリにて持ち込みましたが、ひと手間必要です。
そのままSSH接続しようとするとbad permissionということで怒られてしまいます。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0755 for '/root/.ssh/test01.pem' are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored. Load key "/root/.ssh/test01.pem": bad permissions Permission denied (publickey).
マウントしたWindowsのACLが有効なディレクトリではchmodコマンドでパーミッションが書き換えられません。
コンテナ内の適当なところにコピーして権限を変更します。
cp ssh-keys/test01.pem ~/.ssh/. chmod 600 ~/.ssh/test01.pem
踏み台へSSH接続
踏み台へSSH接続します。
今回はscreenコマンドを利用してSSH接続するセッション、Ansibleを実行するセッションを同時に実行します。
bash-4.2# screen sh-4.2# ssh -i ~/.ssh/test01.pem ec2-user@【踏み台サーバーのIP】
元のセッションに戻るには ctrl + a
のあとに d
を入力します。
Ansibleでの接続確認
win_pingモジュールにて接続確認をしてみます。
接続できました!
ansible servers -i hosts/inventory.yml -m win_ping windows2016-private01 | SUCCESS => { "changed": false, "ping": "pong" } windows2016-private02 | SUCCESS => { "changed": false, "ping": "pong" }
さいごに
細かいところで色々とつまづいてしまい、悪戦苦闘していたのですがうまく接続できました。
どなたかの参考になれば幸いです。
城 航太 (記事一覧)
営業部カスタマーサクセス課・課長
AWSへの移行、AWSアカウントセキュリティ、ネットワーク広く浅くといった感じです。最近はAmazon WorkSpacesやAmazon AppStream2.0が好きです。APN Ambassador 2019,2020