RHEL8_Linux_Ansible常用模块的使用
本章主要介绍Ansible中最常见模块的使用
- shell模块
- 文件管理模块
- 软件包管理模块
- 服务管理模块
- 磁盘管理模块
- 用户管理模块
- 防火墙管理模块
ansible 机器名 -m 模块x -a "模块的参数"
[blab@node01 ~]$ ansible-doc -l
a10_server Manage A10 Ne.>
a10_server_axapi3 Manage A10 Ne.>
a10_service_group Manage A10 Ne.>
ansible-doc 模块名
1.shell模块
ansible 主机组 -m shell -a "系统命令"
1)在node02上执行hostname命令,命令如下。
[blab@node01 ~]$ ansible node02 -m shell -a "hostname"
node02 | CHANGED | rc=0 >>
node02
[blab@node01 ~]$
2)在 node02上执行一个错误的命令,命令如下。
[blab@node01 ~]$ ansible node02 -m shell -a "hostnamexxx"
node02 | FAILED | rc=127 >>
/bin/sh: hostnamexxx: 未找到命令non-zero return code
[blab@node01 ~]$
2.文件管理的file模块
- path:用于指定文件/目录的路径,此选项可以用name或dest替代。
- state:指定行为。
- touch:创建文件。
- directory:创建目录。
- file:对已存文件进行修改。
- absent:删除。
- link:软链接。
- hard:硬链接。
- 其他参数:owner指定所有者,group指定所属组,mode指定权限,setype指定上下文。
1)在node02上创建一个文件/opt/hosts,并设置所有者为root,所属组为tom,权限为444,命令如下。
[blab@node01 ~]$ ansible node02 -m file -a "path=/opt/hosts owner=root group=tom mode=444 state=touch"
node02 | 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
}
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m shell -a "ls -l /opt/hosts"
node02 | CHANGED | rc=0 >>
-r--r--r--. 1 root tom 0 12月 15 11:53 /opt/hosts
[blab@node01 ~]$
2)为/opt/hosts创建一个软链接/opt/hosts123,命令如下。
[blab@node01 ~]$ ansible node02 -m file -a "src=/opt/hosts dest=/opt/hosts123 state=link"
node02 | 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
}
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m shell -a "ls -l /opt"
node02 | CHANGED | rc=0 >>
总用量 0
-r--r--r--. 1 root tom 0 12月 15 11:53 hosts
lrwxrwxrwx. 1 root root 10 12月 15 11:54 hosts123 -> /opt/hosts
[blab@node01 ~]$
3)删除/opt/hosts123,命令如下
[blab@node01 ~]$ ansible node02 -m file -a "name=/opt/hosts123 state=absent"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"path": "/opt/hosts123","state": "absent"
}
[blab@node01 ~]$
4)创建目录/op/xx,上下文设置为default_t,命令如下。
[blab@node01 ~]$ ansible node02 -m file -a "name=/opt/xx state=directory setype=default_t"
node02 | 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
}
[blab@node01 ~]$
验证
[blab@node01 ~]$ ansible node02 -m shell -a "ls -dZ /opt/xx"
node02 | CHANGED | rc=0 >>
unconfined_u:object_r:default_t:s0 /opt/xx
[blab@node01 ~]$
5)把/opt/hosts的权限改成000,所有者改成tom,所属组改成users,
[blab@node01 ~]$ ansible node02 -m file -a "name=/opt/hosts owner=tom group=users mode=000"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"gid": 100,"group": "users","mode": "0000","owner": "tom","path": "/opt/hosts","secontext": "unconfined_u:object_r:usr_t:s0","size": 0,"state": "file","uid": 1002
}
[blab@node01 ~]$
验证
[blab@node01 ~]$ ansible node02 -m shell -a "ls -l /opt/hosts"
node02 | CHANGED | rc=0 >>
----------. 1 tom users 0 12月 15 11:53 /opt/hosts
[blab@node01 ~]$
注意:指定文件使用name或path都是可以的
6)清空node02 上/opt中所有的内容,命令如下。
[blab@node01 ~]$ ansible node02 -m shell -a "rm -rf /opt/*"
[WARNING]: Consider using the file module with state=absent rather than running
'rm'. If you need to use command because file is insufficient you can add
'warn: false' to this command task or set 'command_warnings=False' in
ansible.cfg to get rid of this message.
node02 | CHANGED | rc=0 >>[blab@node01 ~]$
验证:
[blab@node01 ~]$ ansible node02 -m shell -a "ls /opt/"
node02 | CHANGED | rc=0 >>[blab@node01 ~]$
3.copy和fetch模块
ansible 主机组 -m copy -a "src=/path1/file1 dest=path2/"
- src:源文件
- dest:目的地,即拷贝到哪里
- owner:所有者
- group:所属组
- mode:权限
1.copy模块
1)把本地的文件/etc/ansible/hosts拷贝到目标机器的/opt目录中,并设置权限为000,所有者为tom,命令如下。
[blab@node01 ~]$ ansible node02 -m copy -a "src=/etc/ansible/hosts mode=000 owner=tom dest=/opt"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"checksum": "da996f1a52dbae3b6b43a6c50d761e4ed5ec9a9f","dest": "/opt/hosts","gid": 0,"group": "root","md5sum": "1564b951dc7c8511c6f9ee842653c541","mode": "0000","owner": "tom","secontext": "system_u:object_r:usr_t:s0","size": 1016,"src": "/home/blab/.ansible/tmp/ansible-tmp-1702614292.969332-5748-241468010987805/source","state": "file","uid": 1002
}
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m shell -a "ls -l /opt/hosts"
node02 | CHANGED | rc=0 >>
----------. 1 tom root 1016 12月 15 12:24 /opt/hosts
[blab@node01 ~]$
2)在被管理机器的/opt目录中创建11.txt,内容为123123,命令如下。
[blab@node01 ~]$ ansible node02 -m copy -a 'content="123123" dest=/opt/11.txt '
node02 | 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-1702614452.0289679-5825-32381171106061/source","state": "file","uid": 0
}
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m shell -a "cat /opt/11.txt"
node02 | CHANGED | rc=0 >>
123123
[blab@node01 ~]$
2.fetch模块
1)fetch用于把文件从被管理机器拷贝到本机当前目录中,命令如下。
[blab@node01 ~]$ ansible node02 -m fetch -a "src=/opt/hosts dest=./"
node02 | CHANGED => {"changed": true,"checksum": "da996f1a52dbae3b6b43a6c50d761e4ed5ec9a9f","dest": "/home/blab/node02/opt/hosts","md5sum": "1564b951dc7c8511c6f9ee842653c541","remote_checksum": "da996f1a52dbae3b6b43a6c50d761e4ed5ec9a9f","remote_md5sum": null
}
[blab@node01 ~]$
2)查看
[blab@node01 ~]$ tree node02
node02
└── opt└── hosts1 directory, 1 file
[blab@node01 ~]$
4.yum_repository模块
[root@node01 ~]# cat /etc/yum.repos.d/aa.repo
[aa]
name=aa
baseurl=file:///mnt/AppStream
enabled=1
gpgcheck=0[bb]
name=bb
baseurl=///mnt/BaseOS
enabled=1
gpgcheck=0
[root@node01 ~]#
- name:此 yum 源的描述信息
- baseurl:用于指定yum源的具体地址‘
- enabled:用于指定是否启用次yum源
- gpgcheck:用于指定在安装软件包是,是否要进行数字签名的验证,一般设置为0即可
- gpgkey:在gpgcheck设置为1的情况下,用于指定公钥的位置对于yum_repository模块来说,常见的参数包括以下几个:
1)给node02配置yum源,地址是ftp://192.168.182.200/dvd/AppStream,所需要的密钥文件为ftp://192.168.8.11/dvd/RPM-GPG-KEY-redhat-release,命令如下。
[blab@node01 ~]$ ansible node02 -m yum_repository -a "name=app description='this is appstream' baseurl=ftp://192.168.182.200/dvd/AppStream gpgcheck=yes gpgkey=ftp://192.168.182.200/dvd/RPM-GPG-KEY-redhat-release"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"repo": "app","state": "present"
}
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m shell -a "ls /etc/yum.repos.d"
node02 | CHANGED | rc=0 >>
aa.repo
app.repo
redhat.repo
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m shell -a "cat /etc/yum.repos.d/app.repo"
node02 | CHANGED | rc=0 >>
[app]
baseurl = ftp://192.168.182.200/dvd/AppStream
gpgcheck = 1
gpgkey = ftp://192.168.182.200/dvd/RPM-GPG-KEY-redhat-release
name = this is appstream
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m yum_repository -a "name=baseos description='this is baseos' baseurl=ftp://192.168.182.200/dvd/BaseOS gpgcheck=yes gpgkey=ftp://192.168.182.200/dvd/RPM-GPG-KEY-redhat-release"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"repo": "baseos","state": "present"
}
[blab@node01 ~]$
1.使用yum模块管理软件包
yum模块常见的参数包括以下几个:
- name:用于指定软件包的名称
- state:此参数的值如下:
①present或installed:用于安装软件包,没有指定state时的默认值就是installed。
②absent或removed:用于卸载软件包。
注意:yum模块可以用package模块替代,用于在 Ubuntu等其他系统上管理软件包。
练习1:在node02上安装vsftpd,命令如下。
[blab@node01 ~]$ ansible node02 -m yum -a "name=vsftpd state=installed"
node02 | 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"]
}
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m shell -a "rpm -qa | grep vsftpd"
[WARNING]: Consider using the yum, dnf or zypper module rather than running
'rpm'. If you need to use command because yum, dnf or zypper is insufficient
you can add 'warn: false' to this command task or set 'command_warnings=False'
in ansible.cfg to get rid of this message.
node02 | CHANGED | rc=0 >>
vsftpd-3.0.3-34.el8.x86_64
[blab@node01 ~]$
练习2:在server2上卸载vsftpd,命令如下。
[blab@node01 ~]$ ansible node02 -m yum -a "name=vsftpd state=absent"
node02 | 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"]
}
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m yum -a "name=vsftpd state=latest"
练习3:安装 RPM开发工具,命令如下。
[blab@node01 ~]$ ansible node02 -m yum -a "name='@开发工具' state=installed"
node02 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": false,"msg": "Nothing to do","rc": 0,"results": ["Group development installed."]
}
[blab@node01 ~]$
5.使用service 模块管理任务
- name:指定对哪个服务进行管理
- enabled:用于设置此服务是否开机自动启动,值为yes或no,默认值为空
- state:用于启动或关闭服务,其值包括started,stopped,restarted等
[blab@node01 ~]$ ansible node02 -m shell -a "systemctl is-active vsftpd"
node02 | FAILED | rc=3 >>
inactivenon-zero return code
[blab@node01 ~]$
练习1:启动vsftpd并设置开机自动启动,命令如下。
[blab@node01 ~]$ ansible node02 -m service -a "name=vsftpd state=started enabled=yes"
验证:
[blab@node01 ~]$ ansible node02 -m shell -a "systemctl is-active vsftpd"
node02 | CHANGED | rc=0 >>
active
[blab@node01 ~]$
[root@node02 ~]# systemctl is-active vsftpd
active
[root@node02 ~]#
6.使用parted模块对硬盘分区
- device:指定是哪块磁盘
- number:第几个分区
- part_start:指的是从硬盘的什么位置开始划分,不写默认为从头开始(0%)
- part_end:指的是到硬盘的什么位置作为分区的结束点
- state:用于指定操作,present是创建,absent是删除
练习1:在server2上对/devIsdb创建一个大小为2GiB的分区/dev/sdb1,命令如下。
[blab@node01 ~]$ ansible node02 -m parted -a "device=/dev/sda number=1 part_end=2GiB state=present"
[blab@node01 ~]$ ansible node02 -m shell -a "lsblk"
node02 | CHANGED | rc=0 >>
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
└─sda1 8:1 0 2G 0 part //可以看到添加成功
sr0 11:0 1 10.2G 0 rom
nvme0n1 259:0 0 30G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 29G 0 part ├─rhel-root 253:0 0 26G 0 lvm /└─rhel-swap 253:1 0 3G 0 lvm [SWAP]
[blab@node01 ~]$
练习2:在server2上对/dev/sdb创建一个大小为2GB的分区/dev/sdb2,命令如下。
[blab@node01 ~]$ ansible node02 -m parted -a "device=/dev/sda number=2 part_start=2GiB part_end=4GiB state=present"
[blab@node01 ~]$ ansible node02 -m shell -a "lsblk"
node02 | CHANGED | rc=0 >>
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 2G 0 part
└─sda2 8:2 0 2G 0 part //可以看到第二个已经创建成功
sr0 11:0 1 10.2G 0 rom
nvme0n1 259:0 0 30G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 29G 0 part ├─rhel-root 253:0 0 26G 0 lvm /└─rhel-swap 253:1 0 3G 0 lvm [SWAP]
[blab@node01 ~]$
练习3:删除node02上的/dev/sda2,命令如下。
[blab@node01 ~]$ ansible node02 -m parted -a "device=/dev/sda number=2 state=absent"
验证:
[blab@node01 ~]$ ansible node02 -m shell -a "lsblk"
node02 | CHANGED | rc=0 >>
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
└─sda1 8:1 0 2G 0 part
sr0 11:0 1 10.2G 0 rom
nvme0n1 259:0 0 30G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 29G 0 part ├─rhel-root 253:0 0 26G 0 lvm /└─rhel-swap 253:1 0 3G 0 lvm [SWAP]
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m shell -a "lsblk"
node02 | CHANGED | rc=0 >>
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 2G 0 part
├─sda2 8:2 0 2G 0 part
└─sda3 8:3 0 2G 0 part
7.使用filesystem模块格式化
练习1:把 node02上的/dev/sda3格式化为XFS文件系统,命令如下。
[blab@node01 ~]$ ansible node02 -m filesystem -a "dev=/dev/sda3 fstype=xfs"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true
}
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m filesystem -a "dev=/dev/sda3 fstype=xfs force=yes"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true
}
[blab@node01 ~]$
8.使用mount 模块挂载文件系统
- src:用于指定挂载哪个设备
- path:用于指定挂载点
- fstype:用于指定挂载问年间系统,这个选项一定要指定
- opts:用于指定挂载选项,如果不指定则为default
- state:此参数的值如下:
练习1:把node02上的/dev/sda3挂载到/123目录上,挂载选项为只读,命令如下。
[blab@node01 ~]$ ansible node02 -m shell -a "mkdir /123"
[blab@node01 ~]$ ansible node02 -m mount -a "src=/dev/sda3 path=/123 state=mounted fstype=xfs opts=defaults,ro"
node02 | 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/sda3"
}
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m shell -a "df -Th | grep sda3"
node02 | CHANGED | rc=0 >>
/dev/sda3 xfs 2.0G 256K 2.0G 1% /123
[blab@node01 ~]$
练习2:在node02上卸载并从/etc/fstab中删除/dev/sda3,命令如下。
[blab@node01 ~]$ ansible node02 -m mount -a "src=/dev/sda3 path=/123 state=absent"
node02 | 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/sda3"
}
[blab@node01 ~]$
9.使用lvg模块对卷组进行管理
- pvs:用于指定物理卷,如果有多个PV则用逗号隔开,不需要提前创建PV,此命令会自动创建PV
- vg:用以指定卷组的名称
- pesize:用于指定PE的大小
- state:此参数的值如下:present :用于创建卷组,默认。absent :用于删除卷组。
练习1:在node02上创建名称为vg0的卷组,所使用的分区为/dev/sda1和/dev/sda2/pesize指定为16M。
1)先确认node02上不存在任何PV 和VG,命令如下 这里之前实验存在一个不用管。
[blab@node01 ~]$ ansible node02 -m shell -a "vgs"
node02 | CHANGED | rc=0 >>VG #PV #LV #SN Attr VSize VFreerhel 1 2 0 wz--n- <29.00g 0
[blab@node01 ~]$
2)开始创建vg0,命令如下
[blab@node01 ~]$ ansible node02 -m lvg -a "pvs=/dev/sda1,/dev/sda2 vg=vg0 pesize=16 state=present"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true
}
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m shell -a "vgs"
node02 | CHANGED | rc=0 >>VG #PV #LV #SN Attr VSize VFree rhel 1 2 0 wz--n- <29.00g 0 vg0 2 0 0 wz--n- <3.97g <3.97g
[blab@node01 ~]$
练习2:删除卷组 vg0,命令如下。
[blab@node01 ~]$ ansible node02 -m lvg -a "vg=vg0 pesize=16 state=absent"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true
}
[blab@node01 ~]$
验证:
[blab@node01 ~]$ ansible node02 -m shell -a "vgs"
node02 | CHANGED | rc=0 >>VG #PV #LV #SN Attr VSize VFreerhel 1 2 0 wz--n- <29.00g 0
[blab@node01 ~]$
请使用ansible node02 -m lvg -a "pvs=ldev/sda1,/dev/sda2 vg-vg0 pesize=16state-present"命令再次把vg0创建出来。
10.使用lvol模块管理逻辑卷
- vg:用于指定在哪个卷组上划分逻辑卷
- lv:用于指定逻辑卷的名称
- size:用于指定逻辑卷的大小
- state:此参数的值如下:present :用于创建逻辑卷。absent :用于删除逻辑卷。
练习1:在node02的卷组 vg0上,创建大小为1G、名称为lv0的逻辑卷。
1)先判断node02上是否存在逻辑卷,命令如下。
[blab@node01 ~]$ ansible node02 -m shell -a 'lvs'
node02 | CHANGED | rc=0 >>[blab@node01 ~]$
2)可以看到,不存在任何逻辑卷。下面开始创建逻辑卷,命令如下。
[blab@node01 ~]$ ansible node02 -m lvol -a "vg=vg0 lv=lv0 size=1G"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"msg": ""
}
[blab@node01 ~]$
3)验证:
[blab@node01 ~]$ ansible node02 -m shell -a "lvs"
node02 | CHANGED | rc=0 >>LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv0 vg0 -wi-a----- 1.00g
[blab@node01 ~]$
可以看到,此逻辑卷已经创建出来了。
练习2:在node2上删除逻辑卷/dev/vg0/lv0,命令如下。
[blab@node01 ~]$ ansible node02 -m lvol -a "vg=vg0 lv=lv0 state=absent force=yes"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true
}
[blab@node01 ~]$
11.使用firewalld模块管理防火墙
- service:开放某个服务
- port:开放某个端口,用法为port=80/tcp
- permanent=yes:设置永久生效,不存在默认值
- immediate=yes:设置当前生效,默认为不生效
- state:此参数如下: ①enabled:用于创建规则。②disabled:用于删除规则。
- rich_rule:富规则
练习1:在node2上开放服务http,命令如下。
[blab@node01 ~]$ ansible node02 -m firewalld -a "service=http immediate=yes permanent=yes state=enabled"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"msg": "Permanent and Non-Permanent(immediate) operation, Changed service http to enabled"
}
[blab@node01 ~]$
2)验证
[blab@node01 ~]$ ansible node02 -m shell -a "firewall-cmd --list-all"
node02 | CHANGED | rc=0 >>
public (active)target: defaulticmp-block-inversion: nointerfaces: ens160sources: services: cockpit dhcpv6-client http ssh //可以看到已经添加http服务ports: protocols: forward: nomasquerade: noforward-ports: source-ports: icmp-blocks: rich rules:
[blab@node01 ~]$
练习2:在node02上配置防火墙,允许tcp端口808通过,命令如下。
[blab@node01 ~]$ ansible node02 -m firewalld -a"port=808/tcp immediate=yes permanent=yes state=enabled"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"msg": "Permanent and Non-Permanent(immediate) operation, Changed port 808/tcp to enabled"
}
[blab@node01 ~]$
验证:
[blab@node01 ~]$ ansible node02 -m shell -a "firewall-cmd --list-all"
node02 | CHANGED | rc=0 >>
public (active)target: defaulticmp-block-inversion: nointerfaces: ens160sources: services: cockpit dhcpv6-client http sshports: 808/tcp //可以看到端口已经添加protocols: forward: nomasquerade: noforward-ports: source-ports: icmp-blocks: rich rules:
[blab@node01 ~]$
练习3:在node02上配置防火墙,删除开放的端口808和服务http,命令如下。
[blab@node01 ~]$ ansible node02 -m firewalld -a "port=808/tcp immediate=yes permanent=yes state=disabled"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"msg": "Permanent and Non-Permanent(immediate) operation, Changed port 808/tcp to disabled"
}
[blab@node01 ~]$
12.替换模块replace
- path:指明编辑的文件
- regexp:正则表达式,指定要替换的字符
- replace:替换后的字符
练习1:把node02 上 /opt/aa.txt中开头为aa那行的内容替换为xx=666。
1)在node02的lopt目录中创建aa.txt,内容如下。
[root@node02 ~]# cat /opt/aa.txt
aa=111
bb=222
[root@node02 ~]#
2)在ansible主机上执行replace模块,命令如下。
[blab@node01 ~]$ ansible node02 -m replace -a "path=/opt/aa.txt regexp=aa=111 replace=xx=666"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"msg": "1 replacements made"
}
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m shell -a "cat /opt/aa.txt"
node02 | CHANGED | rc=0 >>
xx=666
bb=222
[blab@node01 ~]$
练习2:把 node02上 /opt/aa.txt中开头为bb那行的内容替换为xx=666,命令如下。
[blab@node01 ~]$ ansible node02 -m replace -a "path=/opt/aa.txt regexp=^bb.+ replace=xx=666"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"msg": "1 replacements made"
}
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m shell -a "cat /opt/aa.txt"
node02 | CHANGED | rc=0 >>
xx=666
xx=666
[blab@node01 ~]$
13.替换模块lineinfile
练习1:把node02 上/opt/bb.txt中开头为aa=111那行的内容替换为xx=666。
1)在node02上创建文件/opt/bb.txt,内容如下。
[root@node02 ~]# cat /opt/bb.txt
aa=111
bb=222
[root@node02 ~]#
2)在ansible主机上执行lineinfile模块,命令如下。
[blab@node01 ~]$ ansible node02 -m lineinfile -a "path=/opt/bb.txt regexp=^aa line=xx=666"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"backup": "","changed": true,"msg": "line replaced"
}
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m shell -a "cat /opt/bb.txt"
node02 | CHANGED | rc=0 >>
xx=666
bb=222
[blab@node01 ~]$
14.打印模块debug
- msg:后面跟具体内容
- var:后面跟变量
注意:var 和 msg 不可以同时使用
练习:在server2上打印“111”,命令如下。
[blab@node01 ~]$ ansible node02 -m debug -a "msg='hello luo'"
node02 | SUCCESS => {"msg": "hello luo"
}
[blab@node01 ~]$
15.使用script模块在远端执行脚本
1)先写一个简单的脚本test1.sh 用于显示主机名,内容如下。
[blab@node01 ~]$ cat test1.sh
#!/bin/bash
hostname
[blab@node01 ~]$ chmod +x test1.sh
[blab@node01 ~]$
2)下面在db1主机组上执行,命令如下。
[blab@node01 ~]$ ansible db1 -m script -a "./test1.sh"
node02 | CHANGED => {"changed": true,"rc": 0,"stderr": "Shared connection to node02 closed.\r\n","stderr_lines": ["Shared connection to node02 closed."],"stdout": "node02\r\n","stdout_lines": ["node02"]
}
16.使用group模块对组进行管理
- name:指定组名
- state:此三处的值如下 ①present:用于创建组。②absent:用于删除组。
1)先判断node02上是否存在group1,命令如下。
[root@node02 ~]# grep group1 /etc/group
[root@node02 ~]#
2)没有任何输出,说明node02上是没有group1这个组的。下面创建组group1,命令如下。
[blab@node01 ~]$ ansible node02 -m group -a "name=group1 state=present"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"gid": 1003,"name": "group1","state": "present","system": false
}
[blab@node01 ~]$
3)然后切换到node02上进行验证,命令如下。
[root@node02 ~]# grep group1 /etc/group
group1:x:1003:
[root@node02 ~]#
4)删除这个组,命令如下。
[blab@node01 ~]$ ansible node02 -m group -a "name=group1 state=absent"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"name": "group1","state": "absent"
}
[blab@node01 ~]$
17.使用user模块对用户进行管理
- name:指定用户名
- comment:指定注释信息
- group:指定用户的主组
- groups:指定用户的附属组
- password:指定密码,但是必须对密码进行加密
- state:此参数值如下 ①present:用于创建用户。②absent:用于删除用户。
1)下面创建一个用户lisi
[blab@node01 ~]$ ansible node02 -m user -a "name=lisi group=root password=123456 state=present"
[WARNING]: The input password appears not to have been hashed. The 'password'
argument must be encrypted for this module to work properly.
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"comment": "","create_home": true,"group": 0,"home": "/home/lisi","name": "lisi","password": "NOT_LOGGING_PASSWORD","shell": "/bin/bash","state": "present","system": false,"uid": 1003
}
[blab@node01 ~]$
[root@node02 ~]# su - lisi
[lisi@node02 ~]$ exit
注销
[root@node02 ~]#
2)下面把lisi用户删除,命令如下。
[blab@node01 ~]$ ansible node02 -m user -a "name=lisi state=absent remove=yes"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"force": false,"name": "lisi","remove": false,"state": "absent"
}
[blab@node01 ~]$
18.使用get url模块下载文件
- url:指定文件的URL连接
- dest:指定存储在哪里
[blab@node01 ~]$ ansible node02 -m get_url -a "url=ftp://ftp.rhce.cc/auto/web.tar.gz dest=/opt/"
node02 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"checksum_dest": null,"checksum_src": "0453d8c9e9ce9bda838b659b901b74a2e709fb15","dest": "/opt/web.tar.gz","elapsed": 1,"gid": 0,"group": "root","md5sum": "41c019324f7b8160ce6944102a755de8","mode": "0644","msg": "OK (1406 bytes)","owner": "root","secontext": "system_u:object_r:usr_t:s0","size": 1406,"src": "/home/blab/.ansible/tmp/ansible-tmp-1702885918.9421644-8590-163172471685725/tmpy3h7y39h","state": "file","status_code": null,"uid": 0,"url": "ftp://ftp.rhce.cc/auto/web.tar.gz"
}
[blab@node01 ~]$
[root@node02 ~]# ls /opt/
11.txt aa.txt bb.txt hosts web.tar.gz
[root@node02 ~]#
19.使用setup模块获取被管理主机信息
[blab@node01 ~]$ ansible node02 -m setup
1 键 1 : 值2 键 2 :{3 子键 a : 值 a4 子键 b : 值 b5 ...6 }
[blab@node01 ~]$ ansible node02 -m setup -a "filter=ansible_bios_version"
node02 | SUCCESS => {"ansible_facts": {"ansible_bios_version": "6.00","discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": false
}
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m setup -a "filter=ansible_default_ipv4"
node02 | SUCCESS => {"ansible_facts": {"ansible_default_ipv4": {"address": "192.168.182.193","alias": "ens160","broadcast": "192.168.182.255","gateway": "192.168.182.2","interface": "ens160","macaddress": "00:0c:29:ba:79:52","mtu": 1500,"netmask": "255.255.255.0","network": "192.168.182.0","type": "ether"},"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": false
}
[blab@node01 ~]$
[blab@node01 ~]$ ansible node02 -m setup -a "filter=ansible_default_ipvs.address"
node02 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": false
}
[blab@node01 ~]$
相关文章:

RHEL8_Linux_Ansible常用模块的使用
本章主要介绍Ansible中最常见模块的使用 shell模块文件管理模块软件包管理模块服务管理模块磁盘管理模块用户管理模块防火墙管理模块 ansible的基本用法如下。 ansible 机器名 -m 模块x -a "模块的参数" 对被管理机器执行不同的操作,只需要调用不同的模块…...

2023 英特尔On技术创新大会直播 | AI 融合发展之旅
前言 2023 年的英特尔 On 技术创新大会中国站,主要聚焦最新一代增强 AI 能力的计算平台,深度讲解如何支持开放、多架构的软件方案,以赋能人工智能并推动其持续发展。 大会的目标之一是优化系统并赋能开发者,特别注重芯片增强技术…...

【JavaWeb】往浏览器打印一个hello world
上集:建一个web项目 第一步:建好Servlet类的文件 右键src,建一个class 就行 第二步:编代码 可以直接复制粘贴 用来测试的类 import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; //↓是注解࿰…...

技术探秘:在RISC Zero中验证FHE——由隐藏到证明:FHE验证的ZK路径(1)
1. 引言 开源代码实现见: https://github.com/hashcloak/fhe_risc0_zkvm(Rust)https://github.com/weikengchen/vfhe-profiled(Rust)https://github.com/l2iterative/vfhe0(Rust) L2IV Resea…...

Spring容器中scope为prototype类型Bean的回收机制
文章目录 一、背景二、AutowireCapableBeanFactory 方法 autowireBean 分析三、Spring 容器中 scope 为 prototype 类型 Bean 的回收机制四、总结 一、背景 最近做 DDD 实践时,遇到业务对象需要交给 Spring 管理才能做一些职责内事情。假设账号注册邮箱应用层代码流…...

Python生成器(python系列25)
前言:什么是生成器,他和迭代器的区别是什么?什么时生成器表达式,为什么和列表推导式那么像呢? 生成器: 定义:能够动态(循环一次,计算一次,返回一次…...

Vue项目搭建过程
Vue项目搭建过程 1、安装NodeJs 1.1 下载安装包 在 http://nodejs.cn/download/ 上下载64位安装包,然后进行安装,和普通软件的安装一样。 C:\Users\Administrator>node -v v16.13.1C:\Users\Administrator>npm -v 8.5.51.2 安装cnpm # 安装cn…...

系统分析师(软考)知识点整理(一)
第一章 信息 信息是不确定性的减少 xi: n个状态中的第i个状态p(xi):出现第i个状态的概率b: b一般取值为2 特征 #mermaid-svg-pvPkY9RE5GZIIIxl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-pvPkY9RE5GZIIIxl…...

2021年数维杯国际大学生数学建模D题2021年电影市场票房波动模型分析求解全过程文档及程序
2021年数维杯国际大学生数学建模 D题 2021年电影市场票房波动模型分析 原题再现: 1、电影票房预测建模背景 随着人们文化消费需求的增加,电影院和银幕的数量不断增加,我国的电影产业不断呈现出繁荣景象。2019年,全国电影票房…...

Kubernetes 的用法和解析 -- 5
一.企业级镜像仓库Harbo 准备:另起一台新服务器,并配置docker yum源,安装docker 和 docker-compose 1.1 上传harbor安装包并安装 [rootharbor ~]# tar xf harbor-offline-installer-v2.5.3.tgz [rootharbor ~]# cp harbor.yml.tmpl harbor…...

HTML选择题试题——附答案
单选题 HTML的缩写是什么? A) Hyper Tool Markup LanguageB) Hyperlinks and Text Markup LanguageC) Hyper Text Markup LanguageD) Home Tool Markup Language 下列哪个标签用于定义文档的主体内容? A) <head>B) <body>C) <title>D)…...

