RHCE9学习指南 第28章 常用模块的使用
ansible的基本用法如下。
ansible 机器名 -m 模块x -a "模块的参数"
对被管理机器执行不同的操作,只需要调用不同的模块就可以了。ansible中内置了很多的模块,可以通过ansible-doc -l查看系统中所有的模块,也可以用ansible-navigator doc -l命令进行查看。
[lduan@server ~]$ ansible-doc -l
a10_server Manage A10 Networks AX/Soft...
a10_server_axapi3 Manage A10 Networks AX/Soft...
a10_service_group Manage A10 Networks AX/Soft...
....输出...
按【Enter】键会一行一行地往下显示模块,按空格键会一页一页地往下显示,按【q】键退出。
avi_authprofile Module for setup of AuthPro...
[lduan@server ~]$
不同的模块参数也是不一样的,如果要查看某个模块的参数可以通过如下语法查看。
ansible-doc 模块名
ansible中有很多的模块,每个模块也有很多的参数,我们是不可能把所有的模块、每个模块的所有参数都掌握的。所以,下面我们只讲解最常见的模块及这些模块最常见的参数的使用。
模块1:shell模块
shell模块可以在远端执行操作系统命令,具体用法如下。
ansible 主机组 -m shell -a "系统命令"
练习1:
在server2上执行命令hostname,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "hostname"
server2 | CHANGED | rc=0 >>
server2.rhce.cc
[lduan@server ~]$
这里rc=0意思是执行此命令之后的返回值为0,rc的意思是returncode返回值,为0说明正确执行了,非零说明没有正确执行。
练习2:
在server2上执行一个错误的命令,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "hostnamexx"
server2 | FAILED | rc=127 >>
/bin/sh:行1: hostnamexx:未找到命令non-zero return code
[lduan@server ~]$
这里rc=127意思是执行此命令之后的返回值为127,非零说明没有正确执行。
模块2:文件管理的file模块
file模块用于创建删除文件/目录,修改文件/目录属性,其常见选项包括以下几种。
(1)path:用于指定文件/目录的路径,此选项可以用name或dest替代。
(2)state:指定行为。
(3)touch:创建文件touch。
(4)directory:创建目录directory。
(5)file:对已存文件进行修改。
(6)absent:删除。
(7)link:软连接。
(8)hard:硬链接。
(9)其他选项:owner指定所有者,group指定所属组,mode指定权限,setype指定上下文。
练习1:
在server2上创建一个文件/opt/hosts,并设置所有者为root,所属组tom,权限为444,命令如下。
[lduan@server ~]$ ansible server2 -m file -a "path=/opt/hosts owner=root group=tom mode=444 state=touch"
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
需要注意的是,此处用path指定的文件,替换成name也是可以的,即name=/opt/hosts。
查看文件属性,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "ls -l /opt/hosts"
server2 | CHANGED | rc=0 >>
-r--r--r--. 1 root tom 63 7月 28 11:24 /opt/hosts
[lduan@server ~]$
练习2:
为/opt/hosts创建一个软连接 /opt/hosts.123,命令如下。
[lduan@server ~]$ ansible server2 -m file -a "src=/opt/hosts dest=/opt/hosts123 state=link"
server2 | CHANGED => {
...输出...
[lduan@server ~]$
验证:
[lduan@server ~]$ ansible server2 -m shell -a "ls -l /opt/"
server2 | CHANGED | rc=0 >>
...输出...
lrwxrwxrwx. 1 root root 10 7月 28 11:46 hosts123 -> /opt/hosts
[lduan@server ~]$
练习3:
删除/opt/hosts123,命令如下。
[lduan@server ~]$ ansible server2 -m file -a 'name=/opt/hosts123 state=absent'
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
练习4:
创建目录/op/xx,上下文设置为default_t,命令如下。
[lduan@server ~]$ ansible server2 -m file -a 'name=/opt/xx state=directory setype=default_t'
...输出...
}
[lduan@server ~]$
修改权限及属主数组等。
练习5:
把/opt/hosts的权限改成000,把所有者改成tom,所属组改成users,命令如下。
[lduan@server ~]$ ansible server2 -m file -a "name=/opt/hosts owner=tom group=users mode=000"
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
验证结果:
[lduan@server ~]$ ansible server2 -m shell -a "ls -l /opt/hosts"
server2 | CHANGED | rc=0 >>
----------. 1 tom users 63 7月 28 11:24 /opt/hosts
[lduan@server ~]$
注意:指定文件时用name或path都是可以的。
清空server2上/opt中所有的内容,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "rm -rf /opt/*"
server2 | CHANGED | rc=0 >>
[lduan@server ~]$
模块3:copy和fetch模块
copy用于把本地的文件拷贝到被管理机器。语法如下。
ansible 主机组 -m copy -a “src=/path1/file1 dest=path2/”
作用是把本地/path1/file1拷贝到目的主机的/path2中。
copy模块能用到的常见参数包括以下几种。
(1)src:源文件。
(2)dest:目的地,即拷贝到哪里。
(3)owner:所有者。
(4)group:所属组。
(5)mode:权限。
练习1:
把本地文件/etc/ansible/hosts拷贝到 目标机器/opt目录下,并设置权限为000,所有者为tom,命令如下。
[lduan@server ~]$ ansible server2 -m copy -a "src=/etc/ansible/hosts mode=000 owner=tom dest=/opt"
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
验证,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "ls -l /opt/hosts"
server2 | CHANGED | rc=0 >>
----------. 1 tom root 1016 7月 28 12:10 /opt/hosts
[lduan@server ~]$
copy模块也可以利用content参数往某个文件中写内容,如果此文件不存在则会创建出来。
练习2:
在被管理机器的/opt目录中,创建11.txt,内容为123123,命令如下。
[lduan@server ~]$ ansible server2 -m copy -a 'content="123123" dest=/opt/11.txt'
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
验证:/opt/11.txt的内容,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "cat /opt/11.txt"
server2 | CHANGED | rc=0 >>
123123
[lduan@server ~]$
fetch用于把文件从被管理机器拷贝到本机当前目录,命令如下。
[lduan@server ~]$ ansible server2 -m fetch -a "src=/opt/hosts dest=."
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
查看,命令如下。
[lduan@server ~]$ tree server2/
server2/
└── opt
└── hosts
1 directory, 1 file
[lduan@server ~]$
当使用fetch拷贝远端目录到本地时,会在本地创建一个和远端主机同名的目录,用于存放拷贝的文件。
模块4:yum_repository模块
利用yum_repository设置yum源,一个标准的repo配置文件如下所示。
[aa]
name=aa
baseurl=ftp://192.168.26.101/dvd/AppStream
enabled=1
gpgcheck=1
gpgkey=ftp://192.168.26.101/dvd/RPM-GPG-KEY-redhat-release
其中[]中的名称用于区分不同的yum源。
name:此yum源的描述信息。
baseurl:用于指定yum源的具体地址。
enabled:用于指定是否启用此yum源。
gpgcheck:用于指定在安装软件包时,是否要进行数字签名的验证,一般设置为0即可。
gpgkey:在gpgcheck设置为1的情况下,用于指定公钥的位置。
对于模块yum_repository来说,常见的选项包括以下几种。
name:repo配置文件里[]中的名称。
description:repo配置文件里name字段的描述信息。
baseurl:指定yum源的位置。
enabled:是否启用源,值为true或false。
gpgcheck:是否启用数字签名验证,值为true或false。
gpgkey:用于指定公钥的位置。
还可以通过file选项指定生成repo文件的名字。
练习:
给server2配置yum源,地址是ftp://192.168.26.101/dvd/AppStream,所需要的密钥文件的为ftp://192.168.26.6/dvd/RPM-GPG-KEY-redhat-release,命令如下。
[lduan@server ~]$ ansible server2 -m yum_repository -a "name=app description='this is appsream' baseurl=ftp://192.168.26.101/dvd/AppStream gpgcheck=yes gpgkey=ftp://192.168.26.101/dvd/RPM-GPG-KEY-redhat-release"
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
执行之后的效果如下。
[lduan@server ~]$ ansible server2 -m shell -a "ls /etc/yum.repos.d/"
server2 | CHANGED | rc=0 >>
app.repo
[lduan@server ~]$
[lduan@server ~]$ ansible server2 -m shell -a "cat /etc/yum.repos.d/app.repo"
server2 | CHANGED | rc=0 >>
[app]
baseurl = ftp://192.168.26.101/dvd/AppStream
gpgcheck = 1
gpgkey = ftp://192.168.26.101/dvd/RPM-GPG-KEY-redhat-release
name = this is appsream
[lduan@server ~]$
给server2配置第二个yum源,地址是ftp://192.168.26.101/dvd/BaseOS,所需要的密钥文件的为ftp://192.168.26.6/dvd/RPM-GPG-KEY-redhat-release,命令如下。
[lduan@server ~]$ ansible server2 -m yum_repository -a "name=baseos description='this is baseos' baseurl=ftp://192.168.26.101/dvd/BaseOS gpgcheck=no file=baseos"
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
这里gpgcheck设置为了no,所以不需要写gpgkey选项了,这里同时使用了file指定了生成的repo文件为baseos。
查看server2上的目录/etc/yum.repos.d/里有哪些文件。
[lduan@server ~]$ ansible server2 -m shell -a "ls /etc/yum.repos.d/"
server2 | CHANGED | rc=0 >>
app.repo
baseos.repo
redhat.repo
[lduan@server ~]$
可以看到这里有一个文件爱你baseos.repo,这名字的前缀baseos就是通过file指定出来的。
模块5:使用yum模块管理软件包
yum模块常见的参数包括以下几种。
(1)name:用于指定软件包的名称
(2)state:有以下常见的值
①present或installed:用于安装软件包,没有指定state时的默认值就是installed。
②absent或removed:用于卸载软件包。
③latest:用于更新。
注意:yum模块可以用package模块替代,用于在Ubuntu等其他系统上管理软件包。
练习1:
在server2上安装vsftpd,命令如下。
[lduan@server ~]$ ansible server2 -m yum -a "name=vsftpd state=installed"
server2 | CHANGED => {
...输出..
}
[lduan@server ~]$
验证,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "rpm -qa | grep vsftpd"
server2 | CHANGED | rc=0 >>
vsftpd-3.0.3-49.el9.x86_64
[lduan@server ~]$
练习2:
在server2上卸载vsftpd,命令如下。
[lduan@server ~]$ ansible server2 -m yum -a "name=vsftpd state=absent"
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
如果本机没有安装vsftpd,下面的命令就是安装,如果已经安装则更新到最新版。
ansible server2 -m yum -a "name=vsftpd state=latest"
如果要安装组或模块,需要在组名或模块名前加@,这个模块要使用引号引起来。
练习3:
安装 RPM 开发工具,命令如下。
[lduan@server ~]$ ansible server2 -m yum -a "name='@RPM 开发工具' state=installed"
server2 | CHANGED => {
...输出...
[lduan@server ~]$
模块6:使用service模块管理服务
可以通过systemctl对服务进行启动、重启、停止等操作,在ansible中可以调用service模块来实现对服务的管理,service模块常见的参数包括以下几种。
(1)name:指定对哪个服务进行管理
(2)enabled:用于设置此服务是否开机自动启动,值为yes或no,默认值为空
(3)state:用于启动或关闭服务,其值包括started、stopped、restarted等
首先判断server2上的vsftpd是否启动,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "systemctl is-active vsftpd"
server2 | FAILED | rc=3 >>
inactivenon-zero return code
[lduan@server ~]$
这里返回值为3(rc=3),说明server2上vsftpd没启动。
练习1:
启动vsftpd并设置开机自动启动,命令如下。
[lduan@server ~]$ ansible server2 -m service -a "name=vsftpd state=started enabled=yes"
server2 | CHANGED => {
...输出...
[lduan@server ~]$
验证,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "systemctl is-active vsftpd ; systemctl is-enabled vsftpd"
server2 | CHANGED | rc=0 >>
active
enabled
[lduan@server ~]$
或者到server2上验证,命令如下。
[root@server2 ~]# systemctl is-active vsftpd
active
[root@server2 ~]# systemctl is-enabled vsftpd
enabled
[root@server2 ~]#
模块7:使用parted对硬盘分区
ansible中如果对分区进行管理,使用的是parted模块,parted常用的参数包括以下几种。
(1)Device:指的是哪块磁盘。
(2)number:第几个分区。
(3)part_start:指的是从硬盘的什么位置开始划分,不写默认为从头开始(0%)。
(4)part_end:指的是到硬盘的什么位置作为分区的结束点。
(5)state:用于指定操作,present是创建,absent是删除。
但是在新版ansible里,parted模块并没有集成在ansible-core里,所以这里需要利用前面安装的ansible-collection-community-general,这个collection里才含有parted模块。
自行在server2上新添加一块类型为SCSI大小为20G的硬盘,命令如下。
[root@server2 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 50G 0 part /
└─sda2 8:2 0 4G 0 part [SWAP]
sdb 8:16 0 20G 0 disk
sr0 11:0 1 6.6G 0 rom /dvd
[root@server2 ~]#
练习1:
在server2上对/dev/sdb创建一个大小为2GiB的分区/dev/sdb1,命令如下。
[lduan@server ~]$ ansible server2 -m parted -a "device=/dev/sdb number=1 part_end=2GiB state=present"
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
此例是在/dev/sdb上创建第一个分区,因为从硬盘头开始,所以不需要指定part_start,此分区到2GiB的位置结束。
[lduan@server ~]$ ansible server2 -m shell -a "lsblk"
server2 | CHANGED | rc=0 >>
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
...输出...
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 2G 0 part
sr0 11:0 1 6.6G 0 rom /dvd
[lduan@server ~]$
练习2:
在server2上对/dev/sdb创建一个大小为2G的分区/dev/sdb2,命令如下。
[lduan@server ~]$ ansible server2 -m parted -a "device=/dev/sdb number=2 part_start=2GiB part_end=4GiB state=present"
server2 | CHANGED => {
...输出...
"script": "unit KiB mkpart primary 1024MiB 4096MiB"
}
[lduan@server ~]$
此例是对sdb从2GiB位置开始,到4GiB位置结束,第二个分区大小是3G。
在server2上查看分区,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "lsblk"
server2 | CHANGED | rc=0 >>
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
...输出...
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 2G 0 part
└─sdb2 8:18 0 2G 0 part
sr0 11:0 1 6.6G 0 rom /dvd
[lduan@server ~]$
练习3:
删除server2上的/dev/sdb2,命令如下。
[lduan@server ~]$ ansible server2 -m parted -a "device=/dev/sdb number=2 state=absent"
server2 | CHANGED => {
...输出...
[lduan@server ~]$
验证,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "lsblk"
server2 | CHANGED | rc=0 >>
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
...输出...
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 2G 0 part
sr0 11:0 1 6.6G 0 rom /dvd
[lduan@server ~]$
可以看到,/dev/sdb2已经被删除了。
请自行创建出/dev/sdb2和/dev/sdb3备用,命令如下。
[lduan@server ~]$ ansible server2 -m parted -a "device=/dev/sdb number=2 part_start=2GiB part_end=4GiB state=present"
[lduan@server ~]$ ansible server2 -m parted -a "device=/dev/sdb number=3 part_start=4GiB part_end=6GiB state=present"
[lduan@server ~]$ ansible server2 -m shell -a "lsblk"
server2 | CHANGED | rc=0 >>
...输出...
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 2G 0 part
├─sdb2 8:18 0 2G 0 part
└─sdb3 8:19 0 2G 0 part
sr0 11:0 1 6.6G 0 rom /dvd
[lduan@server ~]$
模块8:使用filesystem格式化
分区创建好之后,需要对分区进行格式化操作,格式化的模块为filesystem,对于filesystem常见的参数包括以下几种。
(1)dev:用于指定对哪个设备进行格式化。
(2)fstype:用于指定用什么文件系统进行格式化。
(3)force:是否强制格式化,默认为no。
练习:
对server2上的/dev/sdb3格式化为xfs文件系统,命令如下。
[lduan@server ~]$ ansible server2 -m filesystem -a "dev=/dev/sdb3 fstype=xfs"
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
如果想重新格式化,需要加force选项,命令如下。
[lduan@server ~]$ ansible server2 -m filesystem -a "dev=/dev/sdb3 fstype=xfs force=yes"
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
模块9:使用mount挂载文件系统
格式化之后就需要挂载分区,挂载用的是mount模块,mount模块常见的参数包括以下几种。
(1)src:用于指定挂载哪个设备。
(2)path:用于指定挂载点。
(3)fstype:用于指定挂载的文件系统,这个选项一定要指定。
(4)opts:指定挂载选项,如果不指定则为defaults。
(5)state:其值如下。
①mounted:挂载的同时,也会写入/etc/fstab。
②present:只是写入/etc/fstab,但当前并没挂载。
③unmounted:只卸载并不会把条目从/etc/fstab中删除。
④absent:卸载并从/etc/fstab中删除。
练习1:
把server2上的/dev/sdb3挂载到目录/123上,挂载选项为只读
这里不可直接使用ansible命令,会报错的
[lduan@server ~]$ ansible server2 -m mount -a "src=/dev/sdb3 path=/123 state=mounted fstype=xfs opts=defaults,ro"
server2 | FAILED! => {
"msg": "The module mount was redirected to ansible.posix.mount, which could not be loaded."
}
[lduan@server ~]$
需要通过ansible-navigator执行,命令如下。
[lduan@server ~]$ ansible-navigator exec -- 'ansible server2 -m mount -a "src=/dev/sdb3 path=/aa fstype=xfs state=present" '
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
这里指定了挂载选项为defaults,ro,多个选项用逗号隔开。
验证,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "df -hT | grep sdb3"
server2 | CHANGED | rc=0 >>
/dev/sdb3 xfs 2.0G 256K 2.0G 1% /123
[lduan@server ~]$
[lduan@server ~]$ ansible server2 -m shell -a "grep sdb3 /etc/fstab"
server2 | CHANGED | rc=0 >>
/dev/sdb3 /123 xfs defaults,ro 0 0
[lduan@server ~]$
因为挂载时state的值是mounted,所以不仅把/dev/sdb3挂载了,也写入/etc/fstab了。
练习2:
在server2上卸载并从/etc/fstab中删除/dev/sdb3,命令如下。
[lduan@server ~]$ansible-navigator exec -- ' ansible server2 -m mount -a "src=/dev/sdb3 path=/123 state=absent" '
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
注意:如果卸载,path是一定要指定的,src指定不指定都无所谓。
模块10: 用lvg模块对卷组管理
利用lvg模块管理卷组,此模块能用到选项包括以下几种。
(1)pvs:用于指定物理卷,如果需要多个pv用逗号隔开,不需要提前创建pv,此命令会自动创建pv。
(2)vg:用于指定卷组的名称。
(3)pesize:用于指定PE的大小。
(4)state:用于创建或删除vg。
①present创建卷组,默认。
②absent删除卷组。
练习1:
在server2上创建名称为vg0的卷组,所使用的分区为/dev/sdb1和/de/sdb2,pesize指定为16M。
先确认server2上不存在任何的pv和vg,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "vgs"
server2 | CHANGED | rc=0 >>
[lduan@server ~]$
开始创建vg0,命令如下。
[lduan@server ~]$ ansible server2 -m lvg -a "pvs=/dev/sdb1,/dev/sdb2 vg=vg0 pesize=16 state=present"
server2 | CHANGED => {
...输出...
"changed": true
}
[lduan@server ~]$
这里如果不指定pesize选项,默认为4。
验证,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "vgs"
server2 | CHANGED | rc=0 >>
VG #PV #LV #SN Attr VSize VFree
vg0 2 0 0 wz--n- <3.97g <3.97g
[lduan@server ~]$
练习2:
删除卷组vg0,命令如下。
[lduan@server ~]$ ansible server2 -m lvg -a "vg=vg0 pesize=16 state=absent"
server2 | CHANGED => {
...验证...
"changed": true
}
[lduan@server ~]$
验证,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "vgs"
server2 | CHANGED | rc=0 >>
[lduan@server ~]$
可以看到,vg0已经没有了。
请使用如下命令,再次把vg0创建出来。
ansible server2 -m lvg -a "pvs=/dev/sdb1,/dev/sdb2 vg=vg0 pesize=16 state=present"
模块11:使用lvol管理逻辑卷
卷组创建好之后就要创建逻辑卷了,管理逻辑卷的模块是lvol,lvol能用到的参数包含以下几种。
(1)vg:用于指定在哪个卷组上划分逻辑卷。
(2)lv:用于指定逻辑卷的名称。
(3)size:用于指定逻辑卷的大小。
(4)state:用于创建或删除逻辑卷。
①present:创建逻辑卷。
②absent:删除逻辑卷。
练习1:
在server2的卷组vg0上,创建大小为1G、名称为lv0的逻辑卷。
先判断server2是否存在逻辑卷,命令如下。
[lduan@server~]$ ansible server2 -m shell -a "lvs"
server2 | CHANGED | rc=0 >>
[lduan@server ~]$
可以看到,不存在任何的逻辑卷,下面开始创建逻辑卷,命令如下。
[lduan@server ~]$ ansible server2 -m lvol -a "vg=vg0 lv=lv0 size=1G"
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
验证,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "lvs"
server2 | CHANGED | rc=0 >>
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv0 vg0 -wi-a----- 1.00g
[lduan@server ~]$
可以看到,此逻辑卷已经创建出来了。
练习2:
在server2上删除逻辑卷/dev/vg0/lv0,命令如下。
[lduan@server rh294]$ ansible server2 -m lvol -a "vg=vg0 lv=lv0 state=absent force=yes"
server2 | CHANGED => {
...输出...
}
[lduan@server rh294]$
模块12:使用firewalld模块管理防火墙
在ansible中可以通过firewalld模块对防火墙进行管理,firewalld模块常用的参数包括以下几种。
(1)service:开放哪个服务。
(2)port:开放哪个端口,用法为port=80/tcp这样。
(3)permanent: yes:设置永久生效,不存在默认值。
(4)immediate: yes:设置当前生效,默认为不生效。
(5)state:所能用的值包括。
①enabled:表示创建规则。
②disabled:表示删除规则。
(6)rich_rule:富规则。
但是,因为firewalld模块没有集成在ansible-core里,所以我们并不能直接使用这个模块,直接调用这个模块会报错。
[lduan@server ~]$ ansible server2 -m firewalld -a "service=http immediate=yes permanent=yes state=enabled"
server2 | FAILED! => {
"msg": "The module firewalld was redirected to ansible.posix.firewalld, which could not be loaded."
}
[lduan@server ~]$
需要在ansible-navigator执行,命令如下
ansible-navigator exec 'ansible 主机 -m 模块 -a "选项1 选项2" '
练习1:
在server2上开放服务http,命令如下。
[lduan@server ~]$ ansible-navigator exec ' ansible server2 -m firewalld -a "service=http immediate=yes permanent=yes state=enabled" '
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
验证,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "firewall-cmd --list-all"
server2 | CHANGED | rc=0 >>
public (active)
...输出...
services: cockpit dhcpv6-client http ssh
ports:
...输出...
[lduan@server ~]$
练习2:
在server2上配置防火墙,允许tcp端口808通过,命令如下。
[lduan@server ~]$ ansible-navigator exec ' ansible server2 -m firewalld -a "port=808/tcp immediate=yes permanent=yes state=enabled" '
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
在server2上验证刚才的操作,命令如下。
[lduan@server ~]$ ansible server2 -m shell -a "firewall-cmd --list-all"
server2 | CHANGED | rc=0 >>
public (active)
...输出...
services: cockpit dhcpv6-client http ssh
ports: 808/tcp
...输出...
[lduan@server ~]$
练习3:
在server2上配置防火墙,删除开放的端口808和服务http,命令如下。
[lduan@server ~]$ ansible-navigator exec ' ansible server2 -m firewalld -a "port=808/tcp immediate=yes permanent=yes state=disabled" '
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
[lduan@server ~]$ ansible-navigator exec ' ansible server2 -m firewalld -a "service=http immediate=yes permanent=yes state=disabled" '
...输出...
}
[lduan@server ~]$
模块13:替换模块replace
平时写shell脚本时,要替换文件的内容,可以直接使用vim或sed来进行替换操作。在ansible中也有相关替换的模块:replace和lineinfile,这里先讲replace模块的使用。
replace常见的参数包括以下几种。
(1)path=:指明编辑的文件。
(2)regexp=:正则表达式,指定要替换哪块内容。
(3)replace=:替换后的字符。
练习1:
在server2的/opt目录中创建aa.txt,内容如下。
[root@server2 opt]# cat aa.txt
aa=111
bb=222
[root@server2 opt]#
替换server2上/opt/aa.txt中开头为aa那行的内容为xx=666。
在ansible主机上执行replace模块,命令如下。
[lduan@server ~]$ ansible server2 -m replace -a "path=/opt/aa.txt regexp=^aa replace=xx=666"
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
这句话意思是,对server2上/opt/aa.txt这个文件中 行开头是aa的字符进行替换成xx=666。记住,这里只是对regexp表示的字符进行替换,替换之后的内容如下所示。
[root@server2 opt]# cat aa.txt
xx=666=111
bb=222
[root@server2 opt]#
可以看到,他只是把原来的字符aa替换成replace后面的内容了,并不是把这行的内容替换。
如果想把整行内容替换进行替换,需要在regexp表示出来整行内容。
练习2:
替换server2上/opt/aa.txt中开头为bb那行的内容为xx=666,命令如下。
[lduan@server ~]$ ansible server2 -m replace -a "path=/opt/aa.txt regexp=^bb.+ replace=xx=666"
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
这里path指明了要替换的文件,regexp的写法是^bb.+, 比上面的例子中多了.+,意思是开头是bb及后续所有的字符(这就表示bb开头的那一整行内容),替换成xx=666。结果如下所示。
[root@server2 opt]# cat aa.txt
xx=666=111
xx=666
[root@server2 opt]#
模块14:替换模块lineinfile
lineinfile模块用法跟replace基本一致也是用于替换的,常见的参数包括以下几种。
(1)path=:指明编辑的文件。
(2)regexp=:正则。
(3)line=:替换后的字符。
练习:
在server2中创建文件/opt/bb.txt,内容如下。
[root@server2 opt]# cat bb.txt
aa=111
bb=222
[root@server2 opt]#
替换server2上/opt/bb.txt中开头为aa=111那行的内容为xx=666。
在ansible主机上执行lineinfile模块,命令如下。
[lduan@server ~]$ ansible server2 -m lineinfile -a "path=/opt/bb.txt regexp=^aa line=xx=666"
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
这句话的意思是对path所指定的文件/opt/bb.txt, regexp后面跟的^aa,意思是以aa开头的行(需要注意的是,这里和replace模块的区别),替换成xx=666,运行结果如下。
[root@server2 opt]# cat bb.txt
xx=666
bb=222
[root@server2 opt]#
总结:replace是对字符进行替换,lineinfile是对行进行替换,如果replace要想对行进行替换,在regexp后面必须要写上正则来表示一整行内容。
模块15:打印模块debug
debug模块一般用于打印提示信息,类似于shell中的echo命令,其他语言如Python等中的print,它的参数包括以下几种。
(1)msg:后面跟具体内容。
(2)var:后面跟变量。
注意:var和msg不可以同时使用。
练习:
在server2上打印“111”,命令如下。
[lduan@server ~]$ ansible server2 -m debug -a "msg='hello ansible' "
server2 | SUCCESS => {
"msg": "hello ansible"
}
[lduan@server ~]$
模块16:用script模块在远端执行脚本
如果在本地写了一个脚本,想在所有被管理节点上执行,没有必要事先把脚本分发到被管理机器上,用script模块即可快速实现。
先写一个简单的脚本test1.sh用于显示主机名,内容如下。
[lduan@server ~]$ cat test1.sh
#!/bin/bash
hostname
[lduan@server ~]$ chmod +x test1.sh
[lduan@server ~]$
下面在db主机组上执行,命令如下。
[lduan@server ~]$ ansible db -m script -a "./test1.sh"
server2 | CHANGED => {
...输出...
"stdout": "server2.rhce.cc\r\n",
"stdout_lines": [
"server2.rhce.cc"
]
}
server3 | CHANGED => {
...输出...
"stdout": "server3.rhce.cc\r\n",
"stdout_lines": [
"server3.rhce.cc"
]
}
[lduan@server ~]$
这样本地脚本直接在所有被管理主机上执行了。
模块17:用group模块对组进行管理
如果对系统的组进行管理,那么可以用group模块。group模块常见的选项包括以下几种。
(1)name:指定组名。
(2)state:此参数的值包括。
①present:创建组。
②absent:删除组。
下面在server2上创建组group1。
先判断server2是否存在group1,命令如下。
[root@server2 ~]# grep group1 /etc/group
[root@server2 ~]#
没结果显示说明server2上是没有group1这个组的,下面创建group1,命令如下。
[lduan@server ~]$ ansible server2 -m group -a "name=group1 state=present"
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
然后切换到server2上进行验证,命令如下。
[root@server2 ~]# grep group /etc/group
group1:x:1003:
[root@server2 ~]#
删除这个组,命令如下。
[lduan@server ~]$ ansible server2 -m group -a "name=group1 state=absent"
server2 | CHANGED => {
...输出...
}
[lduan@server ~]$
模块18:用user模块对用户管理
对用户的管理可以用user模块,对于user模块来说常见的选项包括以下几种。
(1)name:指明用户名。
(2)comment:指定注释信息。
(3)group:指定用户的主组。
(4)groups:指定用户的附属组。
(5)password:指定密码,但是这里密码必须要对其加密。
(6)state:此参数的值包括。
①present:用于创建用户。
②absent:用于删除用户。
下面创建一个用户lisi,命令如下。
[lduan@server ~]$ ansible server2 -m user -a "name=lisi group=root password={{'haha001' | password_hash('sha512')}} state=present"
server2 | CHANGED => {
...输出...
[lduan@server ~]$
这里password={{'haha001' | password_hash('sha512')}}的意思是,用password_hash这个函数调用sha512这个哈希算法对字符串haha001进行加密。
到server2上验证,因为root su到任何用户都不需要密码,所以这里先su到lduan用户然后再su到lisi用户,测试密码是不是正确。
[root@server2 ~]# su - lduan
[lduan@server2 ~]$ su - lisi
密码:haha001
[lisi@server2 ~]$ exit
注销
[lduan@server2 ~]$ exit
注销
[root@server2 ~]#
这里可以看到,用户的密码是haha001。
下面把lisi用户删除,命令如下。
[lduan@server ~]$ ansible server2 -m user -a "name=lisi state=absent remove=yes"
server2 | CHANGED => {
...输出...
[lduan@server ~]$
这里remove=yes的意思类似于userdel中的-r选项,删除用户的同时把家目录也删除。
模块19:用get_url模块下载文件
如果想从服务器上下载到被管理机器上,需要用到get_url模块。get_url常见的选项包括以下几种。
(1)url:指定文件的URL连接。
(2)dest:指定存储在哪里。
例如,现在要把ftp://ftp.rhce.cc/auto/web.tar.gz下载到server2的/opt目录中,命令如下。
[lduan@server ~]$ ansible server2 -m get_url -a "url=ftp://ftp.rhce.cc/auto/web.tar.gz dest=/opt/"
server2 | CHANGED => {
...输出...
[lduan@server ~]$
然后到server2上验证,命令如下。
[root@server2 ~]# ls /opt/
11.txt aa.txt bb.txt hosts web.tar.gz
[root@server2 ~]#
可以看到,现在已经把文件下载下来了。
模块20:用setup模块获取被管主机信息
如果想获取被管理主机的系统信息,可以使用setup模块,下面获取server2上信息,命令如下。
[lduan@server ~]$ ansible server2 -m setup
server2 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.26.102"
...大量输出...
"changed": false
}
[lduan@server ~]$
setup中所获取的变量叫作fact变量,这里都是以key: value的格式输出,大致结构如下。
键1:值
键2:{
子健a: 值a
子健b: 值b
....
}
如果想获取“键1”的值,可以通过 参数“filter=键”或“filter=键.子健”来进行过滤,例如,要获取server2上所在机器BIOS的版本,可以通过键值ansible_bios_version来获取,命令如下。
[lduan@server ~]$ ansible server2 -m setup -a "filter=ansible_bios_version"
server2 | SUCCESS => {
"ansible_facts": {
"ansible_bios_version": "6.00",
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
[lduan@server ~]$
如果想获取server的ipv4所有的信息,可以通过ansible_default_ipv4,命令如下。
[lduan@server ~]$ ansible server2 -m setup -a "filter=ansible_default_ipv4"
server2 | SUCCESS => {
"ansible_facts": {
"ansible_default_ipv4": {
"address": "192.168.26.102",
"alias": "ens160",
...输出...
"network": "192.168.26.0",
"type": "ether"
},
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
[lduan@server ~]$
如果想仅仅获取IP地址信息,其他网络信息不需要,可以获取ansible_default_ipv4的子健,命令如下。
[lduan@server ~]$ ansible server2 -m setup -a "filter=ansible_default_ipv4.address"
server2 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
[lduan@server ~]$
不过在命令行中如果filter如果含有子健,结果不会显示的,所以上面的命令没有看到IP,不过如果把这个键写入playbook,是会显示值的,关于playbook后面会讲。
注意:上述ansible_xx_yy这样的选项,可以写成ansible_facts.xxyy,即把"ansible"变为"ansible_facts." ,比如ansible_bios_version 可以写成 ansible_facts.bios_version, ansible_default_ipv4可以写成 ansible_facts.default_ipv4。
自然ansible_default_ipv4.address就可以写成了ansible_facts.default_ipv4.address。
作业
1.在ansible主机上执行一条命令,获取server2总内存大小。
2.在ansible主机上通过setup模块,获取server2的主机名。
3.把ansible主机上的/etc/issue文件拷贝到server2的/opt目录中,命名为myissue,所有者为lduan,所属组为users,权限为444,selinux上下文为httpd_sys_content_t。
4.在server2上安装vsftpd服务(请自行配置好yum源)
5.在server2上启动smb服务,并设置开启自动启动。
6.在server2上配置firewalld,放行服务"samba",重启系统也能生效。
7.在server3上创建一个用户wangw密码为haha001,加密算法为sha512。要求wangw以root作为主组,users作为附属组。