简介
前面说过ansible使用过程中无非是通过ansible AD-Hoc的指令,或者是执行ansible -playbook预先编写的配置文件,但是归根结底就是操作各个模块来实现我们想要的功能,因此了解和学习相应的ansible模块是必然的。
根据官方的分类,将模块按功能分类为:云模块、命令模块、数据库模块、文件模块、资产模块、消息模块、监控模块、网络模块、通知模块、包管理模块、源码控制模块、系统模块、单元模块、web设施模块、windows模块 ,具体可以参看官方页面。官方文档。下面我们就说些常用的模块。
常用模块
1. command模块
在远程主机上执行shell命令,此为默认模块,可以忽略-m选项,(不支持管道 | )
参数 | 选项 | 含义 |
chdir | chdir /opt | 执行ansible切换到指定目录 |
creates | creates=/data/file | 如果文件存在,则跳过执行 |
removes | removes=/data/file | 如果文件存在则执行删除 |
示例1:chdir切换目录执行shell命令;
[root@clinet test1]# ansible web -m command -a 'chdir=/home/uos pwd'
10.10.10.134 | CHANGED | rc=0 >>
/home/uos
10.10.10.135 | CHANGED | rc=0 >>
/home/uos
[root@clinet test1]#
示例2:creates,如果/opt/file1 文件存在则跳过后面的命令,不执行。
##134上存在/opt/file1 文件
[root@clinet test1]# ansible web -m command -a 'creates=/opt/file1 chdir=/home/uos pwd'
10.10.10.134 | SUCCESS | rc=0 >>
skipped, since /opt/file1 exists
10.10.10.135 | CHANGED | rc=0 >>
/home/uos
[root@clinet test1]#
示例3:removes,如果/opt/file1 文件存在,则执行后端命令
##134上存在/opt/file1 文件
[root@clinet test1]# ansible web -m command -a 'removes=/opt/file1 chdir=/home/uos pwd'
10.10.10.135 | SUCCESS | rc=0 >>
skipped, since /opt/file1 does not exist
10.10.10.134 | CHANGED | rc=0 >>
/home/uos
[root@clinet test1]#
2. shell模块
功能:在远程主机上执行shell命令,支持管道等特殊符号的操作。
参数 | 选项 | 含义 |
chdir | chdir=/opt | 执行ansible的时候切换到指定目录 |
creates | cteates=/opt/file1 | 文件存在则跳过执行 |
removes | removes=/opt/file | 文件存在,则执行 |
示例1: 通过shell命令过滤被控端主机的ip地址
[root@clinet test1]# ansible web -m shell -a "ifconfig ens33 |awk 'NR==2'"
10.10.10.134 | CHANGED | rc=0 >>
inet 10.10.10.134 netmask 255.255.255.0 broadcast 10.10.10.255
10.10.10.135 | CHANGED | rc=0 >>
inet 10.10.10.135 netmask 255.255.255.0 broadcast 10.10.10.255
[root@clinet test1]#
3. script模块
功能:在被控节点,运行ansible主机的脚本
示例1:在ansible主机上编写xhz.sh脚本,然后推送至被控端进行执行。
root@clinet test1]# ansible web -m script -a './xhz.sh'
10.10.10.135 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 10.10.10.135 closed.\r\n",
"stderr_lines": [
"Shared connection to 10.10.10.135 closed."
],
"stdout": "total 0\r\n",
"stdout_lines": [
"total 0"
]
}
10.10.10.134 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 10.10.10.134 closed.\r\n",
"stderr_lines": [
"Shared connection to 10.10.10.134 closed."
],
"stdout": "total 0\r\n",
"stdout_lines": [
"total 0"
]
}
[root@clinet test1]#
4. yum模块
功能:管理操作系统的软件包
参数 | 选项 | 含义 |
name | httpd,nginx.... | 指定软件包的名称或URL |
state | present(默认,安装软件),absent(卸载软件) | 指定yum对应的方法 |
enablerepo | epel,base.... | 运行从哪些仓库获取软件 |
diablerepo | epel,base | 禁止从哪些仓库获取软件 |
exclude | kernel | 排除某些软件包 |
download_only | yes,no | 仅下载软件包,不安装 |
示例1:安装当前最新的nginx软件,已经安装则不会再安装。
[root@clinet test1]# ansible web -m yum -a 'name=nginx state=present'
示例2:安装最新的apache软件,指定使用epel源安装
[root@clinet test1]# ansible web -m yum -a 'name=nginx state=present enablerepo=epel'
示例3:通过公网URL安装rpm软件
[root@clinet test1]# ansible web -m yum -a 'name=https://xxxx.rpm state=present'
示例4:更新apache软件,存在新版本才会更新
[root@clinet test1]# ansible web -m yum -a 'name=httpd state=latest'
示例5:更新所有的软件包,内核包除外。
[root@clinet test1]# ansible web -m yum -a 'name=httpd state=latest exclude=kernel'
示例6:卸载apache软件
[root@clinet test1]# ansible web -m yum -a 'name=httpd state=absent'
5. copy模块
功能:从ansible主控端复制文件到远程主机
参数 | 选项 | 含义 |
src | 复制本地目下的文件到远程主机 | |
dest | 文件复制到远程主机的绝对路径 | |
owner | root(default) | 文件复制到远程主机并设置属主 |
group | root(default) | 文件复制到远程主机设置属组 |
mode | file=644,directory=755 | 文件复制到远程主机,并设置权限 |
backup | yes | 备份被修改前的配置文件 |
content | 新建文件并给文件添加内容 |
示例1:将本地的index.html文件推送到远程主机
[root@clinet test1]# ansible web -m copy -a 'src=./index.html dest=/usr/share/nginx/html owner=root group=root mode=644'
示例2:往文件中写内容,,远程主机上有该同名文件就先备份,没有的话就直接创建(content参数不能和src同时使用,且dest不能为目录)
ansible web -m copy -a 'dest=/usr/share/nginx/html/index.html owner=root group=root mode=644 backup=yes content="xhz123"'
6. file模块
功能:为被控端创建文件或目录,设定权限属性
参数 | 选项 | 含义 |
path | 指定远程主机的路径 | |
recurse | yes | 递归方式,可以批量授权 |
state | touch,directory,link,absent | touch:创建文件 directory:创建目录 link:软连接 absent:删除 |
owner | root(defult) | 远程主机创建文件或目录的属主 |
group | root(default) | 远程主建创建文件或目录的属组 |
mode | file=644,directory=755 | 设定权限 |
示例1:创建文件,并设定属主,属组和权限
ansible web -m file -a 'path=/tmp/foot.txt state=touch owner=uos group=uos mode=777'
示例2:创建目录,并设定属主,属组和权限
##在多级目录下创建目录或者文件的时候,只要前几级目录不存在,就会递归创建,同时权限与设置的一样
ansible web -m file -a 'path=/tmp/xhz/ansible state=directory owner=uos group=uos mode=755'
示例3:递归修改权限。
ansible web -m file -a 'path=/tmp/xhz state=directory owner=uos group=uos mode=777 recurse=yes'
示例4:创建连接,并设定属主,属组和权限
ansible web -m file -a 'src=/root/xhz dest=/tmp/xhz/ansible/flf state=link owner=uos group=uos'
7. lineinfile模块
功能:修改或删除文件内容,与sed命令类似。
参数 | 选项 | 含义 |
path | 指定要操作的文件 | |
regexp | 使用正则表达式匹配对应的行 | |
line | 修改为新的内容 | |
insertafter | 将文本插入到指定行之后 | |
insertbefore | 将文本插入到指定行之前 | |
state | absent,present(default) | 删除指定的文本时,state=absent |
backrefs | yes,no | 支持后向引用,当未匹配到内容时候,则不操作文件 |
backup | yes,no | 操作文件前是否备份 |
create | yes。no | 当文件不存在时,是否创建 |
示例1:将selinux修改为disabled状态
ansible web -m lineinfile -a 'path=/etc/selinux/config line=SELINUX=disabled regexp="^SEKINUX=" backup=yes backrefs=yes'
示例2:删除/etc/selinux/config文件中以#开头的行
ansible web -m lineinfile -a 'path=/etc/selinux/config state=absent regexp="^#" backup=yes backrefs=yes'
示例3:替换/etc/hosts文件中以127.0.0.1的行为 127.0.0.1 route.xhz.com
ansible 10.10.10.134 -m lineinfile -a 'path=/etc/hosts regexp="^127\.0\.0\.1" line="127.0.0.1 route.xhz.com" backup=yes backrefs=yes'
示例4:在/etc/resolv.conf 文件中添加114.114.114.114的DNS
ansible web -m lineinfile -a 'path=/etc/resolv.conf insertafter="^nameserver 10.10.10.2$" line="nameserver 114.114.114.114" backup=yes'
8. get_url模块
功能:通过互联网下载软件至被控端本地
参数 | 选项 | 含义 |
url | http,https | 资源文件在互联网的具体位置 |
dest | 文件下载保存位置的绝对路径 | |
mode | 文件下载后的权限 | |
checksum | md5,sha256 | 对下载资源进行校验 |
timeout | 10(default) | url请求超时时间 |
示例1:下载互联网的包到本地
ansible web -m get_url -a 'url="https://cdimage.uniontech.com/device/iso-tailor_2.1.6-1_all.deb" dest=/tmp mode=755 timeout=15'
示例2:下载互联网的包到本地,并进行校验
ansible web -m get_url -a 'url="https://cdimage.uniontech.com/device/iso-tailor_2.1.6-1_all.deb" dest=/tmp mode=755 timeout=15 checksum=md5:a68aa1e0eec9da42005732d354a30cf0'
9. systemd模块
功能:管理服务启动和停止,与service模块用法一致。
参数 | 选项 | 含义 |
name | https,nginx.... | 指定服务名称 |
state | started:启动 stopped:停止 restarted:重启 reloaded:重置 | |
enabled | yes,no | 允许服务是否开机自启 |
示例1: 启动nginx服务,并设置开机自启
ansible web -m systemd -a 'name=nginx state=started enabled=yes'
10. group模块
功能:管理被控端的用户组
参数 | 选项 | 含义 |
name | 指定创建的组名 | |
gid | 为组设置可选gid | |
state | present(default):创建组, absent:删除组 | 是否在远程主机上创建组 |
system | yes,no(default) | 是否创建系统组 |
示例1:创建news组,组id设置为999
ansible web -m group -a 'name=news gid=9999 state=present'
示例2:删除news组
ansible web -m group -a 'name=news state=absent'
11. user模块
功能:管理被控端用户
参数 | 选项 | 含义 |
name | 创建或删除的用户名 | |
udi | 为用户设置uid | |
group | 为用户设置属组 | |
groups | 为用户设置附加组 | |
shell | 为用户设置登录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 key文件名,当文件路径为相对路径时,默认为家目录,可以指定为绝对路径来指定保存位置 |
示例1:创建joh用户,uid为1040,属组为adm
ansible web -m user -a 'name=joh uid=1040 group=adm'
示例2:创建lisa用户,shell为/sbin/nologin,添加两个附加组bin,sys
ansible web -m user -a 'name=lisa state=present shell=/sbin/nologin groups=bin,sys'
示例3:创建jsm用户,为其添加123作为登录密码,并创建家目录
ansible web -m user -a 'name=jsm state=present password=jsDCEOEt1Y6CQ'
注意:
这里的password的参数是进行加密后的,在ansible中,使用user创建用户不可以使用明文密码。
推荐加密方式:(使用python普通加密)
import crypt
crypt.crypt('123','456') ##123为密码,456为加盐字符串
示例4:删除用户
ansible web -m user -a 'name=jsm state=absent remove=yes'
12. cron模块
功能:管理被控端计划任务。
参数 | 选项 | 含义 |
name | 定时任务基本描述 | |
job | 定时任务执行的命令 | |
minute | (Default)0-99 | 分,默认为* |
hour | (default)0-13 | 时,默认为* |
day | (default)1-31 | 日,默认为* |
month | (default)1-12 | 月,默认为* |
weekday | (default)0-6 | 周,默认为* |
示例1:添加定时任务,每分钟执行一次 * * * * * ls -l >> /tmp/ls.txt
ansible web -m cron -a 'name=cron01 job="ls -l >> /tmp/ls.txt"'
示例2:添加定时任务,每天凌晨2点和5点执行一次 * 2,5 * * * ls -l >> /tmp/ls.txt
ansible web -m cron -a 'name=cron01 job="ls -l >> /tmp/ls.txt" minute=0 hour=2,5'
示例3:取消任务
ansible web -m cron -a 'name=cron01 job="ls -l >> /tmp/ls.txt" minute=0 hour=2,5 disabled=yes'
13. mount模块
功能:管理被控端的挂载设备。
参数 | 选项 | 含义 |
src | 远程主机共享目录 | |
path | 本地挂载的路径 | |
fstype | xfs,nfs.... | 文件系统类型 |
opts | defaults,ro.... | 挂参数载iazaug |
state | present,absent,mounted,unmounted | 挂载状态 |
示例1:将10.10.10.136上的nfs共享目录,挂载到10.10.10.134的/data目录上,并实现开机自动挂载。
ansible 10.10.10.134 -m mount -a 'src=10.10.10.136:/data/xhz path=/data fstype=nfs opts=defaults state=mounted'
[root@route data]#
[root@route data]#
[root@route data]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 899M 0 899M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 9.6M 901M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 39G 2.7G 36G 7% /
/dev/sda1 xfs 1014M 183M 832M 18% /boot
/dev/mapper/centos-home xfs 19G 33M 19G 1% /home
tmpfs tmpfs 182M 0 182M 0% /run/user/0
10.10.10.136:/data/xhz nfs4 39G 2.6G 36G 7% /data
[root@route data]#
[root@route data]#
[root@route data]# cat /etc/fstab
10.10.10.136:/data/xhz /data nfs defaults 0 0
[root@route data]#
实例2:临时卸载nfs的共享目录,但是不清理/etc/fstab
ansible 10.10.10.135 -m mount -a 'src=10.10.10.136:/data/xhz path=/data fstype=nfs opts=defaults state=unmounted'
示例3:永久卸载nfs共享目录,清理/etc/fstab
ansible 10.10.10.135 -m mount -a 'src=10.10.10.136:/data/xhz path=/data fstype=nfs opts=defaults state=absent'
注意:
state的几种状态:
present:不挂载,检查nfs的联通性。
mounted:挂载,并写入/etc/fstab
unmounted:临时卸载,不清理/etc/fstab
absent:永久卸载,清理/etc/fstab
14:. hostname模块
功能:管理被控端的主机名
示例1:设置主机名为route.xhz.com
ansible 10.10.10.134 -m hostname -a 'name=route.xhz.com'
15. archive模块
功能:打包与压缩
参数 | 选项 | 含义 |
path | 要压缩的文件或目录 | |
dest | 压缩后的文件 | |
format | bz2,gz,tar,xz,zip | 指定打包压缩的格式 |
示例1:将/var/log压缩为gz格式后保存在/tmp目录下
ansible 10.10.10.134 -m archive -a 'path=/var/log dest=/tmp/log.tar.gz format=gz'
##其他格式
ansible 10.10.10.134 -m archive -a 'path=/var/log dest=/tmp/log.zip format=zip'
ansible 10.10.10.134 -m archive -a 'path=/var/log dest=/tmp/log.tar format=tar'
ansible 10.10.10.134 -m archive -a 'path=/var/log dest=/tmp/log.tar.bz2 format=bz2'
16. unarcive模块
功能:解压缩
参数 | 选项 | 含义 |
src | 压缩包所在的路径 | |
dest | 解压到指定位置 | |
remote_src | yes,no(默认) | yes:要解压的包在被控端 no:要解压的包在控制端 |
示例1: 解压被控端/tmp/log.zip文件,解压到/data目录(zip文件需要在被控端)
ansible 10.10.10.134 -m unarchive -a 'src=/tmp/log.zip dest=/data remote_src=yes'
示例2:解压控制端/data/log.tar.gz文件,解压到被控端的/data下面(tar.gz在控制端)
ansible 10.10.10.134 -m unarchive -a 'src=/data/log.tar.gz dest=/data remote_src=no'
17. selinux模块
功能:管理selinux防火墙
参数 | 选项 | 含义 |
state | enforcing,permissive,disabled |
示例1:设置selinux为enforcing
ansible web -m selinux -a 'state=enforcing'
结束语:
ansible的模块有上百个,上面我们只说了极小部分常用的模块,更多模块使用可以查看官网的详细信息。模块的理解和使用时必然的,这将为我们后面ansible-playbook的编写打下夯实的基础。