环境介绍
ansible服务端:192.168.200.200
clinet客户机:192.168.200.201
clinet客户机:192.168.200.202
ansible批量命令组成部分
1、ansible主命令
2、指定ansible要操作的主机信息,可能是主机组名,ip地址,或者all全部
3、调用ansible的模块,-m
4、指定使用那个模块默认使用的模块是command,比如shell模块
5、调用对应模块指定的命令-a
6、执行指定模块对应的命令,比如ping,hostname
ansible服务端部署
[root@ansible ~]# yum -y install epel-release
[root@ansible ~]# yum -y install ansible
设置清单主机(客户机分组)
[root@ansible ~]# vi /etc/ansible/hosts
[client1]
192.168.200.201
[client2]
192.168.200.202
设置ansible主机登录认证
密码认证
再次编辑清单主机文件,添加要连接主机端口号,登录账号,登录密码
[root@ansible ~]# vi /etc/ansible/hosts
[client1]
192.168.200.201 ansible_user=root ansible_password=qazwsx ansible_port=22
[client2]
192.168.200.202 ansible_user=root ansible_password=qazwsx ansible_port=22
再次尝试ping测试主机是否存活
秘钥认证(免密码登录)
ansible服务器需要生成公钥,,使用ssh-keygon命令生成一堆rsa秘钥,秘钥保存在本地、公钥名通常为id_rsa.pub,保存在客户端的.ssh/id_rsa.pub中
上传公钥的需要登录的机器中,使用ssh-copy-id命令可以将公钥上传到要登录的机器的.ssh/authorized_keys文件中,这个文件记录了所有允许无秘钥登录的公钥
把公钥发送给需要登录的机器
两台客户机都添加了无秘钥登录我们来测试下是否可以实现无秘钥登录,使用ssh登录看看需不需要输入密码
测试下ansible无秘钥连接客户机
先把ansible主机组中配置的登录用户名密码给去掉
[root@ansible ~]# vi /etc/ansible/hosts
[client1]
192.168.200.201
[client2]
192.168.200.202
同一组连续的ip
可以修改主机清单文件
[root@ansible ~]# vi /etc/ansible/hosts
[test]
192.168.200.20[1:2]
调用test分组测试下ping
定义公共变量
定义针对所有分组变量
当主机清单里,有多个主机分组,有相同的变量属性,不需要每个地址重复写入相同参数,可以使用相同公共变量
all:vars 组中all对应下面所有分组,vars定义公共变量
定义针对单一分组变量
定义针对client2分组的公共变量
ansible命令执行方式
ansible批量管理主机的模式有两个
1、利用ansible命令实现批量管理主机(ad-hoc)模式
2、利用ansible剧本实现批量管理主机(playbook)模式
ad-hoc模式和playbook模式的关系好比shell命令和shell命令写的scripts的关系
ansible-doc命令
列出ansible所有支持的模块、
查看ansible模块支持的数量
查看具体某个模块的用法,支持那些参数命令

