SSH接続時、初回確認メッセージを出さないようにするAnsibleロール


このエントリは Ansible 3 Advent Calendar 2019の11日目の投稿です。
ちょうど空いていたので、書いてみました。

この記事の内容

  • SSH初回接続時の確認メッセージを、出さないようにAnsibleで設定する

前提

  • 特定のホストへのSSH接続時のみ、確認メッセージを出さないようにしたい
  • ホストA、ホストBがあると仮定し、A -> BへSSH接続する
  • Ansibleを実行するクライアントは、A、BどちらへもSSH接続できる前提
  • StrictHostKeyCheckingの設定はいじらない

実装方法

  • Aのknown_hostsにBの公開鍵情報を直接記載する
  • Ansibleのknown_hostsモジュールを使う

コード

main.yml

# vars:
#     - ssh_host_and_user:
#         - from:
#             user: vagrant
#             host: A
#           to:
#             user: root
#             host: B

# ホストBのrootユーザの公開鍵を、変数に格納する
- name: Copy public key to variable
  slurp:
    src: "{{ ROOT_PUBLIC_KEY_HOST_B }}"
  with_items: "{{ ssh_host_and_user }}"
  register: to_host_public_key
  when: item.to.host == inventory_hostname

# ホストAの,任意ユーザのホームディレクトリを取得する
- name: Get home direcotry of from.user
  shell: |
    set -o pipefail
    egrep "^{{ item.from.user }}:" /etc/passwd | awk -F: '{ print $6 }'
  register: from_user_home_directory
  with_items: "{{ ssh_host_and_user }}"
  changed_when: false
  failed_when: from_user_home_directory.rc != 0
  when: item.from.host == inventory_hostname

# ホストBのrootユーザの公開鍵を、ホストAのknown_hostsへ書き込む
- name: Add Host B infomation to known_hosts in Host A
  become: item.from.user
  known_hosts:
    key: "{{ item.to.host }}
          {{ hostvars[item.to.host].to_host_public_key.results[0].content | b64decode }}"
    name: "{{ item.to.host }}"
    path: "{{ hostvars[item.from.host].from_user_home_directory.results[my_idx].stdout }}/.ssh/known_hosts"
    state: present
  with_items: "{{ ssh_host_and_user }}"
  loop_control:
    index_var: my_idx
  when: item.from.host == inventory_hostname


終わりに

known_hostsモジュールを使って、SSH初回確認メッセージを出さないように処理を書いてみました。
- 特定のホストへSSH接続するときのみ、確認メッセージを出さないようにできた
- 場合によっては、StrictHostKeyCheckingの設定をいじったほうが便利かもしれない