html之CSS的高级选择器应用
文章目录 一、CSS高级选择器有哪些呢?二、高级选择器的应用1、层次选择器后代选择器子选择器相邻兄弟选择器通用兄弟选择器 2、结构伪类选择器(不常用)3、属性选择器E[attr]E[attrval]E[attr^val]E[attr$val]E[attr*val] 一、CSS高级选择器有…...

elementui+ <el-date-picker type=“datetime“/>时间组件的当前时间的180天之内的禁止选择处理
需求1如下:当前时间180天不可选择,180天之后可以选择,之前的时间都禁止选择 页面代码如下: <el-date-picker v-model"temp.expire_time" :picker-options"pickerOption" type"datetime" placeh…...

全网好听的BGM都在这里下载,赶紧收藏好了
无论是自媒体创作者还是从事视频剪辑工作的朋友,对于BGM的选择都很重要,一首适配的BGM能大大提升你作品的质量,还能让作品更优秀。哪里才能找到好听又免费的BGM?下面推荐几个我多年收藏的6个音效、音频素材网站,赶紧收…...

Spark编程实验一:Spark和Hadoop的安装使用
目录 一、目的与要求 二、实验内容 三、实验步骤 1、安装Hadoop和Spark 2、HDFS常用操作 3、Spark读取文件系统的数据 四、结果分析与实验体会 一、目的与要求 1、掌握在Linux虚拟机中安装Hadoop和Spark的方法; 2、熟悉HDFS的基本使用方法; 3、掌…...

