文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

ansibleのhost_key_checkingが効かない問題

ansibleのhost_key_checkingが効いてないみたいなので、別の方法で解決してみます。

f:id:treeapps:20160219001058p:plain

状況

  • mac上にvagrantでansibleサーバとansibleの適用先サーバを起動する。
  • ansibleサーバのCentoOSはv7.1、ansibleのバージョンはv1.9.1。
  • ansible適用サーバは最初CentOS7だったが、先日CentOS6.5に変更した。
  • sshでPermission deniedが発生。

というものです。

このPermission deniedの正体は、sshする時にknown_hostsにキー情報が保存されますが、これが以前作ったキーと違うよ、というものです。

所謂↓こんなやつです。

[vagrant@ansible ansible-playbook-sensu]$ ssh vagrant@192.168.33.21
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
cd:8f:67:bc:1b:05:3b:bf:d2:9b:fd:66:4a:cd:22:e8.
Please contact your system administrator.
Add correct host key in /home/vagrant/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/vagrant/.ssh/known_hosts:1
RSA host key for 192.168.33.21 has changed and you have requested strict checking.
Host key verification failed.

これを解決するために、ansibleには「host_key_checking」という設定が用意されています。
Configuration file — Ansible Documentation
Getting Started — Ansible Documentation

このドキュメントに従い、ansible.cfgに以下のように設定します。

[defaults]
host_key_checking = False

host_key_checkingをしない設定にしているにも関わらず、以下のように以前と鍵が違うエラーが発生します。

[vagrant@ansible ansible-playbook-sensu]$ ansible-playbook -i development ./site.yml -vvvv

PLAY [sensu] ******************************************************************

GATHERING FACTS ***************************************************************
<192.168.33.21> ESTABLISH CONNECTION FOR USER: vagrant
<192.168.33.21> REMOTE_MODULE setup
<192.168.33.21> EXEC sshpass -d4 ssh -C -tt -vvv -o ControlMaster=auto -o ControlPersist=60s -o ControlPath="/home/vagrant/.ansible/cp/ansible-ssh-%h-%p-%r" -o StrictHostKeyChecking=no -o Port=22 -o GSSAPIAuthentication=no -o PubkeyAuthentication=no -o ConnectTimeout=10 192.168.33.21 /bin/bash -l -c 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1432734759.42-39423567902999 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1432734759.42-39423567902999 && echo $HOME/.ansible/tmp/ansible-tmp-1432734759.42-39423567902999'
fatal: [192.168.33.21] => SSH Error: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
    while connecting to 192.168.33.21:22
It is sometimes useful to re-run the command using -vvvv, which prints SSH debug output to help diagnose the issue.

TASK: [sensu-server | Stop firewalld] *****************************************
FATAL: no hosts matched or all hosts have already failed -- aborting


PLAY RECAP ********************************************************************
           to retry, use: --limit @/home/vagrant/site.retry

192.168.33.21              : ok=0    changed=0    unreachable=1    failed=0

これは-vvvvオプションで詳細を表示しているわけですが、なんかUserKnownHostsFile=/dev/null無しにsshしてるのですよねえ・・・

対応策

ansible.cfgに「ssh_args = -o UserKnownHostsFile=/dev/null」を追加してしまいます。

[defaults]
host_key_checking = False
executable = /bin/bash -l

[ssh_connection]
ssh_args = -o UserKnownHostsFile=/dev/null

ansible.cfgをこのように設定して実行すると、以下のように「UserKnownHostsFile=/dev/null」オプションが追加され、Permission deniedが発生しなくなります。

[vagrant@ansible ansible-playbook-sensu]$ ansible-playbook -i development ./site.yml -vvvv

PLAY [sensu] ******************************************************************

GATHERING FACTS ***************************************************************
<192.168.33.21> ESTABLISH CONNECTION FOR USER: vagrant
<192.168.33.21> REMOTE_MODULE setup
<192.168.33.21> EXEC sshpass -d4 ssh -C -tt -vvv -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o Port=22 -o GSSAPIAuthentication=no -o PubkeyAuthentication=no -o ConnectTimeout=10 192.168.33.21 /bin/bash -l -c 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1432735289.47-264382925338556 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1432735289.47-264382925338556 && echo $HOME/.ansible/tmp/ansible-tmp-1432735289.47-264382925338556'
<192.168.33.21> PUT /tmp/tmpOfvLL7 TO /home/vagrant/.ansible/tmp/ansible-tmp-1432735289.47-264382925338556/setup
<192.168.33.21> EXEC sshpass -d4 ssh -C -tt -vvv -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o Port=22 -o GSSAPIAuthentication=no -o PubkeyAuthentication=no -o ConnectTimeout=10 192.168.33.21 /bin/bash -l -c 'LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 /usr/bin/python /home/vagrant/.ansible/tmp/ansible-tmp-1432735289.47-264382925338556/setup; rm -rf /home/vagrant/.ansible/tmp/ansible-tmp-1432735289.47-264382925338556/ >/dev/null 2>&1'
ok: [192.168.33.21]

入門Ansible

入門Ansible

Serverspec

Serverspec