[root@pp ~]# ansible-doc -l
a10_server Manage A10 Networks AX/...
a10_server_axapi3 Manage A10 Networks AX/...
a10_service_group Manage A10 Networks AX/...
a10_virtual_server Manage A10 Networks AX/...
aci_aaa_user Manage AAA users (aaa:U...
aci_aaa_user_certificate Manage AAA user certifi...
aci_access_port_block_to_access_port Manage port blocks of F...
aci_access_port_to_interface_policy_leaf
按【Enter】键会一行一行地往下显示,按空格键会一页一页地往下显示,按【q】键退
出。
不同的模块有不同的参数,如果要查看某个模块的参数,可以通过如下语法来查看。
1 ansible‐doc 模块名
ansible中有很多模块,每个模块也有很多参数,我们是不可能把所有的模块、每个模块
的所有参数都掌握的。所以,下面我们只讲解最常见的模块及这些模块中最常见的参数的使
用方法。
29.1 shell模块
shell模块可以在远端执行操作系统命令,具体用法如下。
1 ansible 主机组 ‐m shell ‐a "系统命令"
练习1:在up上执行hostname命令,命令如下。
[root@pp ~]# ansible up -m shell -a "hostname"
up | CHANGED | rc=0 >>
up
[root@pp ~]#
这里rc=0的意思是执行此命令之后的返回值为0,rc的意思是returm code(返回值),为0
说明正确执行了,非零说明没有正确执行。
练习2:在 server2上执行一个错误的命令,命令如下。
[root@pp ~]# ansible up -m shell -a "hostnamexx"
up | FAILED | rc=127 >>
/bin/sh: hostnamexx: 未找到命令non-zero return code
[root@pp ~]#
这里rc=127的意思是执行此命令之后的返回值为127,非零说明没有正确执行。
29.2 文件管理的file模块
file模块用于创建和删除文件/目录,修改文件/目录属性,其常见的参数包括以下几个。
(1)path:用于指定文件/目录的路径,此选项可以用name或dest替代。
(2)state:指定行为。
(3)touch:创建文件。
(4)directory:创建目录。
(5)file:对已存文件进行修改。
(6)absent:删除。
(7)link:软链接。
(8)hard:硬链接。
(9)其他参数:owner指定所有者,group指定所属组,mode指定权限,setype指定上下
文。
练习1:在server2上创建一个文件/opt/hosts,并设置所有者为root,所属组为tom,权
限为444,命令如下。
[root@pp ~]# ansible up -m file -a "path=/opt/hosts owner=root group=tom mode=444 state=touch"
up | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"dest": "/opt/hosts",
"gid": 1002,
"group": "tom",
"mode": "0444",
"owner": "root",
"secontext": "unconfined_u:object_r:usr_t:s0",
"size": 0,
"state": "file",
"uid": 0
}
需要注意的是,此处用path指定的文件,替换成name也是可以的,即
name=/opt/hosts。查看文件的属性,命令如下。
[root@pp ~]# ansible up -m shell -a "ls -l /opt/hosts"
up | CHANGED | rc=0 >>
-r--r--r--. 1 root tom 0 12月 18 10:43 /opt/hosts
[root@pp ~]#
练习2:为/opt/hosts创建一个软链接/opt/hosts123,命令如下。
[root@pp ~]# ansible up -m file -a "src=/opt/hosts dest=/opt/hosts123 state=link"
up | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"dest": "/opt/hosts123",
"gid": 0,
"group": "root",
"mode": "0777",
"owner": "root",
"secontext": "unconfined_u:object_r:usr_t:s0",
"size": 10,
"src": "/opt/hosts",
"state": "link",
"uid": 0
}
[root@pp ~]#
验证,命令如下
[root@pp ~]# ansible up -m file -a 'name=/opt/xx state=directory setype=default_t'
up | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/opt/xx",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": 6,
"state": "directory",
"uid": 0
}
[root@pp ~]#
29.3 copy和 fetch模块 copy用于把本地的文件拷贝到被管理机器,语法如下。
copy用于把本地的文件拷贝到被管理机器,语法如下。
1 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,所有者为blab,命令如下。
[root@pp ~]# ansible up -m copy -a "src=/etc/ansible/hosts mode=000 owner=blab dest=/opt"
up | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"checksum": "da996f1a52dbae3b6b43a6c50d761e4ed5ec9a9f",
"dest": "/opt/hosts",
"gid": 1002,
"group": "tom",
"mode": "0000",
"owner": "blab",
"path": "/opt/hosts",
"secontext": "unconfined_u:object_r:usr_t:s0",
"size": 1016,
"state": "file",
"uid": 1001
}
[root@pp ~]#
验证,命令如下
[root@pp ~]# ansible up -m shell -a "ls -l /opt/hosts"
up | CHANGED | rc=0 >>
----------. 1 blab tom 1016 12月 18 11:04 /opt/hosts
copy模块也可以利用content参数往某个文件中写内容,如果此文件不存在则会创建出
来。
练习2:在被管理机器的/opt目录中创建11.txt,内容为123123,命令如下。
[root@pp ~]# ansible up -m copy -a 'content="123123" dest=/opt/11.txt'
up | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"checksum": "601f1889667efaebb33b8c12572835da3f027f78",
"dest": "/opt/11.txt",
"gid": 0,
"group": "root",
"md5sum": "4297f44b13955235245b2497399d7a93",
"mode": "0644",
"owner": "root",
"secontext": "system_u:object_r:usr_t:s0",
"size": 6,
"src": "/home/blab/.ansible/tmp/ansible-tmp-1702868819.2795806-77717-16766204555196/source",
"state": "file",
"uid": 0
}
[root@pp ~]#
验证/opt/11.txt的内容,命令如下。
[root@pp ~]# ansible up -m shell -a "cat /opt/11.txt"
up | CHANGED | rc=0 >>
123123
[root@pp ~]#
fetch用于把文件从被管理机器拷贝到本机当前目录中,命令如下。
[root@pp ~]# ansible up -m fetch -a "src=/opt/hosts dest=."
up | CHANGED => {
"changed": true,
"checksum": "da996f1a52dbae3b6b43a6c50d761e4ed5ec9a9f",
"dest": "/root/up/opt/hosts",
"md5sum": "1564b951dc7c8511c6f9ee842653c541",
"remote_checksum": "da996f1a52dbae3b6b43a6c50d761e4ed5ec9a9f",
"remote_md5sum": null
}
[root@pp ~]#
29.4 yum_repository模块
利用yum_repository设置yum 源,一个标准的repo配置文件如下所示。
[root@pp ~]# cat /etc/yum.repos.d/aa.repo
[aa]
name=aa
baseurl=file:///mnt/AppStream
enabled=1
gpgcheck=0
gpgkey=ftp://192.168.26.101/dvd/RPM‐GPG‐KEY‐redhat‐release
name=bb
baseurl=file:///mnt/BaseOS
enabled=1
gpgcheck=0
[root@pp ~]#
其中门中的名称用于区分不同的yum 源。这里参数的含义如下。
(1)name:此 yum 源的描述信息。
(2) baseurl:用于指定yum源的具体地址。
(3)enabled:用于指定是否启用此 yum 源。
(4)gpgcheck:用于指定在安装软件包时,是否要进行数字签名的验证,一般设置为0
即可。
(5)gpgkey:在gpgcheck设置为1的情况下,用于指定公钥的位置。
对于yum_repository模块来说,常见的参数包括以下几个。
(1)name:repo配置文件里 [] 中的名称。
(2)description:repo配置文件里name字段的描述信息。
(3)baseurl :用于指定yum源的位置。
(4)enabled :是否启用源,值为true 或false。
(5)gpgcheck:是否启用数字签名验证,值为true或falsc。(6) gpgkey:用于指定公钥的
位置。
练习:给server2配置yum源,地址是ftp://192.168.8.11/dvd/AppStream,所需要的密
钥文件为ftp://192.168.8.11/dvd/RPM-GPG-KEY-redhat-release,命令如下。
[root@pp ~]# ansible up -m yum_repository -a "name=app description='this is appstream' baseurl=ftp://192.168.248.45/dvd/AppStream gpgcheck=yes gpgkey=ftp://192.168.248.45/dvd/RPM-GPG-KEY-redhat-release"
up | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"repo": "app",
"state": "present"
}
[root@pp ~]#
执行之后的效果如下
[root@pp ~]# ansible up -m shell -a "ls /etc/yum.repos.d/"
up | CHANGED | rc=0 >>
aa.repo
app.repo
redhat.repo
[root@pp ~]# ansible up -m shell -a "cat /etc/yum.repos.d/app.repo"
up | CHANGED | rc=0 >>
[app]
baseurl = ftp://192.168.248.45/dvd/AppStream
gpgcheck = 1
gpgkey = ftp://192.168.248.45/dvd/RPM-GPG-KEY-redhat-release
name = this is appstream
[root@pp ~]#
29.5 使用yum模块管理软件包
yum模块常见的参数包括以下几个。
(1)name:用于指定软件包的名称。
(2)state:此参数的值如下。
①present或installed:用于安装软件包,没有指定state时的默认值就是installed。
②absent或removed:用于卸载软件包。
③latest:用于更新。
注意
yum模块可以用package模块替代,用于在 Ubuntu等其他系统上管理软件包。
练习1:在server2上安装vsftpd,命令如下。
[root@pp ~]# ansible up -m yum -a "name=vsftpd state=installed"
up | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Installed: vsftpd-3.0.3-34.el8.x86_64"
]
}
[root@pp ~]#
验证,命令如下。
[root@pp ~]# ansible up -m shell -a "rpm -qa | grep vsftpd"
up | CHANGED | rc=0 >>
vsftpd-3.0.3-34.el8.x86_64
练习2:在server2上卸载vsftpd,命令如下。
[root@pp ~]# ansible up -m yum -a "name=vsftpd state=absent"
up | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Removed: vsftpd-3.0.3-34.el8.x86_64"
]
}
[root@pp ~]#
如果本机没有安装vsftpd,下面的命令就是安装,如果已经安装则更新到最新版。
1 ansible server2 ‐m yum ‐a "name=vsftpd state=latest"
如果要安装组或模块,需要在组名或模块名前加@,这个模块要使用引号引起来。
29.6 使用service模块管理服务
可以通过systemctl对服务进行启动、重启、关闭等操作,在ansible中可以调用service模
块来实现对服务的管理,service模块常见的参数包括以下几个。
(1)name :指定对哪个服务进行管理。
(2)enabled :用于设置此服务是否开机自动启动,值为yes或no,默认值为空。
(3)state:用于启动或关闭服务,其值包括started、stopped、restarted等。
首先判断server2上的vsftpd是否启动,命令如下。
[root@pp ~]# ansible up -m shell -a "systemctl is-active vsftpd"
up | FAILED | rc=3 >>
inactivenon-zero return code
[root@pp ~]#
这里返回值为3(rc=3),说明server2上的vsftpd没有启动。
练习:启动vsftpd并设置开机自动启动,命令如下。
[root@pp ~]# ansible up -m yum -a "name=vsftpd state=latest"
up | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"msg": "Nothing to do",
"rc": 0,
"results": []
}
[root@pp ~]#
验证命令如下
[root@pp ~]# ansible up -m shell -a "systemctl is-active vsftpd"
up | CHANGED | rc=0 >>
active
[root@pp ~]#
29.7 使用parted模块对硬盘分区
在 ansible中如果对分区进行管理,使用的是parted模块,parted模块常见的参数包括以
下几个。
(1)device:指的是哪块磁盘。
(2)number:第几个分区。
(3)part_start:指的是从硬盘的什么位置开始划分,不写默认为从头开始(0%)。
(4)part_end:指的是到硬盘的什么位置作为分区的结束点。
(5)state:用于指定操作,present是创建,absent是删除。
自行在server2上新添加一块类型为SCSI、大小为20G的硬盘,命令如下。
[root@up ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 10.2G 0 rom /mnt
nvme0n1 259:0 0 100G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 99G 0 part
├─rhel-root 253:0 0 98G 0 lvm /
└─rhel-swap 253:1 0 1G 0 lvm [SWAP]
[root@up ~]#
练习1:在up上对/dev/nvme0np1创建一个大小为2GiB的分区/dev/nvme0n2p1,命令如下。
[root@pp ~]# ansible up -m parted -a "device=/dev/nvme0n2 number=1 part_end=2GiB state=present"
up | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
29.8 使用filesystem模块格式化
分区创建好之后,需要对分区进行格式化操作,格式化的模块为filesystem,filesystem
模块常见的参数包括以下几个。
(1)dev:用于指定对哪个设备进行格式化。
(2)fstype:用于指定用什么文件系统进行格式化。
(3)force:是否强制格式化,默认为no。
练习:把 up上的/dev/nvmeon2p3格式化为XFS文件系统,命令如下。
[root@pp ~]# ansible up -m filesystem -a "dev=/dev/nvme0n2p3 fstype=xfs"
up | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true
}
[root@pp ~]#
如果想重新格式化,需要加上 force选项,命令如下。
[root@pp ~]# ansible up -m filesystem -a "dev=/dev/nvme0n2p3 fstype=xfs force=yes"
up | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true
}
[root@pp ~]#
29.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目录上,挂载选项为只读,命令如下
[root@pp ~]# ansible up -m shell -a "mkdir /123"
up | CHANGED | rc=0 >>
[root@pp ~]# ansible up -m mount -a "src=/dev/nvme0n2p3 path=/123 state=mounted fstype=xfs opts=defaults,ro"
up | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"dump": "0",
"fstab": "/etc/fstab",
"fstype": "xfs",
"name": "/123",
"opts": "defaults,ro",
"passno": "0",
"src": "/dev/nvme0n2p3"
}
[root@pp ~]#
这里指定了挂载选项为defaults,ro,多个选项用逗号隔开。
验证,命令如下。
[root@pp ~]# ansible up -m shell -a "df -Th | grep nvme0n2p3"
up | CHANGED | rc=0 >>
/dev/nvme0n2p3 xfs 2.8G 256K 2.8G 1% /123
[root@pp ~]# ansible up -m shell -a "grep nvme0n2p3 /etc/fstab"
up | CHANGED | rc=0 >>
/dev/nvme0n2p3 /123 xfs defaults,ro 0 0
[root@pp ~]#
为挂载时state的值是mounted,所以不仅把/dev/sdb3挂载了,也写人/etc/fstab
了。
练习2:在server2上卸载并从/etc/fstab中删除/dev/sdb3,命令如下。
[root@pp ~]# ansible up -m mount -a "src=/dev/nvme0n2p3 path=/123 state=absent"
up | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"dump": "0",
"fstab": "/etc/fstab",
"name": "/123",
"opts": "defaults",
"passno": "0",
"src": "/dev/nvme0n2p3"
}
[root@pp ~]#
注意
如果卸载,path是一定要指定的,src指定不指定都无所谓。
29.10 使用lvg模块对卷组进行管理
使用lvg模块管理卷组,此模块常见的参数包括以下几个。
(1)pvs:用于指定物理卷,如果有多个PV则用逗号隔开,不需要提前创建PV,此命令
会自动创建PV。
(2)vg:用于指定卷组的名称。
(3)pesize:用于指定PE的大小。
(4)state:此参数的值如下。present :用于创建卷组,默认。absent :用于删除卷组。
练习1:在server2上创建名称为vg0的卷组,所使用的分区为/dev/sdb1
和/dev/sdb2/pesize指定为16M。
先确认server2上不存在任何PV 和VG,命令如下。
[root@pp ~]# ansible up -m shell -a "vgs"
up | CHANGED | rc=0 >>
[root@pp ~]#
开始创建vg0,命令如下。
[root@pp ~]# ansible up -m lvg -a "pvs=/dev/nvme0n2p1,/dev/nvme0n2p2 vg=vg0 pesize=16 state=present"
up | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true
}
[root@pp ~]#
这里如果不指定pesize选项,则默认为4。
验证,命令如下。
[root@pp ~]# ansible up -m shell -a "vgs"
up | CHANGED | rc=0 >>
VG #PV #LV #SN Attr VSize VFree
rhel 1 2 0 wz--n- <99.00g 0
vg0 2 0 0 wz--n- <3.72g <3.72g
[root@pp ~]#
练习2:删除卷组 vg0,命令如下。
[root@pp ~]# ansible up -m lvg -a "vg=vg0 pesize=16 state=absent"
up | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true
}
[root@pp ~]#
验证,命令如下。
[root@pp ~]# ansible up -m shell -a "vgs"
up | CHANGED | rc=0 >>
VG #PV #LV #SN Attr VSize VFree
rhel 1 2 0 wz--n- <99.00g 0
[root@pp ~]#
可以看到,vg0已经没有了。
请使用ansible server2 -m lvg -a "pvs=ldev/sdb1,/dev/sdb2 vg-vg0 pesize=16
state-present"命令再次把vg0创建出来。