代理和AOP
一:java代理 整体分为两种:静态代理和动态代理 静态代理:23种设计模式里面有个代理模式,那个就是静态代理。 动态代理:分为编译时增强(AspectJ)和运行时增强(JDK动态代理和CGLIB动态代理) 1:静态代理 这种代理在我们日常生活中其…...

Solidity-3-类型
Solidity 是一种静态类型语言,这意味着每个变量(状态变量和局部变量)都需要在编译时指定变量的类型。 “undefined”或“null”值的概念在Solidity中不存在,但是新声明的变量总是有一个 默认值 ,具体的默认值跟类型相…...

【mask转json】文件互转
mask图像转json文件 当只有mask图像时,可使用下面代码得到json文件 import cv2 import os import json import sysdef func(file:str) -> dict:png cv2.imread(file)gray cv2.cvtColor(png, cv2.COLOR_BGR2GRAY)_, binary cv2.threshold(gray,10,255,cv2.TH…...

华清远见嵌入式学习——ARM——作业1
要求: 代码: mov r0,#0 用于加mov r1,#1 初始值mov r2,#101 终止值loop: cmp r1,r2addne r0,r0,r1addne r1,r1,#1bne loop 效果:...

如何在公网环境使用固定域名远程访问内网BUG管理系统协同办公
文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…...

k8s pod网络排查教程
1、背景 背景:在日常的k8s运维中,经常会遇到pod之间网络无法访问,域名无法解释的情况。且容器中网络排查命令不全,导致无法准确定位问题。 2、nsenter介绍 #Centos 下载方式 $ yum install util-linux -ynsenter 是一个 Linux …...

Apollo Planning——换道:LANE_CHANGE_DECIDER
LaneChangeDecider 是lanefollow 场景下,所调用的第一个task,它的作用主要有两点:判断当前是否进行变道,以及变道的状态,并将结果存在变量lane_change_status中;变道过程中将目标车道的reference line放置到…...

Python 爬虫之简单的爬虫(三)
爬取动态网页(上) 文章目录 爬取动态网页(上)前言一、大致内容二、基本思路三、代码编写1.引入库2.加载网页数据3.获取指定数据 总结 前言 之前的两篇写的是爬取静态网页的内容,比较简单。接下来呢给大家讲一下如何去…...

为突发事件提供高现势性数据支撑!大势智慧助力中山市2023应急测绘保障演练举行
12月14日,2023年度中山市应急测绘保障演练在中山树木园举行,市自然资源局总工程师邓宇文出席本次演练活动。来自全市自然资源、应急管理部门和部分测绘单位的近70人现场观摩了演练。本次演练由中山市自然资源局主办、中山市自然资源信息中心承办…...

图片速览 OOD用于零样本 OOD 检测的 CLIPN:教 CLIP 说不
PAPERCODEhttps://arxiv.org/pdf/2308.12213v2.pdfhttps://github.com/xmed-lab/clipn 文章创新 以往由CLIP驱动的零样本OOD检测方法,只需要ID的类名,受到的关注较少。 本文提出了一种新的方法,即CLIP说“不”(CLIPN)…...

a16z:加密行业2024趋势“无缝用户体验”
近日,知名加密投资机构a16z发布了“Big ideas 2024”,列出了加密行业在 2024 年几个具备趋势的“大想法”,其中 Seamless UX(无缝用户体验)赫然在列。 从最为直观的理解上,Seamless UX 是在强调用户在使用产…...

C# WPF上位机开发(属性页面的设计)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在软件开发中,属性或者参数设置是很重要的一个部分。这个时候如果不想通过动态添加控件的方法来处理的话,那么可以通过tab控…...

macOS 安装 oh-my-zsh 后 node 报错 command not found : node
最近为了让终端中显示 git 分支的名称,安装了 oh-my-zsh ,安装之后呢,我原先安装的 Volta、 node 都没法用了,报错如下: 这时候粗略判断应该是系统变量出了问题,oh-my-zsh 的变量文件是 ~/.zshrc࿰…...

AI 绘画 | Stable Diffusion 视频数字人
前言 本篇文章教会你如何利用Stable Diffusion WEB UI,使用一个人物图片转换成为一个口播视频。本篇内容的教程以WINDOWS系统为例,教你如何安装使用。 先看视频效果 彭于晏图片生成口播视频 安装 首先需要在windows电脑上安装ffmpeg,按照本教程《在 Windows PC 上轻松下载并…...

《代码随想录》--二叉树(一)
《代码随想录》--二叉树 第一部分 1、二叉树的递归遍历2、二叉树的迭代遍历3、统一风格的迭代遍历代码4、二叉树的层序遍历226.翻转二叉树 1、二叉树的递归遍历 前序遍历 中序遍历 后序遍历 代码 前序遍历 class Solution {public List<Integer> preorderTraversal(T…...