Ansible快速入门(下)
6. Ansible常用模块
ansible 有着诸多的模块,虽然模块众多,但最为常用的模块也就 20-30 个左右;
6.1 command模块
功能:在远程主机执行 Shell 命令;此为默认模块,可忽略 -m 选项;
注意:不支持管道命令 |
参数 | 选项 | 含义 |
---|---|---|
chdir | chdir /opt | 执行ansible时,切换到指定的目录 |
creates | creates /data/file | 如果文件存在,则跳过执行 |
removes | removes /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=4163<UP,BROADCAST,RUNNING,MULTICAST>
mtu 1500
inet 10.0.0.6 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80:20c:29ff:fe2a:348 prefixlen 64 scopeid 0x20<link>
ether 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 0
TX packets 17274 bytes 1957911 (1.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
6.2 shell模块
功能:在远程主机执行 Shell 命令,执行管道等特殊符号的操作;
参数 | 选项 | 含义 |
---|---|---|
chdir | chdir /opt | 执行ansible时,切换到指定的目录 |
creates | creates /data/file | 如果文件存在,则跳过执行 |
removes | removes /data/file | 如果文件存在,则执行 |
范例1:使用 Shell 命令过滤被控端主机的 IP 地址;
[root@manger ~]# ansible localhost -m shell -a "ifconfig eth0|awk 'NR==2' "
[WARNING]: No inventory was parsed, only implicit
localhost is available
localhost | 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模块
功能:管理各个操作系统的软件包;
参数 | 选项 | 含义 |
---|---|---|
name | httpd、nginx ... | 指定安装软件包名或软件包URL |
state | present(Defaults)、absent、latest | 指定yum对应的方法 |
enablerepo | epel、base ... | 允许从哪些仓库获取软件 |
disablerepo | epel、base ... | 禁止从哪些仓库获取软件 |
exclude | kernel ... | 排除某些软件包 |
download_only | yes、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 | 文件复制到远程的绝对路径 | |
owner | root(Defaults) | 文件复制到远程并设定属主 |
group | root(Defaults) | 文件复制到远程并设定属组 |
mode | file=644,directory=755 | 文件复制到远程并设定权限 |
backup | yes | 备份被修改前的配置文件 |
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 | 递归方式(可以是递归授权) | |
state | touch、directory、link、absent | 文件复制到远程的状态 |
owner | root(Defaults) | 文件复制到远程并设定属组 |
group | root(Defaults) | 备份被修改前的配置文件 |
mode | file=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 | 将文本插入到“指定的行”之前 | |
state | absent、present(Defaults) | 删除对应的文本时,需要state=absent |
backrefs | yes、no | 1.支持后向引用 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模块
功能:通过互联网下载软件至被控端本地;
参数 | 选项 | 含义 |
---|---|---|
url | HTTP, HTTPS ... | 资源文件在互联网上的具体位置 |
dest | 文件下载位置的绝对路径 | |
mode | 文件下载后的权限 | |
checksum | md5、sha256 | 对下载的资源进行校验 |
timeout | 10(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 模块用法一致;
参数 | 选项 | 含义 |
---|---|---|
name | httpd、nginx ... | 定义要启动服务的名称 |
state | started、stopped、restarted、reloaded | 指定服务状态 |
enabled | yes、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 | |
state | present(Default)、absent | 是否将组创建在远程主机上 |
system | yes、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 | 为用户设置附加的组 | |
shell | present(Default)、absent | 为用户设置登陆时的Shell |
create_home | yes(Default)、no | 为用户创建主目录 |
state | present(Default)、absent | 用户是否应该存在 |
remove | yes、no(Default) | 删除与用户关联的目录,只有当state=absent时生效 |
generate_ssh_key | yes、no(Default) | 为相关用户生成ssh密钥。不会覆盖现有的ssh密钥 |
ssh_key_bits | 2048 | 创建用户ssh密钥中位数 |
ssh_key_file | .ssh/id_rsa(Default) | 可以实现ssh密钥改名,或变更存放ssh密钥位置 |
范例1:创建 joh 用户, uid 是 1040 ,主要的组是 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 | 设备挂载至本地的路径 | |
fstype | xfs、nfs... | 文件系统类型 |
opts | defaults、ro... | 挂载的参数 |
state | present、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 | 压缩后的文件 | |
format | bz2、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_src | yes、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 防火墙;
参数 | 选项 | 含义 |
---|---|---|
state | enforcing、permissive、disabled | Selinux模式 |
范例1:设置 selinux 为 enforcing
[root@manger ~]# ansible webservers -m selinux -a "state=enforcing"
范例2:设置 selinux 为 disabled
[root@manger ~]# ansible webservers -m selinux -a "state=disabled"
6.18 firewalld模块
功能:管理 firewalld 防火墙;
参数 | 选项 | 含义 |
---|---|---|
service | http、https ... | 添加或删除firewalld中的服务名称 |
port | 80、443... | 添加或删除firewalld中的端口范围 |
masquerade | yes、no | 启用或禁止防火墙的地址伪装 |
immediate | yes、no(Default) | 防火墙规则当前是否立即生效 |
permanent | yes、no | 防火墙规则当前是否重启后也生效 |
state | enabled、disabled | 启用或禁用当前配置的规则 |
rich_rule | 在防火墙中添加或删除富规则 | |
source | 添加或删除防火墙源IP网络 | |
zone | public(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:8800
ansible 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:8800
ansible 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:
POSTROUTING
iptables -t nat -I POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 5.5.5.5
ansible 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