第29章 常用模块的使用

第29章 常用模块的使用

本章主要介绍 ansible 中最常见模块的使用。
◆ 文件管理模块
◆ 软件包管理模块
◆ 服务管理模块
◆ 磁盘管理模块
◆ 用户管理模块
◆ 防火墙管理模块

文章目录

  • 第29章 常用模块的使用
    • 29.1 shell 模块
    • 29.2 文件管理的 file 模块
    • 29.3 copy 和fetch模块
    • 29.4 yum_repository 模块
    • 29.5 使用yum 模块管理软件包
    • 29.6 使用 service 模块管理服务
    • 29.7 使用 parted 模块对硬盘分区
    • 29.8 使用filesystem 模块格式化
    • 29.9 使用mount 模块挂载文件系统
    • 2.10 使用 lvg 模块对卷组进行管理
    • 29.11 使用 lvol 模块管理逻辑卷
    • 29.12 使用firewalld 模块管理防火墙
    • 29.13 替换模块 replace
    • 29.14 替换模块 lineinfile
    • 29.15 打印模块debug
    • 29.16 使用script 模块在远端执行脚本
    • 29.17 使用group模块对组进行管理
    • 29.18 使用user 模块对用户进行管理
    • 29.19 使用get_url 模块下载文件
    • 29.20 使用setup模块获取被管理主机信息
    • 作业

ansible 的基本用法如下。

ansible 机器名 -m 模块x -a "模块的参数"

对被管理机器执行不同的操作,只需要调用不同的模块就可以了。ansible 中内置了很多的模块,可以通过 ansible-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...
[lduaneserver  ~]$

不同的模块有不同的参数,如果要查看某个模块的参数,可以通过如下语法来查看。

ansible-doc 模块名

ansible 中有很多模块,每个模块也有很多参数,我们是不可能把所有的模块、每个模块 的所有参数都掌握的。所以,下面我们只讲解最常见的模块及这些模块中最常见的参数的使用方法。

29.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 的意思是return code (返回值),为0说明正确执行了,非零说明没有正确执行。

练 习 2 : 在 server2 上执行一个错误的命令,命令如下。

[1duan@server ~]$ ansible server2 -m shell -a "hontnamexx"
server2 | FAILED | rc=127 >>
/bin/sh:hostnamexx: 未找到命令 non-zero return code[lduan@server ~]$

这里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上创建一个文件/opthosts,并设置所有者为root,所属组为lduan,权限为444,命令如下。

[1duan@server ~]$ ansible server2 -m file -a "path=/opt/hosts owner=root group=lduan mode=444 state=touch"
server2 | CHANGED => {
...输出...
}

需要注意的是,此处用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月 2811:24  /opt/hosts
[lduan@server ~]$

练习2: 为/opt/hosts创建一个软链接/opt/hosts123,命令如下。

[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 ~]S

练习3: 删除/opt/hosts123, 命令如下。

[lduan@server ~]$ ansible server2 -m file -a 'name=/opt/hosts123 state=absent' 
server2 | CHANGED  =>{
..输出...
}
[lduan@server ~]$

**练习4: **创建目录/op/xx,上下文设置为 default_t,命令如下。

[1duan@server ~]$ ansible server2 -m file -a 'name=/opt/xx state=directory setype=default_t'
. . .输出 . . .[1duaneserver    ~]$

练习5: 把/opt/hosts的权限改成000,所有者改成tom, 所属组改成users,命令如下。

[1duan@server ~]$ ansible server2 -m file -a "name=/opt/hosts owner=tom group=users mode=000"
server2 | CHANGED =>{
...输出...
}
[lduan$server   ~]$

验证,命令如下。

