最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

Ansible快速入门(下)

来源:博客园

6. Ansible常用模块

ansible有着诸多的模块,虽然模块众多,但最为常用的模块也就 20-30个左右;


【资料图】

6.1 command模块

功能:在远程主机执行 Shell命令;此为默认模块,可忽略 -m选项;注意:不支持管道命令 |

参数选项含义
chdirchdir /opt执行ansible时,切换到指定的目录
createscreates /data/file如果文件存在,则跳过执行
removesremoves /data/file如果文件存在,则执行

范例1:chdir,切换目录执行 Shell命令;

[root@manger ~]# ansible localhost -m command -a "chdir=/root echo $PWD"localhost | CHANGED | rc=0 >>/root

范例2:creates,如果 /data/file文件存在,则跳过执行;

[root@manger ~]# ansible localhost -m command -a "creates=/data/file ifconfig eth0"localhost | SUCCESS | rc=0 >>skipped, since /data/file exists

范例3:removes,如果 /data/file文件存在,则执行;

[root@manger ~]# ansible localhost -m command -a "removes=/data/file ifconfig eth0"localhost | CHANGED | rc=0 >>eth0: flags=4163mtu 1500inet 10.0.0.6 netmask 255.255.255.0 broadcast 10.0.0.255inet6 fe80:20c:29ff:fe2a:348 prefixlen 64 scopeid 0x20ether 00:0c:29:2a:03:48 txqueuelen 1000 (Ethernet)RX packets 76534 bytes 99611397 (96.9 MiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 17274 bytes 1957911 (1.8 MiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

6.2 shell模块

功能:在远程主机执行 Shell命令,执行管道等特殊符号的操作;

参数选项含义
chdirchdir /opt执行ansible时,切换到指定的目录
createscreates /data/file如果文件存在,则跳过执行
removesremoves /data/file如果文件存在,则执行

范例1:使用 Shell命令过滤被控端主机的 IP地址;

[root@manger ~]# ansible localhost -m shell -a "ifconfig eth0|awk "NR==2" "[WARNING]: No inventory was parsed, only implicitlocalhost is availablelocalhost | CHANGED | rc=0 >>inet 10.0.0.6 netmask 255.255.255.0 broadcast 10.0.0.255

6.3 script模块

功能:在被控节点,运行 Ansible主机的脚本;

范例1:在 Ansible主机上编写脚本,然后推送至被控端运行;

#在本地运行模块,等同于在远程执行,不需要将脚本文件进行推送目标主机执行[root@manger ~]# ansible webservers -m script -a "/data/yum.sh"

6.4 yum模块

功能:管理各个操作系统的软件包;

参数选项含义
namehttpd、nginx ...指定安装软件包名或软件包URL
statepresent(Defaults)、absent、latest指定yum对应的方法
enablerepoepel、base ...允许从哪些仓库获取软件
disablerepoepel、base ...禁止从哪些仓库获取软件
excludekernel ...排除某些软件包
download_onlyyes、no仅下载软件包,不安装

范例1:安装当前最新的 Apache软件,如果存在则不安装

[root@manger ~]# ansible webservers -m yum -a "name=httpd state=present"

范例2:安装当前最新的Apache软件,通过epel仓库安装

[root@manger ~]# ansible webservers -m yum -a "name=httpd state=present enablerepo=epel"

范例3:通过公网 URL安装 rpm软件

[root@manger ~]# ansible webservers -m yum -a "name=https://xx.rpm state=present"

范例4:安装最新版本的 Apache软件,如果存在则更新 Apache

[root@manger ~]# ansible webservers -m yum -a "name=httpd state=latest"

范例5:更新所有的软件包,但排除和 kernel相关的

[root@manger ~]# ansible webservers -m yum -a "name=* state=latest exclude=kernel"

范例6:删除 Apache软件

[root@manger ~]# ansible webservers -m yum -a "name=httpd state=absent"

6.5 copy模块

功能:从 ansible服务端主控端复制文件到远程主机;

参数选项含义
src复制本地目录下的文件至远程服务器
dest文件复制到远程的绝对路径
ownerroot(Defaults)文件复制到远程并设定属主
grouproot(Defaults)文件复制到远程并设定属组
modefile=644,directory=755文件复制到远程并设定权限
backupyes备份被修改前的配置文件
content新建文件并给文件添加内容

范例1:将本地的 httpd.conf文件 Listen端口修改为 8080,推送至远程服务器

