結論

SFTP が無効化されている環境に対して ansible コマンドを実行するとデータ転送エラーでコケるため, SFTP を有効化するか,もしくは SFTP ではなく SCP を用いるように指定する必要がある.

問題

あるサーバ群に対して ansible コマンドを実行したら叱られた.

ansible -m ping host_name -i sample/hosts

host_name | UNREACHABLE! => {
    "changed": false,
    "msg": "ERROR! SSH Error: data could not be sent to the remote host. Make sure this host can be reached over ssh",
    "unreachable": true
}

解決

issue#13401 に従い環境変数を設定することで解決した (export ANSIBLE_SCP_IF_SSH=y).

さらに調べるとそのものズバリの記事が見つかった.

SFTP disable な CentOS 環境で ansible を使う - たごもりすメモ

SFTP が怪しいとのことなので, ansible が動いた環境と動かなかった環境の SSH 設定を確認した.確かに SFTP の有効・無効状態が関係していると考えられる.

# /etc/ssh/sshd_config
#
# ansible works
#
# override default of no subsystems
Subsystem       sftp    /usr/libexec/openssh/sftp-server
# /etc/ssh/sshd_config
#
# ansible does not works
#
# override default of no subsystems
#Subsystem      sftp    /usr/libexec/openssh/sftp-server

最後に,環境によらず ansible を使えるようにするため,作業用ディレクトリに下記の設定ファイルを作成して恒久対策とした.

# ansible.cfg

[ssh_connection]
scp_if_ssh=True

これで無事にプロビジョニングできるようになった.