EC2インスタンスへansibleで疎通確認
目的
EC2にあるインスタンスの構成管理をしようと思いますが、その前に、そのインスタンスへの疎通確認をしてみました。
今までansibleをローカルの環境構築にしか使ってなかったとは言え、まさかここで詰まることがあるとは…。
環境
- 構成管理対象のリモート環境
- 手元の環境
- Windows10
- WSL (Ubuntu18.04)
- Ansible: 2.7.10 (pipでインストール)
- Mac Mojave 10.14.4
- Ansible: 2.7.9 (homebrewでインストール)
- Windows10
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のエラーメッセージで意味がわかる人がどれだけいるのか…。