Press "Enter" to skip to content

ansible批量推送ssh key+批量推送文件(夹)

ansible批量推送ssh key的方法,这里记录一下。

假设有以下主机列表

$ cat /opt/list
[new]
172.20.121.109
172.20.114.69
172.20.114.57
172.20.114.58
172.20.114.59

1,使用ansible命令来推送SSH Key
命令比较简单,一行即可搞定

$ ansible -i /opt/list new -m authorized_key -a "user=admin key='{{ lookup('file','/home/admin/.ssh/id_rsa.pub') }}'" -k

这里解释一下命令:
-i表示指定IP列表文件位置,后面的new表示文件里的分组
-k表示询问目标IP的密码
-a后面表示authorized_key模块的参数,user和key是2个必需的参数,也可以加一个默认参数state=present(加不加均可),如果设置state=absent则表示删除这一条key
经测试,反复运行多次此命令,远程机器上的~/.ssh/authorized_keys文件里只会存在一行,不会存在多行key。

2,使用playbook来推送SSH key

$ vim key.ymal 
- hosts: new
  user: admin
  tasks:
   - name: Set authorized key took from file
     authorized_key: user=admin state=present key="{{ lookup('file', '/home/admin/.ssh/id_rsa.pub') }}"

文件解释:
hosts: 表示/opt/list文件里的分组
user: 表示本地用户,这里如果写错可能导致执行失败

$ ansible-playbook -i /opt/list key.ymal -k

3,本地主机的userA用户到远程主机的userB用户

$ vim deploy_key_local_userA_to_remote_userB.yml
 hosts: all
  remote_user: userB
  gather_facts: no

  tasks:
  - name: install ssh key
    authorized_key: user=userB
                    key="{{ lookup('file', '/home/userA/.ssh/id_rsa.pub') }}" 
                    state=present

#尝试推送
$ ansible-playbook -i ip_list deploy_key_local_userA_to_remote_userB.yml -k

#运行其它playbook的时候别忘记加一个-u userB参数,否则会尝试以本地的(userA)用户去连接远程机器
$ ansible-playbook -i ip_list other_ops.yml -u userB

4,使用ansible命令来推送文件

$ ansible -i /opt/list new -m copy -a 'src=/opt/ump_agent/bin/ dest=/home/admin/ump_agent owner=admin group=admin mode=644 backup=yes follow=yes'

注意copy模块的使用:
follow=yes: 表示将链接也复制;
backup=yes: 在覆盖之前将原文件备份, 备份文件包含时间信息;
force=yes: 默认为yes,会覆盖远程的内容不一样的文件(可能文件名一样). 如果是no, 就不会拷贝文件(如果远程有这个文件);
src: 要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径. 如果路径是一个目录,它将递归复制.在这种情况下,如果路径使用”/”来结尾,则只复制目录里的内容,如果没有使用”/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync.

4,使用ansible命令来推送文件

- hosts: new
  user: admin
  tasks:
   - name: push ump_agent_code to remote
     copy: src=/opt/zhukun/ump_agent/bin dest=/home/admin/zhukun owner=admin group=admin mode=644 backup=yes follow=yes
$ ansible-playbook -i /opt/list push.ymal

请注意:
https://docs.ansible.com/ansible/copy_module.html states:

The “copy” module recursively copy facility does not scale to lots (>hundreds) of files. For alternative, see synchronize module, which is a wrapper around rsync.

意思是说,如果你有成百上千的文件需要同步,请考虑synchronize模块。

参考文档:
Centos7 Ansible 配置SSH公钥认证
ansible之copy模块

Leave a Reply

Your email address will not be published. Required fields are marked *