1.什么是ad-hoc命令
ad-hoc命令是指使用/usr/bin/ansible命令行工具在一个或多个管理节点上执行单个任务的命令。这其实是一个概念性的名字,是相对于 Ansible playbook 来说的。当我们需要快速的完成一些任务而不需要将执行的命令保存下来,这样的命令就称为ad-hoc命令。
Ansible提供两种方式去执行任务:一种是ad-hoc 命令,另一种是写 Ansible playbook。前者可以处理一些简单的任务,而后者需要处理比较复杂的任务。ad-hoc命令与playbook的关系类似于在命令行敲入的shell命令和shell scripts之间的关系。
ad-hoc命令虽然简单,但也展示出了Ansible的强大功能,并且也有很多使用场景,比如在多个远程主机上快速执行一次性的任务,或者想测试某个模块的行为以决定是否要加入到playbook中等等
模块
2.ad-hoc模式的使用场景
情景1:节假日将至, 我们需要关闭所有不必要的服务器, 并对所有服务器进行节前健康检查。
情景2:临时更新Apache &Nginx的配置文件,且需同时将其分发至所有需更新该配置的Web服务器。
3.使用ad-hoc执行一次远程命令
注意观察返回结果的颜色
绿色: 代表被管理端主机没有被修改
黄色: 代表被管理端主机发现变更
红色: 代表出现了故障,注意查看提示
紫色(粉色): 警告信息
4.ad-hoc模式的常用模块
command:执行shell命令(不支持管道等特殊字符) 管道 * > . ..
shell:执行shell命令 支持特殊符号
script:执行shell脚本
yum_repository:配置yum仓库 yum源
yum:安装软件
copy:变更配置文件 远程复制
file:建立目录或文件
service:启动与停止服务 设置开机自启动 systemctl
mount:挂载设备 磁盘 光盘 nfs ….
cron:定时任务 设置/删除定时任务
firewalld:防火墙
iptables:防火墙
group:管理组
user:管理用户
get_url:下载软件 wget
archive:打包压缩保存在被管理节点
unarchive:解包解压缩 实现有两种用法: 将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置remote_src=no,此为默认值,可省略 将远程本主机上或非ansible的其它主机的某个压缩包解压缩到远程主机本机的指定路径下
selinux:该模块管理 SELInux 策略
lineinfile:相当于sed,主要用于修改一行的文件内容
5.使用过程中需要先了解ansible-doc帮助手册
ansible-doc -l:查看所有模块说明
ansible-doc copy:表示指定模块方法
ansible-doc -s copy:表示指定模块参数
6.模块操作
执行命令模块
默认模块, 执行命令
chdir:执行Ansible时,切换到指定的目录
creates:如果文件存在,则跳过执行
removes:如果文件存在,则执行
[root@ansible ~]$ ansible web -a “hostname”
172.16.1.145 | CHANGED | rc=0 >>
web02
172.16.1.45 | CHANGED | rc=0 >>
web01
Ansible command 模块的完整参数列表和详细说明
argv:一个列表,包含要执行的命令及其参数
chdir:指定要在远程主机上执行命令的工作目录
creates:指定一个文件路径,如果该文件已存在,则命令不会执行
executable:指定要在远程主机上执行命令的可执行文件路径
removes:指定一个文件路径,如果该文件不存在,则命令不会执行
stdin:将标准输入流传递给命令
warn:指定是否在命令执行失败时发出警告,默认为 true
stdin_add_newline:指定是否在标准输入的末尾添加换行符,默认为 true
creates_time:指定一个文件路径,如果该文件存在并且最后修改时间在指定时间范围内,则命令不会执行
creates_file:指定一个文件路径,如果该文件存在并且是一个文件(不是目录),则命令不会执行
cmd:要执行的命令字符串(与 argv 参数互斥)
free_form:要执行的命令字符串(与 argv 参数互斥)
cmd_timeout:命令超时时间(以秒为单位)
cmd_warnings:指定是否显示命令执行的警告信息,默认为 true
cmd_creates:指定一个文件路径,如果该文件已存在,则命令不会执(与 creates 参数互斥)
cmd_removes:指定一个文件路径,如果该文件不存在,则命令不会执(与 removes 参数互斥)
stdin_lines:传递给命令的多行标准输入
cmd_cwd:指定要在远程主机上执行命令的工作目录(与 chdir 参数互斥)
cmd_umask:指定要在远程主机上执行命令时的 umask 值
cmd_executable:指定要在远程主机上执行命令的可执行文件路径(与 executable 参数互斥)
cmd_creates_time:指定一个文件路径,如果该文件存在并且最后修改时间在指定时间范围内,则命令不会执行(与 creates_time 参数互斥)
cmd_creates_file:指定一个文件路径,如果该文件存在并且是一个文件(不是目录),则命令不会执行(与 creates_file 参数互斥)
cmd_wait_for:指定一个条件,如果满足该条件,则等待一段时间后再执行命令
cmd_wait_for_timeout:等待命令执行的超时时间(以秒为单位),默认为 300 秒
cmd_wait_for_interval:等待命令执行的间隔时间(以秒为单位),默认为 1 秒
ignore_errors:参数来忽略命令执行的错误
请注意,cmd 参数和 free_form 参数是互斥的,只能使用其中之一。
shell模块,如果需要一些管道操作,则使用shell
使用起来与command一致, shell模块支持管道 特殊符号
[root@ansible ~]$ ansible web -i hosts -m shell -a ‘ip a | grep eth0’
172.16.1.145 | CHANGED | rc=0 >>
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 10.0.0.145/24 brd 10.0.0.255 scope global eth0
172.16.1.45 | CHANGED | rc=0 >>
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 10.0.0.45/24 brd 10.0.0.255 scope global eth0
script脚本模块
[root@ansible ~]$ mkdir -p /server/scripts
[root@ansible ~]$ cat /server/scripts/yum.sh
#!/usr/bin/bash
yum install -y cowsay
[root@ansible ~]$ ansible web -m script -a ‘/server/scripts/yum.sh’
软件管理模块
name:软件包名称
state:状态installed,present安装 absent或removed删除 latest 最新版
list=ansible:列出当前仓库可用的软件包 yum list ansible 查找软件包
enablerepo: 通过哪个仓库获取
disablerepo: 不使用哪些仓库的包
download_only=true:仅下载,不安装
exclude:kernel排除exclude=kernel
[root@ansible ~]$ ansible web -m yum -a “name=httpd state=present”
通过epel仓库安装
[root@ansible ~]$ ansible web -m yum -a “name=httpd state=present
enablerepo=epel”
安装多个软件包
[root@ansible ~]$ ansible web -m yum -a “name=httpd,tree,cowsay,lrzsz state=present”
yum_repository此模块实现yum的仓库配置管理(源)
name:仓库id
description:仓库描述名称,对应配置文件中的name=
baseurl:仓库的地址
gpgcheck:验证开启
gpgkey:仓库公钥路径
state:absent(删除)/present(配置 安装 这个是默认的)
file:指定yum配置文件的路径和名称 注意不需要以.repo结尾 默认使用 name的内容作为文件名
enabled yes/no:是否开启yum源 默认是 yes 开启
[root@ansible ~]$ ansible web -m yum_repository -a ‘name=php description=”php repo” baseurl=”http://us-east.repo.webtatic.com/yum/el7/x86_64/” enabled=no state=present ‘
文件管理模块
ansible文件管理模块,主要涉及copy文件拷贝、file文件创建、get_url文件下载
copy文件拷贝模块
src:控制端的源文件路径
dest:被控端的文件路径
owner:属主
group:属组
mode:权限
backup:是否开启备份功能,如果目标存在,覆盖之前进行备份
validate:验证
content:新建文件并给文件添加内容
拷贝文件文件至被控节点
[root@ansible ~]$ ansible web -m copy -a ‘src=/etc/hosts dest=/tmp’
对远端已有文件进行备份,按照时间信息备份
[root@ansible ~]$ ansible web -m copy -a ‘src=/etc/hosts dest=/tmp/hostname backup=yes’
复制目录并修改所有者与权限
[root@ansible ~]$ ansible web -m copy -a ‘src=/etc/hosts dest=/tmp/hostqx owner=nginx group=nginx mode=755’
file文件创建模块
path:在被控端创建的路径
owner:属主
group:属组
mode:权限
state:状态 touch创建文件 directory创建目录 link软链接 hard硬链接
recurse:yes表示递归授权
创建目录
[root@ansible ~]$ ansible web -m file -a ‘path=/cs/ state=directory ‘
创建文件
[root@ansible ~]$ ansible web -m file -a ‘path=/cs/cs.txt state=touch’
递归修改权限所有者
[root@ansible ~]$ ansible web -m file -a ‘path=/cs/ state=directory owner=nginx group=nginx mode=755 recurse=yes’
get_url文件下载模块
url:下载文件的URL,支持HTTP,HTTPS或FTP协议
dest:下载到目标路径(绝对路径),如果目标是一个目录,就用原文件名,如果目标设置了名称就用目标设置的名称
owner:指定属主
group:指定属组
mode:指定权限
force:如果yes,dest不是目录,将每次下载文件,如果内容改变替换文件。如果no,则只有在目标不在时才会下载
checksum:对目标文件在下载后计算摘要,以确保其完整性
通过get_url下载文件或者软件
[root@ansible ~]$ ansible web -m get_url -a ‘url=https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-get-5.0.0-1.el7.x86_64.rpm dest=/tmp/’
如果失败把https修改成http就成功了
服务管理模块
service此模块和sytemd功能相似,选项很多相同
name:服务名称
state:服务状态 started启动 stopped停止 restarted重启 reloaded重载
enabled:开启自启动
daemon_reload:加载新的配置文件,适用于systemd模块
启动服务,并加入开机自启动
[root@ansible ~]$ ansible web -m service -a ‘name=crond state=started enabled=yes’
停止服务,并删除开机自启
[root@ansible ~]$ ansible web -m service -a ‘name=crond state=stopped enabled=on’
用户管理模块
user管理用户
name:创建的名称
uid:指定uid
group:指定基本组
shell:登录shell类型默认/bin/bash,/sbin/nologin系统账号的shell使用 ,此时无法登陆系统,即使给了密码也不行
create_home:是否创建家目录,默认会创建家目录,no不创建
password:设定对应的密码,必须是加密后的字符串才行,否则不生效
system:yes表示系统用户
groups:附加组
append:追加附加组使用,yes表示增加新的附加组
state:absen删除
remove:yes表示删除用户时将家目录一起删除
generate_ssh_key:创建私钥
ssh_keyu_bits:私钥位数
ssh_key_file:私钥文件路径
创建用户
[root@ansible ~]$ ansible web -m user -a ‘name=dmxsp uid=567 group=dmxsp shell=/sbin/nologin create_home=no ‘
删除用户
ansible web -m user -a “name=xxx state=absent”
查看
[root@ansible ~]$ ansible web -a ‘id dmxsp’
172.16.1.145 | CHANGED | rc=0 >>
uid=567(dmxsp) gid=567(dmxsp) groups=567(dmxsp)
172.16.1.45 | CHANGED | rc=0 >>
uid=567(dmxsp) gid=567(dmxsp) groups=567(dmxsp)
密钥对
generate_ssh_key=yes
ssh_key_bits=2048
ssh_key_file=.ssh/id_rsa #私钥
将明文密码进行hash加密,然后进行用户创建
[root@ansible ~]$ ansible localhost -m debug -a “msg={{ ‘123’ | password_hash(‘sha512′,’salt’) }} ”
localhost | SUCCESS => {
“msg”: “$6$salt$jkHSO0tOjmLW0S1NFlw5veSIDRAVsiQQMTrkOKy4xdCCLPNIsHhZkIRlzfzIvKyXeGdOfCBoW1wJZPLyQ9Qx/1”
}
[root@ansible ~]$ ansible web -m user -a ‘name=xx password=$6$salt$jkHSO0tOjmLW0S1NFlw5veSIDRAVsiQQMTrkOKy4xdCCLPNIsHhZkIRlzfzIvKyXeGdOfCBoW1wJZPLyQ9Qx/1 ‘
group管理组
name:指定组名称
gid:指定gid
state:present创建,默认absent删除
system:是否是系统组
创建组
[root@ansible ~]$ ansible web -m group -a ‘name=dmxsp gid=567’
debug
此模块可以用于输出信息,并且通过 msg 定制输出的信息内容,功能类似于echo命令 注意: msg后面的变量有时需要加 ” ” 引起来 常见选项
msg:指定命令输出的信息
var:指定变量名,和msg互斥
verbosity:详细度
[root@ansible ~]$ ansible localhost -m debug -a “msg={{ ‘123’ | password_hash(‘sha512′,’salt’) }} ”
localhost | SUCCESS => {
“msg”: “$6$salt$jkHSO0tOjmLW0S1NFlw5veSIDRAVsiQQMTrkOKy4xdCCLPNIsHhZkIRlzfzIvKyXeGdOfCBoW1wJZPLyQ9Qx/1”
}
定时任务模块
cron计划任务 支持时间:minute,hour,day,month,weekda
name:描述脚本的作用
minute:分钟
hour:小时
weekday:周
user:任务由哪个用户运行;默认root
job:任务
state:默认present创建absent删除
添加定时任务
[root@ansible ~]$ ansible web -m cron -a ‘name=”script” minute=”*/2″ job=”sh /server/scripts/yum.sh &>>/dev/null” ‘
查看
[root@ansible ~]$ ansible web -a ‘crontab -l’
删除
[root@ansible ~]$ ansible web -m cron -a ‘name=”script” state=absent ‘
磁盘挂载模块
mount挂载和卸载文件系统
src:源设备路径,或网络地址
path:挂载至本地哪个路径下
fstype:设备类型; nfs
opts:挂载的选项
state:挂载还是卸载present永久挂载,但没有立即生效(仅修改配置 开机挂载,仅将挂载配置写入/etc/fstab)absent卸载临时挂载,并删除永久挂载(卸载设备,会清理/etc/fstab写入的配置) mounted永久和临时挂载(挂载+修改配置 挂载设备,并将配置写入/etc/fstab) unmounted临时卸载(卸载设备,不会清除/etc/fstab写入的配置)remounted重新挂载
在backup服务器上安装nfs
[root@ansible ~]$ ansible backup -m yum -a ‘name=nfs-utils state=present’
配置文件
[root@ansible ~]$ ansible backup -m copy -a ‘content=”/data-dmxsp/ 172.16.1.0/24(rw,all_squash)” dest=/etc/exports ‘
创建目录修改所有者
[root@ansible ~]$ ansible backup -m file -a ‘path=/data-dmxsp owner=nfsnobody group=nfsnobody state=directory ‘
启动服务并开机自启动
[root@ansible ~]$ ansible backup -m service -a ‘name=rpcbind state=started enabled=yes’
[root@ansible ~]$ ansible backup -m service -a ‘name=nfs state=started enabled=yes’
backup上面进行挂载(本地测试)
[root@ansible ~]$ ansible backup -m mount -a ‘src=172.16.1.116:/data-dmxsp path=/tmp/ fstype=nfs state=mounted’
web服务器进行挂载
[root@ansible ~]$ ansible web -m mount -a ‘src=172.16.1.116:/data-dmxsp path=/code/backup fstype=nfs state=mounted’
防火墙管理模块
Linux下防火墙主要分为Selinux与Firewalld、iptables
Selinux防火墙
policy:指定SELINUXTYPE=targeted
state:指定SELINUX=disabled
ansible web -m selinux -a “state=disabled”
firewalld防火墙
zone:要操作的区域 默认public
source:来源地址
service:服务名称 http,https,sshd,……
port:端口
permanent:永久生效,但不会立即生效
immediate:临时生效
state: 指定规则的状态。可以是enabled(启用规则)、disabled(禁用规则)或persistent(持久化规则)
masquerade:指定是否启用SNAT(源地址转换)
rich_rules:指定使用rich规则配置防火墙
forward_ports:指定要转发的端口
icmp_block:指定要阻止的ICMP类型
destination:指定规则的目标IP地址或网络。可以是单个IP地址、CIDR地址或IP范围
[root@ansible ~]$ ansible webs -m systemd -a “name=firewalld state=started”
[root@ansible ~]$ ansible web -m firewalld -a “service=http immediate=yes state=enabled”
[root@ansible ~]$ ansible web -m firewalld -a “port=80/tcp immediate=yes state=enabled”
iptables
chain:指定规则所属的链。可以是预定义的链(如INPUT、OUTPUT、FORWARD等),也可以是自定义的链
table:指定规则所属的表。可以是预定义的表(如filter、nat、mangle等),也可以是自定义的表
protocol:指定规则的协议。可以是预定义的协议(如tcp、udp、icmp等),也可以是自定义的协议
source:指定规则的源IP地址或网络。可以是单个IP地址、CIDR地址或IP范围destination:指定规则的目标IP地址或网络。可以是单个IP地址、CIDR地址或IP范围
in_interface:指定规则的入接口
out_interface:指定规则的出接口
source_port:指定规则的源端口
destination_port:指定规则的目标端口
jump:指定规则的目标动作。可以是预定义的动作(如ACCEPT、DROP、REJECT等),也可以是自定义的动作
state:指定规则的状态。可以是present(默认,添加规则)、absent(删除)或disabled(禁用规则)
comment:指定规则的注释
action:如何添加规则 insert插入 append追加
[root@ansible ~]$ ansible 172.16.1.163 -m iptables -a “table=filter action=insert chain=INPUT source=10.0.0.0/24 protocol=tcp destination_port=3306 jump=DROP ”
7.使用模块简单搭建
安装nginx服务
编写简单网页测试内容
启动服务不加入开机自启
放行对应的端口
[root@ansible ~]$ ansible 172.16.1.163 -m yum_repository -a “name=nginx description=”nginx repo” baseurl=http://nginx.org/packages/centos/7/x86_64/ enabled=yes gpgcheck=no state=present ”
[root@ansible ~]$ ansible 172.16.1.163 -m yum -a ‘name=nginx state=installed’
[root@ansible ~]$ ansible 172.16.1.163 -m copy -a ‘content=”backup.123.com” dest=/usr/share/nginx/html/index.html ‘
[root@ansible ~]$ ansible 172.16.1.163 -m systemd -a ‘name=nginx state=started enabled=yes’
[root@ansible ~]$ ansible 172.16.1.163 -m iptables -a ‘table=filter action=append chain=INPUT protocol=tcp destination_port=80 jump=ACCEPT ‘