このエントリは 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の設定をいじったほうが便利かもしれない