yu nkt’s blog

nkty blog

I'm an enterprise software and system architecture. This site dedicates sharing knowledge and know-how about system architecture with me and readers.

EC2インスタンスへansibleで疎通確認

目的

EC2にあるインスタンスの構成管理をしようと思いますが、その前に、そのインスタンスへの疎通確認をしてみました。

今までansibleをローカルの環境構築にしか使ってなかったとは言え、まさかここで詰まることがあるとは…。

環境

  • 構成管理対象のリモート環境
  • 手元の環境
    • Windows10
      • WSL (Ubuntu18.04)
      • Ansible: 2.7.10 (pipでインストール)
    • Mac Mojave 10.14.4
      • Ansible: 2.7.9 (homebrewでインストール)

EC2のインスタンスは、kubesprayでk8s環境を作ってみようと思い、用意しました。 手元の環境が二つあるのは、後述するように、ハマった時の原因切り分けのために二つ使っていただけです。 手元に二つの環境がないといけないわけではありません。

作業

まずは、EC2でインスタンスを立ち上げます。コンソール画面からやりました。 秘密鍵は、~/.ssh/の中に入れておきました。chmod 400 秘密鍵を忘れずに。

ansibleでpingが通るかを確認しましょう。

$ echo "インスタンスのIP" > hosts
$ ansible -i hosts -m ping -u ubuntu --private-key=~/.ssh/秘密鍵 インスタンスのIPアドレス

出た出力がこちら。

インスタンスのIP | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: muxclient: master hello exchange failed\r\nFailed to connect to new control master",
    "unreachable": true
}

ansibleに不慣れとはいえ、まさかここからつまずくとは。 かなりハマったのですが、Macで試したら、次のような出力が出て、ヒントになりました。

インスタンスのIP | FAILED! => {
    "changed": false,
    "module_stderr": "Shared connection to インスタンスのIP closed.\r\n",
    "module_stdout": "/bin/sh: 1: /usr/local/bin/python: not found\r\n",
    "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
    "rc": 127
}

このエラーの真意は、「sshで接続した先で、ansibleを実行しようとしたけど、pythonがインストールされてないよ」ということのようです。 しかし、今やりたいのは、作成したインスタンスsshで入れるか、そして試しにpingがとばせられるかどうか、なので、 pingを実行するのは手元の環境です。

このように、手元の環境でansibleを実行したい場合は、hostsファイルを以下のように変える必要があります。

インスタンスのIP ansible_connection=local

これでもう一度ansibleコマンドを実行すると、うまく行きました。

$ ansible -i hosts -m ping -u ubuntu --private-key=/Users/y-nakata/.ssh/秘密鍵 インスタンスのIP
インスタンスのIP | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

感想

WSLとMacとで、Ansibleの出力が違うのは謎ですが、WSLのエラーメッセージで意味がわかる人がどれだけいるのか…。