zoukankan      html  css  js  c++  java
  • 使用ansible对远程主机上的ssh公钥进行批量分发

    使用ansible对远程主机上的ssh公钥进行批量分发或者是删除修改操作
    
    ansible内置了一个authorized_key模块,这个模块很好用,我们使用这个模块可以对远程
    主机上的ssh公钥进行批量删除,添加或者修改的操作,官网地址:
    http://docs.ansible.com/ansible/latest/modules/authorized_key_module.html#id1
    
    从官网上可以看到,这个模块是使用playbook的形式进行配置的:
    默认有如下几个参数,因为官网是按字母表的顺序排列的,这里我们为了理解的更清晰起见,
    我们将这些参数的顺序改成我们想要的顺序如下:
    
    comment:         对整个文件的注释
    exclusive:       是否移除远程主机authorized_keys文件中其它非指定的ssh公钥,这里默认是no,
                      我们这里也一般不删除远程主机上的其他公钥,我们可以用这个命令清除远程主机
                      上的其他ssh公钥。
    key_options:      附加到公钥开头的字符串,这里多指注释文件,默认没有,我们可以不填。
    validate_certs:   指定是否进行tls/ssl证书认证,默认为开启,这里这个参数的作用是只有在key那个参数
                      指定为网络传输的时候才有效,比如我们将公钥放在github上,默认就可以设置为开启或关
                      闭。
    manage_dir:       指定模块是否拥有权限管理authorized_keys文件所的目录。默认值为yes,也就是说
                      第一次分发公钥的时候,模块可以为我们自动创建这么一个目录及文件,并设置好权限,
                      如果我们要指定其他的存放ssh公钥的目录,这里这个值要设置为yes,并在后面的path中
                      指定ssh公钥所存放的文件的目录。                
    state:            添加ssh公钥到远程主机还是删除远程主机上对应的公钥,参数present是添加,absent是删除。
    key:             本机公钥所存放的路径
    user:             远程主机的用户名
    path:             这个参数可以不填,默认就是指的远程主机上的用户家目录下的.ssh下的authorized_keys文件:
                      即:(homedir)+/.ssh/authorized_keys
    
    一般这几个参数,我们只会用到后面的这个五个,而且manage_dir和path都是设置为默认值即可。
             
             
    首先我们需要修改ansible的inventory文件:即/etc/ansible/hosts文件:
    我们在传密钥之前,主机组的格式应该如下:
    [unknown]
    ansible001  ansible_ssh_user=root ansible_ssh_host=123.56.221.190 ansible_ssh_pass="密码"
    从左到右依次为:
    主机名    远程主机上需要控制的用户名  用户IP地址                  用户密码
    
    而我们传完密钥之后,主机组的格式应该如下:
    [unknown]
    ansible001  ansible_ssh_host=123.56.221.190 
    
    也就是说只有第一次传输密钥需要密码文件,以后就再也不需要了。
    在传密钥之前,我们可以先查看下远程客户端是否已经有authorized_key文件:
    ansible unknown -a "ls /root/.ssh/"
    因为unknown用户组里面用户和密码都有了,因此这个命令也能执行。
    
    一个官方网站的例子:
    - name: Set authorized key took from file
      authorized_key:
        user: charlie
        state: present
        key: "{{ lookup('file', '/home/charlie/.ssh/id_rsa.pub') }}"
    
    #这里我们写一个通用的公钥分发的yaml文件:
    vim copy_ssh_public_keys.yaml
    
    - name: Set authorized key took from file
      authorized_key:
        key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"    #本机的公钥地址
        user: root                                              #被控制的远程服务上的用户名
        state: present                                          #模式为添加公钥
    
    传送ssh公钥:
    ansible-playbook /etc/ansible/copy_ssh_public_keys.yaml -f 10
    
    传完之后再次查看远程主机是否已经有了authorized_key文件:
    ansible unknown -a "ls /root/.ssh/"
    此时应该可以看到远程主机应该已经有了authorized_key这个文件。
    
    至此我们的ssh公钥就分发完毕了。
    这里我们再写几个其他的例子:
    
    #1.分发当前ssh公钥并清除之前所有的公钥:
    - name: Set authorized key took from file
      authorized_key:
        exclusive: True                                         #清除远程主机之前所有的其他公钥
        key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"    #本机的公钥地址
        user: root                                              #被控制的远程服务上的用户名
        state: present                                          #模式为添加公钥
    #2.删除远程主机上指定的当前的ssh公钥:
    - name: Set authorized key took from file
      authorized_key:
        key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"    #本机的公钥地址
        user: root                                              #被控制的远程服务上的用户名
        state: absent                                           #删除远程主机上指定的当前ssh公钥

    利用hosts变量批量添加主机

    配置hosts文件

     然后每次就可以连接主机了

    由于首次ssh连接的时候需要yes确认,所以需要先连接一次

    原文链接:https://www.cnblogs.com/fengjunhua/p/8962767.html

  • 相关阅读:
    面试6 在c#中如何声明一个类不能被继承
    面试5 如何理解静态变量,局部变量,全局变量
    面试4 你在什么情况下会用到虚方法?它与接口有什么不同
    面试3 不用系统自带的方法将字符串类型123456转换为值类型
    面试2 递归的算法求1,1,2,3,5,8.......的第30位数是多少,然后求这些数的和.
    面试1 SQL SERVER 查询第20行到30之间的数据
    ubuntu安装nginx
    ubuntu上使用ufw配置管理防火墙
    ubuntu上安装docker
    ubuntu上使用vim编辑文本内容
  • 原文地址:https://www.cnblogs.com/soymilk2019/p/12712532.html
Copyright © 2011-2022 走看看