ansible常用模块介绍
ping模块测试连通性
参数介绍
执行命令
command模块执行简单的命令,不能识别命令中的变量
参数介绍
command是ansible的基础模块,默认就是-m command 大部分大部分基础命令和linux基础命令是一致的。
注意不能使用$变量,不能出现特殊符号<,>,|,;,&,这些特殊符号无法识别,可以使用shell模块
执行命令
查看主机名
查看远程主机内存
远程主机上创建文件,查看文件
远程主机上创建文件如何关闭告警(warning)信息
获取远程主机负载
远程主机上创建test用户
command专有命令
chdir 在执行命令时执行,通过cd命令进入指定目录
creates 定义一个文件是否存在,若不存在,则执行相应的命令;存在就不执行跳过
free_from 参数信息中可以输入任何系统命令,实现远程管理
removes 定义一个文件是否存在,如果存在,就执行相应命令,不存在就跳过
专有命令练习
chdir命令,复制一个文件;查看文件
creates命令,检测文件或者目录是否存在,存在就跳过不执行,不存在就创建
removes命令,判断执行文件或者文件夹是否存在,存在就执行,不存在就跳过
shell模块(万能模块)
远程过滤ssh进程信息
使用重定向符号,往文件中写入内容
远程执行复杂的linux命令
创建文件夹,生成sh脚本,赋予脚本可执行权限,执行脚本,忽略告警信息
copy模块拷贝文件
copy模块是远程推送数据,只能把数据推送给远程主机节点,无法从远程拉去到本地
参数:
src 用于定位ansible执行的机器上的文件,需要绝对路径。如果拷贝的文件夹,那么文件夹会整体拷贝,如果结尾“/”,那么只有文件夹内的东西被考过去,感觉和rsync
content 用来替代src,用于将指定的内容拷贝到远程文件内
dest 用于定位远程节点上的文件,需要绝对路径,如果src指定的是文件夹,这个参数也必须是文件夹
backup 备份远程节点上的原始文件,在拷贝前备份呢,如果误操作,原始文件还能用
directory_mode 这个参数只能用于拷贝文件夹的时候,这个设定后,文件夹内新建的文件会被拷贝,老旧的文件不会被拷贝
follow 当拷贝的时候文件有软硬连接属性,拷贝过去也会有软硬链接属性
force 默认为yes,会覆盖远程的内容不一致的文件(可能文件名一样)如果设置no,就不会拷贝
group 设定一个群组拥有拷贝到远程节点的文件权限(前提远程主机上这个组存在)
mode 等同于chmod,参数可以喂u+rwx,或这个u=rw,g=r,o=r
owner 设定一个用户拥有拷贝到远程节点的文件权限(前提远程主机上这个用户存在)
语法:
ansible “主机组” -m copy -a “参数”
发送ansible主机上的文件到远程主机
发送文件且指定文件属性
权限修改为600,修改为test用户
1、创建test用户
[root@ansible ~]# ansible client1 -m shell -a "useradd test"
2、拷贝文件,修改权限
[root@ansible ~]# ansible client1 -m copy -a "src=/root/test.txt dest=/tmp/ owner=test group=test mode=600"
发送文件且先做好备份
使用backup参数,防止覆盖远程主机上的文件,提前备份改目标主机对应的文件
1、检查远程主机上的文件
2、修改本地文件,为了让本地和远程主机数据不一致,方便检测备份是否生效
3、远程拷贝文件,且做好备份
4、通过返回信息可以看到backup_file参数的值就是备份数据的路径
5、查看拷贝过去远程主机上的文件内容
6、查看远程主机上备份数据的文件内容
指定数据内容写入到远程主机文件中,类似linux中的重定向
写入数据覆盖原数据
file文件操作模块
file模块主要作用是创建、设置文件目录属性
file模块可以对文件进行基本操作,创建文件或者目录,删除文件或者目录,修改文件目录权限
参数:
path 指定要操作的文件或者目录,在旧版本中可以使用dest参数或者name参数指定要操作的文件或者目录,为了兼容老版本ansible,使用dest或者name也可以
state 灵活参数,表示指定的文件或者目录要执行什么操作,创建文件、目录,删除,等
state=directory 目录
state=touch 文件
state=link 软链接
state=hard 硬链接
state=absent 删除(不区分目录、文件、软硬链接)
src 当我们设置state为link或者hard软硬链接的时候必须设置src源目标路径
force 当state=link的时候可以配合此参数强制创建连接文件,当force=yes时,表示枪机创建连接文件
owner 用于指定目标操作文件的属主
group 用于指定目标操作文件的属组
mode 用于指定目标操作文件的权限
recurse 当操作对象是目录的时候,将recurse设置为yes,可以递归的修改目录中文件的属性
创建文件

创建文件夹