[root@manger ~]# ansible webservers -m copy -a "src=./httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=644"

范例2:将本地的 httpd.conf文件 Listen端口修改为 9090,推送至远程服务器,然后检查远端是否存在上一次的备份文件

[root@manger ~]# ansible webservers -m copy -a "src=./httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=644 backup=yes"

范例3:往远程的主机文件中写入内容,如果文件不存在则创建

[root@manger ~]# ansible webservers -m copy -a "content="Http_Server" dest=/var/www/html/index.html"

6.6 file模块

功能:为被控端创建文件或目录,设定权限属性;

参数选项含义
path指定远程服务器的路径
recurse递归方式(可以是递归授权)
statetouch、directory、link、absent文件复制到远程的状态
ownerroot(Defaults)文件复制到远程并设定属组
grouproot(Defaults)备份被修改前的配置文件
modefile=644,directory=755文件复制到远程并设定权限

范例1:创建文件,并设定属主、属组、权限

[root@manger ~]# ansible webservers -m file -a "path=/tmp/foo.conf state=touch mode=666"

范例2:创建目录,并设定属主、属组、权限

[root@manger ~]# ansible webservers -m file -a "path=/tmp/foo state=directory mode=777"

范例3:递归授权目录

[root@manger ~]# ansible webservers -m file -a "path=/tmp/foo state=directory owner=root group=root mode=777 recurse=yes"

6.7 lineinfile模块

功能:修改或删除文件内容,与系统中的 sed命令类似;

参数选项含义
path指定要操作的文件
regexp使用正则表达式匹配对应的行
line修改为新的内容
insertafter将文本插入到“指定的行”之后
insertbefore将文本插入到“指定的行”之前
stateabsent、present(Defaults)删除对应的文本时,需要state=absent
backrefsyes、no1.支持后向引用 2.当未匹配到内容则不操作文件
backup是否在修改文件之前对文件进行备份
create当要操作的文件并不存在时,是否创建对应的文件

范例1:将 SELINUX修改为 disabled状态;

[root@manger ~]# ansible localhost -m lineinfile -a "path=/etc/selinux/config regexp="^SELINUX=" line=SELINUX=disabled"

范例2:删除 /etc/sudoers文件中 %wheel开头的行;

[root@manger ~]# ansible localhost -m lineinfile -a "path=/etc/sudoers regexp="^%wheel" state=absent"

范例3:替换 /etc/hosts文件中以 12.0.0.1的行为 127.0.0.1 ansible.oldxu.com

[root@manger ~]# ansible localhost -m lineinfile -a "path=/etc/hosts regex="^127\.0\.0\.1" line="127.0.0.1 ansible.oldxu.com""

范例4:修改默认 Apache的端口为 8080,使用 insertafter

[root@manger ~]# ansible localhost -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp="^Listen" line="Listen 8080" insertafter="^#Listen""

6.8 get_url模块

功能:通过互联网下载软件至被控端本地;

参数选项含义
urlHTTP, HTTPS ...资源文件在互联网上的具体位置
dest文件下载位置的绝对路径
mode文件下载后的权限
checksummd5、sha256对下载的资源进行校验
timeout10(Default)URL请求超时时间

范例1:下载互联网的软件至本地

[root@manger ~]# ansible webservers -m get_url -a "url=https://mirrors.aliyun.com/xx.rpm dest=/tmp"

范例2:下载互联网文件并进行 md5校验

[root@manger ~]# ansible webservers -m get_url -a "url=http,https dest=/opt checksum=md5:76eb3af80ffd"

6.9 systemd模块

功能:管理服务启动与停止,与 service模块用法一致;

参数选项含义
namehttpd、nginx ...定义要启动服务的名称
statestarted、stopped、restarted、reloaded指定服务状态
enabledyes、no允许服务开机自启或禁止服务开机自启

范例1:启动 Httpd服务

[root@manger ~]# ansible webservers -m service -a "name=httpd state=started"

范例2:重载 Httpd服务

[root@manger ~]# ansible webservers -m service -a "name=httpd state=reloaded"

范例3:重启 Httpd服务

[root@manger ~]# ansible webservers -m service -a "name=httpd state=restarted"

范例4:停止 Httpd服务

[root@manger ~]# ansible webservers -m service -a "name=httpd state=stopped"

范例5:启动 Httpd服务,并加入开机自启

[root@manger ~]# ansible webservers -m service -a "name=httpd state=started enabled=yes"

6.10 group模块

功能:管理被控端用户组;

