一、安装部署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
变量的优先级
当一个变量同时在全局变量、剧本变量和资产变量中定义时,优先级最高的是全局变量;其次是剧本变量;最后才是资产变量。