安装部署ansible,向目标端批量推送公钥
一、安装部署ansible
yum install -y ansible
二、向目标端批量推送公钥
准备两个yml文件
send-pubkey.yml
- hosts: all remote_user: root # 连接远程主机的用户,密码就是文件中设置好的 ansible_ssh_pass 的值 vars_files: - foo.yml # 设置用户名密码 由于我是root用户且密码全为 123456 ansible_ssh_pass: 123456 tasks: - name: Set authorized key taken from file authorized_key: # 发送公钥的模块 user: root # 给这个用户发送公钥 state: present key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}" # 发送本地用户的公钥路径
foo.yml(对端主机的密码)
ansible_ssh_pass: 123456
编辑/etc/ansible/hosts,维护要推送公钥的主机列表
[RemoteHost] 192.168.1.1 192.168.1.2 192.168.1.3
编辑/etc/ansible/ansible.cfg,不检测对方公钥
[defaults]
host_key_checking = False #取消注释
在ansible服务器生成公钥
ssh-keygen
一直回车即可
执行ansible命令推送公钥
ansible-playbook -i /etc/ansible/hosts send-pubkey.yml
三、ansible命令简单使用
1、在目标端执行shell命令:
ansible RemoteHost -m shell -a 'ls ~/'
命令解释: RemoteHost:默认在/etc/ansible/hosts里维护的目标组 -m shell:指定使用shell模块 -a 'ls ~/':执行 ls ~/ 命令
返回结果:
192.168.20.1 | CHANGED | rc=0 >> anaconda-ks.cfg Python-3.7.2 Python-3.7.2.tgz
2、把本地创建一个shell脚本推送到目标端:
vim /tmp/test.sh #!/bin/bash echo `date`
ansible RemoteHost -m copy -a 'src=/tmp/test.sh dest=/tmp/test.sh mode=0755'
命令解释:
RemoteHost:默认在/etc/ansible/hosts里维护的目标组
-m copy:指定使用copy模块
-a 'src=/tmp/test.sh dest=/tmp/test.sh mode=0755' 源地址src,目标地址dest,给文件设置755权限
返回结果:
192.168.20.1 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "checksum": "1a6e4af02dba1bda6fc8e23031d4447efeba0ade", "dest": "/tmp/test.sh", "gid": 0, "group": "root", "md5sum": "edfaa4371316af8c5ba354e708fe8a97", "mode": "0755", "owner": "root", "size": 48, "src": "/root/.ansible/tmp/ansible-tmp-1704436813.57-147687-110384761720795/source", "state": "file", "uid": 0 }
3、执行目标端脚本
ansible RemoteHost -m shell -a 'sh /tmp/test.sh'
返回结果:
192.168.20.1 | CHANGED | rc=0 >> Fri Jan 5 14:42:47 CST 2024
四、ansible-play 剧本使用示例
1、创建yaml文件
vim test1.yaml
2、写剧本
--- #yaml文件以---开头,以表明这是一个yaml文件,可省略 - name: first play #定义一个play的名称,可省略 gather_facts: false #设置不进行facts信息收集,这可以加快执行速度,可省略 hosts: RemoteHost #指定要执行任务的被管理主机组,如多个主机组用冒号分隔 remote_user: root #指定被管理主机上执行任务的用户 tasks: #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行 - name: test ping #自定义任务名称 ping: #指定ping模块,服务器ping目标端是否通畅 ignore_errors: True #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务 - name: copy file #把服务器文件推送到目标端 copy: 'src=/tmp/test.sh dest=/tmp/test.sh mode=0755' - name: restart filebeat service: name=filebeat state=restarted
3、执行剧本
ansible-playbook test1.yaml
4、执行结果:
PLAY [first play] ********************************************************************************************************* TASK [test ping] **********************************************************************************************************
ok: [192.168.20.1] TASK [copy file] **********************************************************************************************************
changed: [192.168.20.1] TASK [restart filebeat] ***************************************************************************************************
changed: [192.168.20.1] PLAY RECAP ****************************************************************************************************************
192.168.20.1 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
五、ansible-play 变量
1、全局变量--重启目标端的filebeat服务,{{app}}是变量名,需要传参
--- #yaml文件以---开头,以表明这是一个yaml文件,可省略 - name: test #定义一个play的名称,可省略 gather_facts: false #设置不进行facts信息收集,这可以加快执行速度,可省略 hosts: test #指定要执行任务的被管理主机组,如多个主机组用冒号分隔 remote_user: root #指定被管理主机上执行任务的用户 tasks: #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行 - name: restart filebeat service: name={{app}} state=restarted
执行剧本时通过-e传参
ansible-playbook playbook-test.yml -e "app=filebeat"
2.1、剧本变量--通过vars关键字设置变量
--- #yaml文件以---开头,以表明这是一个yaml文件,可省略 - name: test #定义一个play的名称,可省略 gather_facts: false #设置不进行facts信息收集,这可以加快执行速度,可省略 hosts: test #指定要执行任务的被管理主机组,如多个主机组用冒号分隔 remote_user: root #指定被管理主机上执行任务的用户 vars: app: filebeat tasks: #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行 - name: restart filebeat service: name={{app}} state=restarted
2.2、剧本变量--通过vars_files关键字设置变量,需要提前写好vars_files文件
定义vars_files文件 ##定义vars_files [root@clinet test1]# cat vars_file.yml users: bjones: first_name: bob last_name: jons home_dirs: /users/bjones acook: first_name: Anne last_name: Cook home_dirs: /users/accok ##yml文件 [root@clinet test1]# cat vars.yml - hosts: db vars_files: - /root/ansibel-test/test1/vars_file.yml #最好为绝对路径 tasks: - name: debug message.. debug: msg: - '{{ users["bjones"] ["first_name"]}}' #两个[]之间以空格分隔
3.1、资产变量之主机变量--只针对这一台主机生效
[test] 192.168.20.1 app=filebeat
3.2、资产变量之主机组变量--针对这个主机组中的所有主机生效
[test] 192.168.20.1 192.168.20.2 [test:vars] app=filebeat
4、Facts变量
Facts变量不包含在前文中介绍的全局变量、剧本变量及资产变量之内 Facts变量不需要我们人为去声明变量名及赋值 它的声明和赋值完全由Ansible 中的Facts模块帮我们完成 类似于资产变量中的主机变量,它收集了有关被管理服务器的 操作系统的版本、服务器的IP地址、主机名,磁盘的使用情况、CPU个数、内存大小 等等有关被管理服务器的私有信息 在每次PlayBook运行的时候都会发现在PlayBook执行前都会有一个Gathering Facts的过程 这个过程就是收集被管理服务器的Facts信息过程 手动收集本机Facts变量(-c指定连接类型) ansible all -i localhost, -c local -m setup 过滤Facts变量 通过刚刚的手动收集Facts,我们发现facts 信息量很大 能不能有针对性的显示我们想要的信息呢? 可以通过使用Facts 模块中的filter参数去过滤我们想要的信息 仅获取服务器的内存情况信息(memory) ansible 10.11.67.19 -i hosts -m setup -a “filter=memory” 仅获取服务器的磁盘挂载情况 ansible 10.11.67.19 -i hosts -m setup -a “filter=mount” Playbook中使用Facts变量 默认情况下,在执行PlayBook的时候,它会去自动的获取每台被管理服务器的facts信息,可以像使用其他变量一样,去使用facts 变量 — - name: print facts variable hosts: all tasks: - name: print facts variable debug: msg: “The default IPV4 address is {{ ansible_default_ipv4.address }}” 在PlayBook中去关闭Facts 变量的获取 gather_facts: no 若在整个PlayBook 的执行过程中,完全未使用过Facts 变量,此时我们可以将其关闭,以加快PlayBook的执行速度 — - name: a play example hosts: all # 关闭 facts 变量收集功能 gather_facts: no remote_user: root tasks:
5、注册变量
注册变量往往用于保存一个task任务的执行结果, 以便于debug时使用 或者将此次task任务的结果作为条件,判断是否执行其他task任务 注册变量在PlayBook中通过register关键字去实现。 - hosts: db:web tasks: - name: debug message.. shell: netstat -ntpl register: system_info - name: get_info debug: msg: - '{{ system_info}}'
执行结果:
[root@clinet test1]# ansible-playbook vars.yml PLAY [db:web] ******************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************** ok: [10.10.10.134] ok: [10.10.10.135] ok: [10.10.10.136] TASK [debug message..] *********************************************************************************************** changed: [10.10.10.134] changed: [10.10.10.135] changed: [10.10.10.136] TASK [get_info] ****************************************************************************************************** ok: [10.10.10.135] => { "msg": [ { "changed": true, "cmd": "netstat -ntpl", "delta": "0:00:00.009932", "end": "2022-10-28 16:38:44.957768", "failed": false, "rc": 0, "start": "2022-10-28 16:38:44.947836", "stderr": "", "stderr_lines": [], "stdout": "Active Internet connections (only servers)\nProto Recv-Q Send-Q Local Address Foreign Address State PID/Program name \ntcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1523/sshd \ntcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1702/master \ntcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 957/rpcbind \ntcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1558/nginx: master \ntcp6 0 0 :::22 :::* LISTEN 1523/sshd \ntcp6 0 0 ::1:25 :::* LISTEN 1702/master \ntcp6 0 0 :::111 :::* LISTEN 957/rpcbind \ntcp6 0 0 :::80 :::* LISTEN 1558/nginx: master ", "stdout_lines": [ "Active Internet connections (only servers)", "Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name ", "tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1523/sshd ", "tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1702/master ", "tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 957/rpcbind ", "tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1558/nginx: master ", "tcp6 0 0 :::22 :::* LISTEN 1523/sshd ", "tcp6 0 0 ::1:25 :::* LISTEN 1702/master ", "tcp6 0 0 :::111 :::* LISTEN 957/rpcbind ", "tcp6 0 0 :::80 :::* LISTEN 1558/nginx: master " ] } ] } ok: [10.10.10.136] => { "msg": [ { "changed": true, "cmd": "netstat -ntpl", "delta": "0:00:00.021772", "end": "2022-10-28 16:38:45.896962", "failed": false, "rc": 0, "start": "2022-10-28 16:38:45.875190", "stderr": "", "stderr_lines": [], "stdout": "Active Internet connections (only servers)\nProto Recv-Q Send-Q Local Address Foreign Address State PID/Program name \ntcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 997/rpcbind \ntcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1533/sshd \ntcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1716/master \ntcp6 0 0 :::111 :::* LISTEN 997/rpcbind \ntcp6 0 0 :::22 :::* LISTEN 1533/sshd \ntcp6 0 0 ::1:25 :::* LISTEN 1716/master ", "stdout_lines": [ "Active Internet connections (only servers)", "Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name ", "tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 997/rpcbind ", "tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1533/sshd ", "tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1716/master ", "tcp6 0 0 :::111 :::* LISTEN 997/rpcbind ", "tcp6 0 0 :::22 :::* LISTEN 1533/sshd ", "tcp6 0 0 ::1:25 :::* LISTEN 1716/master " ] } ] } ok: [10.10.10.134] => { "msg": [ { "changed": true, "cmd": "netstat -ntpl", "delta": "0:00:00.008834", "end": "2022-10-28 16:38:45.406496", "failed": false, "rc": 0, "start": "2022-10-28 16:38:45.397662", "stderr": "", "stderr_lines": [], "stdout": "Active Internet connections (only servers)\nProto Recv-Q Send-Q Local Address Foreign Address State PID/Program name \ntcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1557/nginx: master \ntcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1525/sshd \ntcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1117/rpcbind \ntcp6 0 0 :::80 :::* LISTEN 1557/nginx: master \ntcp6 0 0 :::22 :::* LISTEN 1525/sshd \ntcp6 0 0 ::1:25 :::* LISTEN 1701/master \ntcp6 0 0 :::111 :::* LISTEN 1117/rpcbind ", "stdout_lines": [ "Active Internet connections (only servers)", "Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name ", "tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1557/nginx: master ", "tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1525/sshd ", "tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1117/rpcbind ", "tcp6 0 0 :::80 :::* LISTEN 1557/nginx: master ", "tcp6 0 0 :::22 :::* LISTEN 1525/sshd ", "tcp6 0 0 ::1:25 :::* LISTEN 1701/master ", "tcp6 0 0 :::111 :::* LISTEN 1117/rpcbind " ] } ] } PLAY RECAP *********************************************************************************************************** 10.10.10.134 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.10.10.135 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.10.10.136 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
变量的优先级
当一个变量同时在全局变量、剧本变量和资产变量中定义时,优先级最高的是全局变量;其次是剧本变量;最后才是资产变量。
全局>剧本>资产(主机>组>父组)
ansible中文官方文档:https://cn-ansibledoc.readthedocs.io/zh-cn/latest/