[1duan@server ~]$ ansible server2 -m shell -a "ls -1 /opt/hosts"
server2 | CHANGED | rc=0 >>
----------.1 tom users 63 7月 28 11:24 /opt/hosts
[1duan@server ~1$

注意:指定文件时用 name或 path都是可以的。

清空 server2 上/opt 中所有的内容,命令如下。

[lduan@server ~]$ ansible server2 -m shell -a "rm -rf /opt/*"
[WARNING]:Consider using the flle module with state=absent rather than running 'm'.If  you   need  to  use  command  because  file   is   insufcient  you  can  add  'warn:  false'to this command task or set 'command_warnings=False'in ansible.cfg
to    get    rid    of    this    message.
server2 | CHANGED | rc=0 >>[lduan&server ~]$

上面的WARNING 可以忽略不管,如果不想显示此消息,则在ansible.cfg的 [defaults] 字段下添加 command_warnings=False 即可。

[1duan@server ~]$ ansible server2 -m shell -a "rm -rf /opt/*"
server2 | CHANGED | rc=0 >>[1duan@server ~1$

29.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月     2812: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 的内容,命令如下。

[1duan@server ~]$ ansible server2 -m shell -a "cat /opt/11.txt"
server2 | CHANGED |rc=0 >>
123123
[lduan@server ~]$

fetch 用于把文件从被管理机器拷贝到本机当前目录中,命令如下。

[1duan@server ~]$ ansible server2 -m fetch -a "src=/opt/hosts dest=." 
server2 |CHANGED =>{...输出...
}

查看,命令如下。

[lduan@server ~]$ tree server2/
server2/opthosts1 directory,1 file
[lduan@server  ~]$

当使用 fetch拷贝远端目录到本地时,会在本地创建一个和远端主机同名的目录,用于存放拷贝的文件。

29.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 源。这里参数的含义如下。

(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 或 falsc。

(5) gpgcheck: 是否启用数字签名验证,值为 true 或 false。

(6) gpgkey: 用于指定公钥的位置。

练 习: 给 server2 配置 yum源,地址是fp:/192.168.26.101/dvd/AppStream,所需要的密钥文件为 ftp://192.168.26.6/dvd/RPM-GPG-KEY-redhat-release,命令如下。

[1duan@server ~]$ ansible server2 -m yum_repository -a "name=app description=
'this is appsream' baseurl=ftp://192.168.26.101/dvd/AppStream gpgkey=ftp://192.168.26.6/dvd/RPM-GPG-KEY-redhat-release"
server2 | CHANGED =>{
...输出...[lduan@server ~]$

执行之后的效果如下。

[lduan@server ~]$ ansible server2 -m shell -a "ls /etc/yum.repos.d/" 
server2 I 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]
baseur1 = 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 源,地址是 fp://192.168.26.101/dvd/BaseOS, 所需要的密钥文
件为fp://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=yes gpgkey=ftp://192.168.26.101/dvd/RPM-GPG-KEY-redhat-release"
server2 |CHANGED =>{
...输出...
[lduan@server ~]

29.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 =>{
...输出..[1duan@server ~]$

验证,命令如下。

[lduan@server ~]$ansible server2 -m shell -a "rpm -qa | grep vsftpd"
server2 | CHANGED | rc=0 >>
vsftpd-3.0.3-33.el8.x86_64
[1duan@server ~]$

2: 在 server2 上卸载 vsftpd, 命令如下。

[1duan@server ~]$ ansible server2 -m yum -a "name=vsftpd state=absent"
server2 | CHANGED =>{
...输出...[lduan@server ~]S

如果本机没有安装 vsftpd, 下面的命令就是安装,如果已经安装则更新到最新版。

ansible server2 -m yum -a "name=vsftpd state=latest"

如果要安装组或模块,需要在组名或模块名前加@,这个模块要使用引号引起来。

练 习3 : 安 装 RPM开发工具,命令如下。

[1duan@server ~]$ ansible server2 -m yum -a "name='@RPM 开发工具' state=installed"
server2 | CHANGED =>{
...输出...
}
[lduan@server ~]$

29.6 使用 service 模块管理服务

可以通过systemctl 对服务进行启动、重启、关闭等操作,在 ansible 中可以调用service 模

块来实现对服务的管理, service 模块常见的参数包括以下几个。

(1) name: 指定对哪个服务进行管理。

(2) enabled: 用于设置此服务是否开机自动启动,值为 yes 或 no, 默认值为空。

(3) state: 用于启动或关闭服务,其值包括 started、stopped、restarted 等。

首先判断 server2 上的 vsfpd 是否启动,命令如下。

[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 没有启动。

**练习:**启动 vsfipd 并设置开机自动启动,命令如下。

[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 I rc=0 >>
active
enabled
[lduan@server ~]$

或者到 server2上验证,命令如下。

[root@server2 ~]#systemctl is-active vsftpd
active
[root@server2 ~]#systemctl is-enabled vsftpd
enabled
[root@server2 ~]#

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@server2  ~]# lsblk

练习1: 在server2 上对/dev/sdb 创建一个大小为2GiB 的分区/dev/sdb1, 命令如下。

[1duan@server ~]$ ansible server2 -m parted -a "device=/dev/sdb number=1 part_end=2GiB state=present"
server2  | CHANGED   =>(
...输出...
}
[1duan@server ~]$

此例是对/dev/sdb创建第一个分区,因为从硬盘头开始,所以不需要指定 part_start, 此分区到2GiB 位置结束。

[lduan@server ~]$ ansible server2 -m shell -a "lsblk"
server2 I 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

练 习 2 : 在 server2 上对/dev/sdb 创建一个大小为2GiB 的分区/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 ~]$

此例是对/dev/sdb 创建第二个分区,从2GiB 位置开始,到4GiB 位置结束。

在 server2 上查看分区,命令如下。

[1duan@server ~]$ ansible server2 -m shell -a "lsblk"
server2 I CHANGED |rc=0 >>
NAME         MAJ:MIN    RM     SIZE     RO    TYPE    MOUNTPOINT
. . . 输 出 . . .
sdb             8:16   0    20G  0 disksdb1       8:17   0    2G   0 partsdb2       8:18   0    2G   0 part
sr0        			11:0   1    6.6G  0  rom  /dvd

练 习 3 : 删除 server2 上的/dev/sdb2, 命令如下。

[lduan@server ~]$ ansible server2 -m parted -a "device=/dev/sdb number=2 state=absent"
server2 |CHANGED =>{
. . . 输 出 . . .[lduan@server ~]4

验证,命令如下。

[lduan@server ~]$ ansible server2 -m shell -a "lsblk"
server2 I CHANGED |  rc=0 >>
NAME                MAJ:MIN        RM      SIZE         RO       TYPE       MOUNTPOINT
...输出...
sdb              8:16     0       20G      0     disksdbl      8:17     0      2G        0     part
sr0              11:0     1       6.6G     0     rom  /dyd
[lduan@server ~]$

可以看到,/dev/sdb2已经被删除了。

请自行创建出/dev/sdb2和/dev/sdb3 备用,命令如下。

[lduan@server ~]$ ansible server2 -m shell -a "lsblk"
server2 | CHANGED | rc=0 >>
..输出...
sdb        		 8:16    0    20G 0 disksdbl       8:17    0     2G  0  partsdb2       8:18    0     2G    0 partsdb3       8:19   0      2G    0  part
sr0            11:0     1   6.6G     0    rom   /dvd
[lduan@server ~]$

29.8 使用filesystem 模块格式化

分区创建好之后,需要对分区进行格式化操作,格式化的模块为 flesystem,flesystem

模块常见的参数包括以下几个。

(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 =>{
...输出...
}
[1duan@server ~]$

如果想重新格式化,需要加上 force 选项,命令如下。

[lduan@server ~]$ ansible server2 -m filesystem -a "dev=/dev/sdb3 fstype=xfs force=yes"
server2 I CHANGED =>{
...输出...

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 目录上,挂载选项为只读,命令如下。

[lduan@server ~]$ ansible server2 -m mount -a "src=/dev/sdb3 path=/123 state=mounted fstype=xfs opts=defaults,ro"
server2   |  CHANGED => {
...输出...
}
[lduan@server ~]$

这里指定了挂载选项为 defaults,ro, 多个选项用逗号隔开。

验证,命令如下。

[1duan@server ~]$ ansible server2 -m shell -a "df -hT | grep sdb3" 
server2  | CHANGED  | rc=0 >>
/dev/sdb3               xfs             2.0G  256K   2.0G     1%/123
[1duan@server ~]$
[1duan@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 server2 -m mount -a "src=/dev/sdb3 path=/123 state=absent"
server2 |CHANGED => {
...输出...
}
[lduan@server ~]$

注意:如果卸载, path 是一定要指定的,src 指定不指定都无所谓。

2.10 使用 lvg 模块对卷组进行管理

使用 Ivg模块管理卷组,此模块常见的参数包括以下几个。

(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, 命令如下。

[1duan@server ~]$ ansible server2 -m shell -a "vgs"
server2 | CHANGED |rc=0 >>
[1duan@server ~]$

开始创建 vg0, 命令如下。

[1duan@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, 命令如下。

[lduaneserver ~]$ ansible server2 -m lvg -a "vg=vg0 pesize=16 state=absent" 
server2 | CHANGED => {
...验证...
"changed":true
}
[1duan@server ~]$

验证,命令如下。

[lduan@server ~]$ ansible server2 -m shell -a "vgs"
server2 | CHANGED | rc=0 >>
[lduan@server ~]$

可以看到, vg0 已经没有了。

请使用 ansible server2 -m lvg -a “pvs=/dev/sdb1,/dev/sdb2 vg=vg0 pesize=16 state=present” 命令再次把vg0 创建出来。

29.11 使用 lvol 模块管理逻辑卷

卷组创建好之后就要创建逻辑卷了,管理逻辑卷的模块是lvol,Ivol模块常见的参数包含

以下几个。

(1) vg: 用于指定在哪个卷组上划分逻辑卷。

(2) lv : 逻辑卷的名称。

(3) size: 用于指定逻辑卷的大小。

(4) state: 此参数的值如下。

① present: 用于创建逻辑卷。

② absent: 用于删除逻辑卷。

练 习1 : 在 server2 的卷组 vg0上,创建大小为1G、 名称为 Iv0的逻辑卷。

先判断 server2 上是否存在逻辑卷,命令如下。

[lduaneserver~]$ 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   Datag   Metag   Move   Log   CpyiSync   Convert
lv0   vg0 -wi-a-----1.00g
[lduaneserver ~]$

可以看到,此逻辑卷已经创建出来了。

练 习 2: 在 server2上删除逻辑卷/dev/vg0/lv0, 命令如下。

[lduan@server2]$ansible server2 -m lvol -a "vg=vg0 lv=lv0 state=absent force=yes" server2 | CHANGED => {
. .输出 . .
}
[1duan@server rh294]$

29.12 使用firewalld 模块管理防火墙

在 ansible 中可以通过firewalld 模块对防火墙进行管理, firewalld 模块常见的参数包括以下几个。

(1) service: 开放哪个服务。

(2) port: 开放哪个端口,用法为 port=80/tcp。

(3) permanent=ycs: 设置永久生效,不存在默认值。

(4) immediate=yes: 设置当前生效,默认为不生效。

(5) state: 此参数的值如下。

① enabled: 用于创建规则。

②disabled: 用于删除规则。

(6)rich_rule: 富规则。

练习1 : 在server2上开放服务http,命令如下。

[lduan@server ~]$ 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 server2 -m firewalld -a "port=808/tcp immediate=yes permanent=yes state=enabled"
server2 | CHANGED => {
...输出...
}
[1duan@server ~]$

在server2上验证刚才的操作,命令如下。

[1duan@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: 在 scrver2 上配置防火墙,删除开放的端口808和服务 http, 命令如下。

[lduaneserver ~]$ ansible server2 -m firewalld -a "port=808/tcp immediate=yes permanent=yes state=disabled"
server2 | CHANGED =>>
. . .输出 . . .
}
[lduan@server ~]$
[lduaneserver ~]$ ansible server2 -m firewalld -a "service=http immediate=yes permanent=yes state=disabled"
server2 |CHANGED =>{
. . .输出 . . .
}
[lduaneserver ~]$

29.13 替换模块 replace

平时写 shell脚本时,要替换文件的内容,可以直接使用vim 或 sed命令来进行替换操作。

在 ansibie 中也有相关的替换模块: replace 和lineinfle, 这里先讲replace模块的使用.

replace模块常见的参数包括以下几个。

(1) path: 指明编辑的文件。

(2) regexp: 正则表达式,指定要替换哪块内容。

(3) replace: 替换后的字符。

练 习 1 : 把 server2上/opVaa.txt 中开头为aa 那行的内容替换为xx=666。

在 server2 的 /opt 目录中创建 aa.txt, 内容如下。

[root@server2 opt]# cat aa.txt
aa=111
bb=222
[root@server2 opt]#

在 ansible 主机上执行 replace 模块,命令如下。

[1duan@server ~]$ ansible server2 -m replace -a "path=/opt/aa.txt regexp=^aa replace=xx=666"
server2 | CHANGED =>{
...输出...
}
[lduaneserver   ~]$

这里的意思是把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, 命令如下。

[1duan@server ~]$ ansible server2 -m replace -a "path=/opt/aa.txt regexp=^bb.+  replace=xx=666"
server2 |CHANGED =>{
...输出...[lduaneserver  ~]$

这里path 指明了要替换的文件, regexp 的写法是^bb.+, 比上面的例子中多了.+,意思是开头是bb 及后续所有的字符(这就表示以bb 开头的那一整行内容),替换成xx=666, 运行结果如下。

[root@server2 opt]# cat aa.txt
xx=666=111
xx=666
[root@server2 opt]#

29.14 替换模块 lineinfile

lineinfile 模块的用法与 replace 基本一致,也是用于替换的,常见的参数包括以下几个。

(1) path: 指明编辑的文件。

(2) regexp; 正则表达式。

(3)line: 替换后的字符。

**练 习:**把 server2 上/optbb.txt 中开头为 aa=111那行的内容替换为xx=666。

在 server2 上创建文件/optbb,txt, 内容如下。

[root@server2 opt]# cat bb.txt
aa=111
bb=222
[root@server2 opt]#

在 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 后面必须写上正则表达式来表示一整行内容。

29.15 打印模块debug

debug 模块一般用于打印提示信息,类似于shell 中的 echo命令,其他语言如 Python 等中

的 print,其常见的参数包括以下几个。

(1) msg: 后面跟具体内容。

(2) var: 后面跟变量。

注意:var 和msg不可以同时使用。

**练习:**在 server2上打印“111”,命令如下。

[1duan@server ~]$ ansible server2 -m debug -a "msg='hello ansible'"
server2 | SUCCESS =>{"msg": "hello ansible"
[lduan@server ~]$

29.16 使用script 模块在远端执行脚本

如果在本地写了一个脚本,想在所有被管理节点上执行,没有必要事先把脚本分发到被管理机器上,使用script 模块即可快速实现。

先写一个简单的脚本 test1.sh 用于显示主机名,内容如下。

[lduan@server ~]$ cat test1.sh
#!/bin/bash
hostname
[1duaneserver ~]$ 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 ~]$

这样本地脚本直接在所有被管理主机上执行了。

29.17 使用group模块对组进行管理

如果对系统的组进行管理,那么可以使用group模块。group模块常见的参数包括以下几个。

(1) name: 指定组名。

(2) state: 此参数的值如下。

① present:用于创建组。

② absent: 用于删除组。

下面在 server2上创建组 group1。

先判断 server2 上是否存在 group1, 命令如下。

[root@server2 ~]# grep group1 /etc/group
[rooteserver2 ~]#

没有任何输出,说明 server2上是没有 group1 这个组的。下面创建组 group1 命令如下。

[1duaneserver ~]$ ansible server2 -m group -a "name=group1 state=present" 
server2 | CHANGED =>{
. . . 输 出 . . .
}
[lduan@server ~]$

然后切换到 server2上进行验证,命令如下。

[rooteserver2 ~]# grep group /etc/group
group1:x:1003:
[root@server2  ~]#

删除这个组,命令如下。

[lduan@server ~]$ ansible server2 -m group -a "name=group1 state=absent" 
server2 |CHANGED =>{
. . . 输 出 . . .
}
[lduan@server ~]$

29.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 命令切换到任何用户都不需要密码,所以这里先切换到lduan 用户,然后再切换到lisi用户,测试密码是不是正确。

[root@server2 ~]# su -lduan
[lduan@server2 ~]$ su -lisi
密码: haha001
[lisi@server2 ~]$ exit
注销
[lduan@server2 ~]$ exit
注销
[root@server2 ~]#

可以看到,用户的密码是 haha001。

下面把 lisi 用户删除,命令如下。

[1duan@server ~]$ ansible server2 -m user -a "name=lisi state=absent remove=yes"
server2  | CHANGED =>{
...输出...
[lduan@server ~]$

这 里 remove=yes 的意思类似于 userdel 中 的 -r 选项,删除用户的同时把家目录也删除。

29.19 使用get_url 模块下载文件

如果想从服务器上下载到被管理机器上,需要使用到 get_url 模块。get_url 模块常见的参 数包括以下几个。

(1) url: 指定文件的 URL 连接。

(2) dest: 指定存储在哪里。

例如,现在要把 ftp://ftp.rhce.cc/auto/web.tar.gz下载到 scrver2 的/opt 目录中,命令如下。

[1duan@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 ~]#

可以看到,已经把文件下载下来了。

29.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
}

如果仅仅想获取IP地址信息,其他网络信息不需要,可以通过ansible_default_ipv4 的子键来获取,命令如下。

[1duan@server ~]$ ansible server2 -m setup -a "filter=ansible_default_ipv4.address" server2  | SUCCESS  =>{"ansible_facts":{urscuvered_interpreter_python":"/usr/libexec/platform-python" },"changed":false
[lduan@server ~]$

不过在命令行中如果 filter 含有子键,结果是不会显示的,所以上面的命令没有看到 IP。不过如果把这个键写入 playbook, 是会显示值的,关于 playbook 后面会讲。

作业

  1. 在 ansible 主机上执行一条命令,获取 server2 的总内存大小。
  2. 在 ansible 主机上通过setup 模块,获取 server2的主机名。
  3. 把 ansible主机上的/etc/issue文件拷贝到 server2的 /opt目录中,命名为 myissue,所有者为lduan, 所属组为 users,权限为444, SELinux的上下文为htpd_sys_content_t。
  4. 在 server2 上安装 vsftpd 服务(请自行配置好 yum 源)。
  5. 在 server2 上启动 smb服务,并设置开机自动启动。
  6. 在 server2 上配置 firewalld, 放行 samba服务,重启系统也能生效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/769539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每秒批量插入10000条数据到MySQL中,资源消耗(带宽、IOPS)有多少?

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容起因代码资源情况改造 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、…

LeetCode每日一题[c++]-322.零钱兑换

题目描述 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无…

照片变动图怎么操作?一招在线转换

GIF动画是一种特殊的图像文件格式&#xff0c;它可以在一张图像中显示多个图像帧&#xff0c;并以循环播放的方式展示&#xff0c;从而实现动态效果。由于GIF格式的广泛支持和较小的文件大小&#xff0c;它成为了互联网上常见的动画格式之一。想要制作gif动画图片可以使用Gif制…

链动2+1模式 完全合法合规 不存在传销问题!!

在商业经营中&#xff0c;营销策略的巧妙运用对于提升产品销量和扩大品牌影响力至关重要。然而&#xff0c;企业在制定和执行营销策略时&#xff0c;必须严格遵循法律法规&#xff0c;以免陷入法律风险。本文将着重探讨链动21模式的法律要素&#xff0c;以论证其合规性。 一、链…

穿越地心:3D可视化技术带你领略地球内部奇观

在广袤无垠的宇宙中&#xff0c;地球是一颗充满生机与奥秘的蓝色星球。我们每天都生活在这颗星球上&#xff0c;感受着它的温暖与恩赐&#xff0c;却往往忽略了它深邃的内部世界。 想象一下&#xff0c;你能够穿越时空&#xff0c;深入地球的核心&#xff0c;亲眼目睹那些亿万年…

nodeJs中实现连表查询

nodeJs中实现连表查询 router.post(/getOrder, async function(req, res, next) {let userId req.body.phone;let sql select * from orders where userId?;let orders await new Promise((resolve, reject) > {connection.query(sql, [userId], function(error, resul…

MapReduce配置和Yarn的集群部署

一、集群环境&#xff0c;还是如下三台服务器 192.168.32.101 node1192.168.32.102 node2192.168.32.103 node3 二、YARN架构 YARN&#xff0c;主从架构&#xff0c;有2个角色 主&#xff08;Master&#xff09;角色&#xff1a;ResourceManager从&#xff08;Slave&#x…

【Redis教程0x04】详解Redis的4个高级数据类型

引言 在【Redis教程0x03】中&#xff0c;我们介绍了Redis中常用的5种基础数据类型&#xff0c;我们再来回顾一下它们的使用场景&#xff1a; String&#xff1a;存储对象、url、计数、分布式锁&#xff1b;List&#xff1a;消息队列&#xff1b;Hash&#xff1a;存储对象、购…

ChatGPT论文指南|ChatGPT论文写作过程中6个润色与查重口诀!【建议收藏】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 公众号原文▼▼▼▼&#xff1a; ChatGPT论文指南|ChatGPT论文写作过程中6个润色与查重口诀&#xff01;【建议收藏】 目录 1.润色与查重口诀 2.AIPaperPass智能论文写作平台 论文完成…

商机在线互动营销— —Pushmall智能AI数字名片

商机在线互动营销— —Pushmall智能AI数字名片 开发计划 2024年2月开发计划&#xff1a; 1、优化名片注册、信息完善业务流程&#xff1b; 2、重构供应信息、需求信息发布。 3、会员名片地理位置服务优化‘ 4、企业名片&#xff1a;员工管理优化 5、CRM客户资源管理设计。 已…

基础小白十天学会linux------linux的指令

1.图形界面使用shell命令 2.字符界面使用shell命令 3.shell命令一般格式&#xff1a;命令名选项参数&#xff0c;命令名一般是英文全称的缩写&#xff0c;选项前导符以-、--开头&#xff0c;还可以没有前导符 字符界面截屏要求&#xff1a; 1) 启动计算机&#xff0c;以超级用…

nodejs的线程模型和libuv库的基本使用

文章目录 nodejs中集成addon本地代码的回调问题单线程事件驱动模型libuvlibuv基本框架addon中使用libuv代码nodejs中集成addon本地代码的回调问题 在C++的代码中,回调函数是一个基本的代码调用方式。而在我自己的开发实践中,需要在addon这样一个nodejs的本地化模块中实现一个…

新手摄影笔记-基础知识-按键和参数说明【1】

1. 相机正反面 2.顶部 3.屏幕 4.光圈、快门、感光度 什么是景深呢&#xff1f;景深就是照片中清晰和模糊的范围&#xff0c;也就是前后的距离。景深越深&#xff0c;意味着照片中清晰的范围越大&#xff0c;前后的距离越长&#xff0c;背景越清晰。景深越浅&#xff0c;意味着照…

加密算法概述:分类与常见算法

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在信息安全领域&#xff0c;加密技术是保护数据不被未授权访问的关键手段。Java作为一种广泛使用的编程语言&#xff0c;提供了丰…

【自然语言处理七-经典论文-attention is all you need】

然语言处理七-经典论文-attention is all you need 摘要原文译文小结 1&#xff1a;引言原文译文小结 2&#xff1a;背景原文译文小结 3&#xff1a;模型架构原文译文小结 3.1 编码器和解码器原文译文小结 3.2 注意力原文译文小结3.2.1 缩放点积注意力原文总结 3.2.2 多头注意力…

Git命令及GUI基本操作

不习惯使用Git命令的可移步下面Git GUI基本操作 Git 常用命令 git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支 git branch -r 查看本地所有分支 git commit -am "init" 提交并且加注释 git remote add orig…

美国socks5动态IP代理如何提升网络效率?

在探讨美国socks5代理动态IP的奥秘之前&#xff0c;我们需要先深入理解其背后的基本概念和原理。Socks5代理是一种先进的网络协议&#xff0c;它像一位中转站&#xff0c;默默地帮用户转发网络请求。它让网络流量得以通过代理服务器传输&#xff0c;进而隐藏用户的真实IP地址。…

rust - 对文件进行zip压缩加密

本文提供了一种对文件进行zip压缩并加密的方法。 生成可见的加密密码 use rand::Rng;const CHARSET: &[u8] b"ABCDEFGHIJKLMNOPQRSTUVWXYZ\ abcdefghijklmnopqrstuvwxyz\ 0123456789)(*&^%$#!~";pub fn random_string(len: usize) -> String {let mut …

仿牛客网开发笔记

01.用到的 一些 核心技术 1 Spring Framework Spring Core IOC 、AOP > 管理对象的一种思想 IOC > 面向对象的管理思想 AOP > 面向切面的管理思想Spring Data Access 》访问数据库的功能 Transaction、Spring MyBatis Transaction 》管理事务Spring MyBat…

人、机中的幻觉和直觉

对于人类而言&#xff0c;幻觉和直觉是两种不同的心理现象。幻觉是一种错误的感知或体验&#xff0c;而直觉是一种在没有明显依据的情况下产生的直观认知。这两种概念在心理学和认知科学中具有不同的意义和研究对象。 人类幻觉是指个体在感知或体验上出现的错误&#xff0c;即看…