踏み台経由でプライベートサブネットのWindowsサーバーにAnsibleで接続してみました。

記事タイトルとURLをコピーする

こんにちは、技術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"
}

さいごに

細かいところで色々とつまづいてしまい、悪戦苦闘していたのですがうまく接続できました。
どなたかの参考になれば幸いです。

城 航太 (記事一覧)

サイトリライアビリティエンジニアリング部・CSM課・課長

AWSへの移行、AWSアカウントセキュリティ、ネットワーク広く浅くといった感じです。最近はAmazon WorkSpacesやAmazon AppStream2.0が好きです。APN Ambassador 2019,2020