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 ‘

作者 dmxsp

发表回复

您的电子邮箱地址不会被公开。