参数选项含义
name指定创建的组名
gid为组设置可选gid
statepresent(Default)、absent是否将组创建在远程主机上
systemyes、no(Default)是否创建系统组

范例1:创建 news 基本组,指定uid为9999

[root@manger ~]# ansible webservers -m group -a "name=news gid=9999 state=present"

范例2:创建 http 系统组,指定uid为8888

[root@manger ~]# ansible webservers -m group -a "name=http gid=8888 system=true state=present"

范例3:删除 news 基本组

[root@manger ~]# ansible webservers -m group -a "name=news state=absent"

6.11 user模块

功能:管理被控端用户;

参数选项含义
name创建或删除的用户名
uid为用户设置可选uid
group为用户设置主要的组
groups为用户设置附加的组
shellpresent(Default)、absent为用户设置登陆时的Shell
create_homeyes(Default)、no为用户创建主目录
statepresent(Default)、absent用户是否应该存在
removeyes、no(Default)删除与用户关联的目录,只有当state=absent时生效
generate_ssh_keyyes、no(Default)为相关用户生成ssh密钥。不会覆盖现有的ssh密钥
ssh_key_bits2048创建用户ssh密钥中位数
ssh_key_file.ssh/id_rsa(Default)可以实现ssh密钥改名,或变更存放ssh密钥位置

范例1:创建 joh用户, uid1040,主要的组是 adm

[root@manger ~]# ansible webservers -m user -a "name=joh uid=1040 group=adm"

范例2:创建 joh用户,登录 shell/sbin/nologin,追加bin、sys两个组

[root@manger ~]# ansible webservers -m user -a "name=joh shell=/sbin/nologin groups=bin,sys"

范例3:创建 jsm用户,为其添加 123作为登录密码,并且创建家目录

[root@manger ~]# ansible localhost -m debug -a "msg={{ "123" | password_hash("sha512", "salt") }}"$6$salt$jkH[root@manger ~]# ansible webservers -m user -a "name=jsm password="$6$salt$jkH" create_home=yes"

范例4:示例四、移除 joh用户

[root@manger ~]# ansible webservers -m user -a "name=joh remove=yes state=absent"

范例5:创建 http用户,并为该用户创建 2048字节的私钥,存放在 ~/http/.ssh/id_rsa

[root@manger ~]# ansible webservers -m user -a "name=http uid=8888 group=8888 generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa"

6.12 cron模块

功能:管理被控端计划任务;

参数选项含义
name定时任务基本描述
job定时任务要执行的命令
minute(Default)、0-59
hour(Default)、0-23
day(Default)、1-31
month(Default)、1-12
weekday(Default)、0-6

范例1:添加定时任务,每分钟执行一次ls,* * * * * ls >/dev/null

[root@manger ~]# ansible webservers -m cron -a "name="cron01" job="ls >/dev/null""

范例2:添加定时任务,每天的凌晨2点和凌晨5点执行一次ls, 0 5,2 * * * ls >/dev/null

[root@manger ~]# ansible webserver -m cron -a "name="cron02" minute=0 hour=2,5 job="ls >/dev/null""

范例3:关闭定时任务,使定时任务失效

[root@manger ~]# ansible webservers -m cron -a "name="cron02" minute=0 hour=2,5 job="ls >/dev/null" disabled=yes"

6.13 mount模块

功能:管理被控端设备挂载;

参数选项含义
src本地或远程设备的路径
path设备挂载至本地的路径
fstypexfs、nfs...文件系统类型
optsdefaults、ro...挂载的参数
statepresent、absent、mounted、unmounted挂载的状态

环境准备:将 ansible作为 nfs服务端, 172.16.1.7、172.16.1.8 作为 nfs客户端挂载;

# ansible localhost -m yum -a "name=nfs-utils state=present"# ansible localhost -m file -a "path=/ops state=directory"# ansible localhost -m copy -a "content="/ops 172.16.1.0/24(rw,sync)" dest=/etc/exports"# ansible localhost -m service -a "name=nfs state=restarted"

范例1:挂载 nfs至本地的 /opt目录,并实现开机自动挂载

[root@manger ~]# ansible webservers -m mount -a "src=172.16.1.61:/ops path=/opt fstype=nfs opts=defaults state=mounted"

范例2:临时卸载 nfs的挂载,但不清理 /etc/fstab

[root@manger ~]# ansible webservers -m mount -a "src=172.16.1.61:/ops path=/opt fstype=nfs opts=defaults state=unmounted"