创建文件并设置权限
修改已经存在的文件或者文件夹属性
修改文件
修改目录
script脚本模块
介绍
模块功能:把脚本传输到远程节点上并运行脚本
比起shell模块,scripts模块功能更强大,本地有一份脚本就可以在所有机器上运行,不需要每台机器上发送一个文件再单独在每个机器上执行脚本
参数介绍
creates 定义一个文件是否存在,如不存在,就运行相应命令;存在就跳过
free_from 参数信息中可以输入任何命令,实现远程管理
removes 定义一个文件是否存在,如果存在,则运行相应的命令;如果不存在就跳过
执行远程脚本
1、管理机创建测试脚本
[root@ansible ~]# cat > echo_server_info.sh << EOF
> #!/bin/bash
> echo "$(hostname -I)" >> /tmp/server_info.log
> echo "$(uptime)" >> /tmp/server_info.log
> echo "$(free -h)" >> /tmp/server_info.log
> echo "$(ip addr)" >> /tmp/server_info.log
> EOF
2、给脚本添加执行权限
[root@ansible ~]# chmod +x echo_server_info.sh
3、远程执行
4、检查执行结果
cron定时任务模块
介绍:
cron模块用于管理定时任务的记录,编写任务,删除任务
参数介绍
minute参数,此参数用于设置分钟,比如minute=5,当不使用此参数时默认值为“*”
hour参数,此参数用于设置小时,比如1小时的设定是hour=1,当不使用此参数时默认参数值为“*”
day参数,此参数用于设置天,比如1天的设定是day=1,当不使用此参数时默认参数值为“*”
month参数,此参数用于设置月,当不使用此参数时默认参数值为“*”
weekday参数,此参数用于设置周,当不使用此参数时默认参数值为“*”
special_time参数,计划任务的时间设定格式为@reboot(表示重启时执行),或者@hourly(每小时执行一次)
user参数,此参数用于设置脚本文件用那个用户执行,默认是管理员用户
job参数,此参数用于指定计划任务重需要实际执行的命令或者脚本,比如上面说的“echo test”命令
name参数,此参数用户设置脚本的名称,方便后面我们根据脚本名字对脚本进行修改或者删除对应脚本
state参数,当计划有上面name参数时,我们可以根据名称修改或者删除对应的参数,当删除计划任务的时候state=absent
disabled参数,当计划任务有名称时,我们可以根据名称使对应计划任务失效,注意:使用此参数时,除了需要指定任务名称,还需要同时指定任务的job以及任务的时间设定,而且任务的时间设定必须和对应任务完全相同
backup参数,如果此参数的值设置为yes,当修改或者删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或者删除,cron会在远程主机的/tmp/目录下创建备份文件
添加ntpdate定时任务
远程主机每5分钟执行一次和阿里云时间服务器进行时间同步
[root@ansible ~]# ansible client1 -m cron -a "name=ntpdate_time job='/usr/bin/ntpdate ntp.aliyun.com >/dev/null 2>&1' minute=*/5"
查看远程机器的cron计划任务
删除定时任务
[root@ansible ~]# ansible client1 -m cron -a "name=ntpdate_time state=absent"
创建每分钟执行的任务
1、每分钟定时执行脚本
[root@ansible ~]# cat > echo_hostname.sh << 'EOF'
> #!/bin/bash
> echo "$(date +%T) $(hostname)" >> /tmp/hostname.log
> EOF
2、远程拷贝脚本
[root@ansible ~]# ansible client1 -m copy -a "src=/root/echo_hostname.sh dest=/opt/echo_hostname.sh"
3、设置定时任务,多次执行改命令,会覆盖name的任务
[root@ansible ~]# ansible client1 -m cron -a "job='/bin/bash /opt/echo_hostname.sh' name=cron_hostname"
修改指定名称的定时任务
先查询要修改的计划任务
修改定时任务,由原来每分钟执行一次改为每两分钟执行一次
[root@ansible ~]# ansible client1 -m cron -a "name=cron_hostname job='/bin/bash /opt/echo_hostname.sh' minute=*/2"
查看定时任务输出日志,查看是否是每两分钟打印一次
group组管理模块
介绍:管理系统用户组模块
参数:
name参数,用于指定组名
gid参数,用于指定组的gid
state参数:absent,一处远程主机上指定组;present,创建远程主机上指定组
创建yzn_ops组,gid为1111
[root@ansible ~]# ansible test -m group -a "name=yzn_ops state=present gid=1111"

删除组
[root@ansible ~]# ansible test -m group -a "name=yzn_ops state=absent"
user用户管理模块
介绍:创建用户
参数:
create_home 创建家目录,设置no则创建家目录
group 创建用户组
name 创建用户名
password 创建用户密码
uid 设置用户uid
shell 设置用户登录解释器
state absent(删除用户),present(默认参数,创建用户)
expires 账号过期时间
创建yzn用户,uid设置为8888
[root@ansible ~]# ansible test -m user -a "name=yzn uid=8888 state=present"
删除yzn用户
[root@ansible ~]# ansible test -m user -a "name=yzn state=absent"
创建用户test01(uid,gid为777,没有家目录,不允许登录)
注意:user模块创建用户会自动创建对应组用户,但是gid不指定会默认递增
1、先创建组,指定gid为777
[root@ansible ~]# ansible client1 -m group -a "name=test01 gid=777"
2、创建用户,指定uid,指定组
[root@ansible ~]# ansible client1 -m user -a "name=test01 uid=777 group=test01 create_home=no shell=/sbin/nologin"
yum软件安装模块
介绍:yum模块用于专门管理软件的模块
参数介绍:
conf_file 设定远程yum执行所依赖的yum配置文件
disable_gpg_check 在安装包前检查依赖,
list 列出要安装的软件信息
name yum需要安装的软件包名字
state 用于描述安装包的状态,present/latest是用于安装,absent用于卸载
update_cache 用于安装包前执行更新list
state参数值
absent,installed,latest,present,removed
安装ntpdate程序
[root@ansible ~]# ansible test -m yum -a "name=ntpdate state=installed"
卸载ntpdate程序
[root@ansible ~]# ansible test -m yum -a "name=ntpdate state=removed"
service/systemd模块
主要参数:
daemon_reload:在执行任何其他操作之前运行守护进程重新加载,确保systemd已经读取其他更改
enabled:服务是否开机自启动,yes|no
name:服务名称
state:对当前服务进行操作,启动(started),停止(stopped),重启(restarted),重新加载(reloaded)
user:使用服务的调用者运行systemctl
安装ntpdate服务
[root@ansible ~]# ansible client1 -m yum -a "name=ntpdate state=installled"
启动服务
[root@ansible ~]# ansible client1 -m systemd -a "name=ntpdate state=started"
查询状态
[root@ansible ~]# ansible client1 -m shell -a "systemctl status ntpdate"
停止服务
[root@ansible ~]# ansible client1 -m systemd -a "name=ntpdate state=stopped"
设置开机自启动
[root@ansible ~]# ansible client1 -m systemd -a "name=ntpdate enabled=yes"
检查状态
查询开机是否自启
[root@ansible ~]# ansible client1 -m shell -a "systemctl is-enabled ntpdate"
停止服务并关闭开机自启
[root@ansible ~]# ansible client1 -m systemd -a "name=ntpdate state=stopped enabled=no"
mount挂载模块
参数:
mounted 挂载设备且写入fstab
present 仅写入fstab不挂载
absent 卸载且删除fstab记录
umounted 只卸载不删除fstab记录
给client1机器挂载nfs目录(只写入/etc/fstab文件不挂载)
[root@ansible ~]# ansible client1 -m mount -a "src='192.168.200.200:/nfs-data' path=/data fstype=nfs state=present"
给client1机器挂载nfs目录(写入/etc/fstab文件且挂载)
[root@ansible ~]# ansible client1 -m mount -a "src='192.168.200.200:/nfs-data' path=/data fstype=nfs state=mounted"
取消挂载,删除/etc/fstab文件中写入内容
[root@ansible ~]# ansible client1 -m mount -a "src='192.168.200.200:/nfs-data' path=/data fstype=nfs state=absent"
取消挂载,不删除fstab文件记录
[root@ansible ~]# ansible client1 -m mount -a "src='192.168.200.200:/nfs-data' path=/data fstype=nfs state=umounted"
archive压缩模块,压缩包
支持压缩格式:bz2、gz、tar、xz、zip,默认gz格式
用法:format指定压缩格式
path 指定要压缩内容路径
dest 指定压缩那文件存放路径
压缩/tmp下的所有文件到指定路径
[root@ansible ~]# ansible client1 -m archive -a "path=/tmp dest=/root/tmp.tgz"
压缩/tmp下的所有文件到指定路径,指定压缩格式为zip
[root@ansible ~]# ansible client1 -m archive -a "path=/tmp/ dest=/root/tmp.zip format=zip"
unarchive解压模块
注意:解压缩是在远程主机上解压缩,不是在本机上解压缩
remote_src远程主机上解压缩
[root@ansible ~]# ansible client1 -m unarchive -a "src=/root/tmp.tgz dest=/opt/ remote_src=yes"
将ansible机器上的压缩包解压到远程主机上
1、ansible机器上生成压缩包
[root@ansible ~]# tar -zcf etc.tgz /etc/
2、远程解压到client2机器的/tmp/目录下
[root@ansible ~]# ansible client2 -m unarchive -a "src=/root/etc.tgz dest=/tmp/"
3、检查
[root@ansible ~]# ansible client2 -a "ls /tmp/"