首页 > 其他分享 >ansible推送ssh-key

ansible推送ssh-key

时间:2022-11-01 23:47:44浏览次数:56  
标签:10.0 0.7 ansible ssh key pass root

背景

裸机安装完系统后使用手动方式发送ansible机器的ssh-key到其他主机总是不够方便
想要找到一种更为简便的方式将key推送到其他主机
方案:

  • expect + shell
  • /etc/ansible/hosts文件中设置密码
  • ansible -m ping client
  • --ask-pass authorized_key 模块推送公钥

方式一:expect+shell

[root@flask-mysql ansible]# cat send_sshkey.sh
#!/usr/bin/expect  

set timeout 10  
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
expect {
            #first connect, no public key in ~/.ssh/known_hosts
            "Are you sure you want to continue connecting (yes/no)?" {
            send "yes\r"
            expect "password:"
                send "123456\r"
            }
            #already has public key in ~/.ssh/known_hosts
            "password:" {
                send "123456\r"
            }
            "Now try logging into the machine" {
                #it has authorized, do nothing!
            }
        }
expect eof

# expect send_sshkey.sh

方式二:/etc/ansible/hosts ansible_ssh_pass

[root@flask-mysql ansible]# cat /etc/ansible/hosts 
10.0.0.7 ansible_ssh_port=22  ansible_ssh_user=root ansible_ssh_pass=000000

[root@flask-mysql ansible]# ansible 10.0.0.7 -m ping
10.0.0.7 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Invalid/incorrect password: Permission denied, please try again.", 
    "unreachable": true
}
[root@flask-mysql ansible]# vim /etc/ansible/hosts
[root@flask-mysql ansible]# cat /etc/ansible/hosts
10.0.0.7 ansible_ssh_port=22 ansible_ssh_pass=123456 ansible_ssh_user=root
[root@flask-mysql ansible]# ansible 10.0.0.7 -m ping
10.0.0.7 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

# 奇葩问题:ansible_ssh_pass 设置是为0开头的密码 就会报错:Invalid/incorrect password: Permission denied, please try again.

方式三:ansible -m copy client --ask-pass

1、 将ansible主机的id_rsa.pub拷贝成authorized_keys
[root@flask-mysql ~]# cp /root/.ssh/id_rsa.pub  /root/.ssh/authorized_keys
2、执行copy模块
[root@flask-mysql ~]# ansible -m copy -a 'src=/root/.ssh/authorized_keys dest=/root/.ssh/authorized_keys backup=yes'  10.0.0.7 --ask-pass

# 操作记录
[root@flask-mysql ~]# ansible -m ping 10.0.0.7 
10.0.0.7 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", 
    "unreachable": true
}
[root@flask-mysql ~]# ls /root/.ssh/
authorized_keys  id_rsa  id_rsa.pub  known_hosts


[root@flask-mysql ~]# ansible -m copy -a 'src=/root/.ssh/authorized_keys dest=/root/.ssh/authorized_keys backup=yes'  10.0.0.7 --ask-pass
SSH password: 
10.0.0.7 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "checksum": "77b45a518f90cc6480f4eec0fbfaba6344529bfc", 
    "dest": "/root/.ssh/authorized_keys", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "path": "/root/.ssh/authorized_keys", 
    "size": 398, 
    "state": "file", 
    "uid": 0
}
[root@flask-mysql ~]# ansible -m ping 10.0.0.7 
10.0.0.7 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

方式四:authorized_key 模块推送公钥

1、创建加密文件
ansible-vault create vault-foo.yml
ansible_ssh_pass: 123456
2、编写send_sshkey.yaml
[root@flask-mysql .ssh]# cat send_sshkey.yaml 
- hosts: all
  remote_user: root   # 连接远程主机的用户,密码就是加密文件中设置好的 ansible_ssh_pass 的值
  vars_files:
    - vault-foo.yml    # 加密文件
  tasks:
  - name: Set authorized key taken from file
    authorized_key:    # 发送公钥的模块
      user: root            # 给这个用户发送公钥
      state: present
      key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"


3、执行
[root@flask-mysql .ssh]# ansible-playbook send_sshkey.yaml  --ask-vault-pass
4、验证
[root@flask-mysql .ssh]# ansible -m ping 10.0.0.7
10.0.0.7 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

总结

四种方式其实质可以分为两种

  • expect + shell
  • 密码+模块
    • /etc/ansible/hosts+ansible_ssh_pass
    • copy +--ask-pass
    • authorized_key + lookup file + ansible_ssh_pass

遇到的奇葩问题

方式二:/etc/ansible/hosts+ansible_ssh_pass中

ansible_ssh_pass 设置是为0开头的密码 就会报错:Invalid/incorrect password: Permission denied, please try again.
改为其他密码,比如123456则可以实现。

标签:10.0,0.7,ansible,ssh,key,pass,root
From: https://www.cnblogs.com/liushiya/p/16849583.html

相关文章

  • ansible练习七
    生成主机文件将一个初始模板文件从http://materials/hosts.j2下载到/home/greg/ansible完成该模板,以便用它生成以下文件:针对每个清单主机包含一行内容,其格式与/etc/......
  • vue中key有什么作用(key的内部原理)
    虚拟DOM的key的作用:key是虚拟DOM对象的标识,当状态中的数据发生变化的时候,vue会根据新的数据生成新的虚拟DOM,随后vue进新虚拟DOM与旧虚拟DOM的差异比较(1)旧虚拟......
  • redis淘汰key的算法LRU与LFU的区别
    lru:leastrecentlyused,最近最少使用:淘汰很久没被访问的数据,以最近一次访问的时间做参考lfu:leastfrequentlyused,最不经常使用:淘汰最近一段时间被访问次数最少的数据......
  • SSH 远程管理和访问控制
    SSH远程管理和访问控制理论:一、SSH远程管理1、SSH作用和特点1)SSH作用管理员远程管理服务器的一种方式2)SSH特点安全性强传输数据被加密适合通过互联网远程使用支持通......
  • key&key_len&ref&filtered(4)—mysql执行计划(五十)
    前面说了system是精确存储引擎和只存一条数据,const是主键和唯一索引才能达到的效率访问,ref是二级索引等值查询,或者联合索引全部等值,如果联合索引单个查询,则是index,ref_not是......
  • 如何使用 Keynote 制作出精美的 gif 动画图解教程 All In One
    如何使用Keynote制作出精美的gif动画图解教程AllInOnedemosgitcheery-pickjsenginecacheFAQ:frequentlyaskedquestions/经常问的问题Question:......
  • YAML&snakeyaml简介
    简介​​官网​​​YAML,YAMLAin’tMarkupLanguageWhatItIs:YAMLisahumanfriendlydataserializationstandardforallprogramminglanguages.最新版本1.2,Ja......
  • KeyShot Pro 10.2 for Mac永久版(3D模型渲染软件)v10.2.113 中文版mac/win
    KeyShotPro10.1是一款功能强大的3D模型渲染软件,帮助你更好的创建3D渲染动画。其中KeyShot的GPU模式可用于实时渲染和本地渲染输出,一键访问GPU资源,从而利用多GPU性能扩展......
  • [单片机框架][APP_KEY] 利用软定时器实现按键扫描
    使用例子:任意地点初始化:app_key_init();voiddemo(void){bsp_led_toggle(LED0);}//按键触发事件则会跳转到对应功能函数。这里演示单击,执行demo函数。button_fun_call......
  • ansible练习六
    给node1添加一块5G的硬盘;给node2添加一块2G的硬盘;node3不添加硬盘。写一个partition.yml的playbook,满足如下要求:给所有的受控主机创建分区,创建2500M......