范例3:永久卸载 nfs挂载,同时清理 /etc/fstab

[root@manger ~]# ansible webservers -m mount -a "src=172.16.1.61:/ops path=/opt fstype=nfs opts=defaults state=absent"

6.14 hostname模块

功能:管理被控端主机名称;

范例:设置主机名称为 ansible-hostname

[root@manger ~]# ansible localhost -m hostname -a "name=ansible-hostname"

6.15 archive模块

功能:打包与压缩;

参数选项含义
path要压缩的文件或目录
dest压缩后的文件
formatbz2、gz、tar、xz、zip指定打包压缩的类型

范例:将 /var/log目录压缩为 tar格式,并存储至 /opt目录下;

[root@manger ~]# ansible localhost -m archive -a "path=/var/log dest=/opt/log.tar.gz format=gz"

6.16 unarchive模块

功能:解包与解压缩;

参数选项含义
src要解压的软件包路径
dest解压到目标位置
remote_srcyes、no(default)yes:要解压的包在被控端、no:要解压的包在控制端

范例1:解压控制端的包至被控端;

[root@manger ~]# ansible localhost -m unarchive -a "src=/root/php.zip dest=/tmp/"

范例2:解压被制端的包至被控端;

[root@manger ~]# ansible localhost -m unarchive -a "src=/log.tar.gz dest=/tmp/ remote_src=yes"

6.17 selinux模块

功能:管理 SELINUX 防火墙;

参数选项含义
stateenforcing、permissive、disabledSelinux模式

范例1:设置 selinuxenforcing

[root@manger ~]# ansible webservers -m selinux -a "state=enforcing"

范例2:设置 selinuxdisabled

[root@manger ~]# ansible webservers -m selinux -a "state=disabled"

6.18 firewalld模块

功能:管理 firewalld 防火墙;

参数选项含义
servicehttp、https ...添加或删除firewalld中的服务名称
port80、443...添加或删除firewalld中的端口范围
masqueradeyes、no启用或禁止防火墙的地址伪装
immediateyes、no(Default)防火墙规则当前是否立即生效
permanentyes、no防火墙规则当前是否重启后也生效
stateenabled、disabled启用或禁用当前配置的规则
rich_rule在防火墙中添加或删除富规则
source添加或删除防火墙源IP网络
zonepublic(Default)、home ...指定防火墙区域

范例1:放行 http服务流量,设定临时与永久生效;

[root@manger ~]# ansible webservers -m firewalld -a "service=http immediate=yes permanent=yes state=enabled"

范例2:放行 tcp/8080-8090端口,设定临时与永久生效;

[root@manger ~]# ansible webservers -m firewalld -a "port=8080-8090/tcp immediate=yes permanent=yes state=enabled"

6.19 iptables模块

功能:管理 iptables 代理过滤防火墙;

iptables常用参数:

参数含义
table
chain
source来源IP
destination目标IP
destination_port目标端口
protocol协议
jump:DROP动作
action如何添加规则
insert插入
append追加

范例1:来源IP是192.168.1.1目标地址 1.1.1.1目标端口 80协议 tcp则拒绝;规则要写入第一行;

[root@manger ~]# ansible webservers -m iptables -a "table=filter chain=INPUT source=192.168.1.1/32 destination=1.1.1.1 destination_port=80 protocol=tcp jump=DROP action=insert"

范例2:NAT:DNAT和SNAT:

DNAT:如果请求1.1.1:80端口,则DNAT到2.2.2.2:8800ansible webservers -m iptables -a "table=nat chain=PREROUTING protocol=tcp destination=1.1.1.1 destination_port=80 jump=DNAT to_destination="2.2.2.2:8800""如果请求1.1.1:81端口,则DNAT到3.3.3.3:8800ansible webservers -m iptables -a "table=nat chain=PREROUTING protocol=tcp destination=1.1.1.1 destination_port=81 jump=DNAT to_destination="3.3.3.3:8800""SNAT:POSTROUTINGiptables -t nat -I POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 5.5.5.5ansible webservers -m iptables -a "table=nat chain=POSTROUTING source=172.16.2.0/24 jump=SNAT to_source=6.6.6.6"ansible webservers -m iptables -a "table=nat chain=POSTROUTING source=172.16.3.0/24 jump=SNAT to_source=7.7.7.7 action=insert"

参数很多,具体参见官方文档

https://docs.ansible.com/ansible/2.9/modules/iptables_module.html#iptables-module

关键词: