基于Ansible配置SSH无密码登录

某些系统要求一组节点任何两节点之间配置SSH无密码登录,比如HDFS,原因是运行 start-dfs.sh
这样的脚本时,会通过ssh到其它节点执行命令。某些情况下,运维上也需要这样的配置。

对于我个人而言,这样的需求并不多,更多地是通过某一台 console
角色的机器对其它节点进行操作,比如说 关键字批量查找日志批量
查看进程启动时间
等。使用Ansible做 日志关键字查找
,这种很Low的方式被 李小者
同学鄙视过,应该用日志系统代替,深以为然。

习惯把 SSH无密码登录
称为 SSH打通
,所以下文中提到 打通
一词,都代指 SSH无密码登录

实现步骤

  1. 准备 console
    角色的机器
  2. 利用 Ansible
    authorized_key
    模块打通 console
    节点和 group
    中每一个节点
  3. 调用 ssh-keygen
    group
    中每一个节点上生成 public key
  4. 收集 group
    中每一个节点的 public key
    到本地文件
  5. 再次利用 Ansible
    authorized_key
    模块将上面收集到的 public keys
    分发到 group
    中每一个节点
  6. 关闭 group
    中每一个节点两两之间的 StrictHostKeyChecking

进行到第5步时已经可以实现无密码登录了,但是在建立ssh连接的时侯,会有以下prompt:

The authenticity of host *
can’t be established.

RSA key fingerprint is *
.

Are you sure you want to continue connecting (yes/no)?

所以增加了最后一步。

代码

详见 Github

# usage:
# ansible-playbook -i hosts ssh_nopass.yml -e "hosts=daily user=sel-fish"

- hosts: "{{ hosts }}"
vars:
- sshpubs_rslt: "{{ lookup(env, PWD) + /sshpubs.rslt }}"
tasks:
- name: Deliver My SSH key to Each Node
authorized_key:
user: "{{ user }}"
key: "{{ lookup(file, lookup(env, HOME) + /.ssh/id_rsa.pub) }}"
key_options: ""
state: present
exclusive: no
- name: Generate SSH keys
shell: ssh-keygen -b 2048 -t rsa -q -N  -f "{{ ansible_env.HOME }}/.ssh/id_rsa"
args:
creates: "{{ ansible_env.HOME }}/.ssh/id_rsa"
- name: Grab SSH keys
shell: cat "{{ ansible_env.HOME }}/.ssh/id_rsa.pub"
register: ssh_pub
#    - debug:
#        var: ssh_pub.stdout
- local_action: command bash -c rm -rf {{ sshpubs_rslt }}
- local_action: command bash -c echo {{ ssh_pub.stdout }} >> {{ sshpubs_rslt }}
- name: Deliver Grabbed SSH keys to Each Node
authorized_key:
user: "{{ user }}"
key: "{{ lookup(file, sshpubs_rslt) }}"
key_options: ""
state: present
exclusive: no
- name: turn off StrictHostKeyChecking
blockinfile:
dest: "{{ ansible_env.HOME }}/.ssh/config"
marker: "# {mark} ANSIBLE MANAGED BLOCK {{ hostvars[item][inventory_hostname] }}"
insertafter: EOF
create: yes
block: |
Host {{ hostvars[item][inventory_hostname] }}
StrictHostKeyChecking no
with_items:
- "{{ groups[hosts] }}"
- local_action: command bash -c rm -rf {{ sshpubs_rslt }}

Ansible相关

  • authorized_key
    ,添加 public key
    ,注意的点是 exclusive
    建议使用默认的值 no
    ,如果设置成 yes
    会删除 (homedir)+/.ssh/authorized_keys
    中其它的 public key
  • blockinfile
    ,在文件中添加一块内容,通过 marker
    来做可重入
  • local_action
    ,ansible的这个 文档
    中有提到 local_action
    ,但是没有单独的章节来介绍。可能是因为我上述的做法不太标准,持续寻找更标准的方法。
  • register
    ,可用来存储task的返回到变量中,提供给其它task使用,包括 stderr
    stdout
  • 版权声明: 本文源自互联网, 于2个月前,由整理发表,共 2089字。
  • 原文链接:点此查看原文