各位亲爱的读者,现在公众号更改了推送规则,如果您需要第一时间看到我们推送的好内容。
一定要记得给公众号星标,经常点赞、在看、转发、分享和留下您的评论 !
关注回复【学习交流群】加入【安全开发运维】答疑交流群
请朋友们【多多点击文中的广告】,支持作者更新更多文章。
目录:
0x00 快速入门
什么是 ansible?
答:Ansible是一种开源的自动化工具,用于配置管理、应用程序部署、编排和远程任务执行。它基于Python语言开发,使用SSH协议进行通信,可实现对大型IT基础架构的自动化管理。Ansible具有简单易用、轻量级、可扩展性强、跨平台等特点,被广泛用于自动化部署、配置管理和持续集成等领域。
简单的说:它是一个Linux系统上的"自动化运维工具",类似一个"配置管理工具";
ansible 能做什么?
正如其他配置管理工具一样,ansible可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工作。
-
比如:同时在100台服务器上安装nginx服务,并在安装后启动它们。
-
比如:将某个文件一次性拷贝到100台服务器上。
-
比如:每当有新服务器加入工作环境时,你都要为新服务器部署redis服务,也就是说你需要经常重复的完成相同的工作。
ansible 优秀的特性
-
"幂等性":可以保证我们重复的执行同一项操作时得到的结果是一样的。
-
举个例子:你想把一个文件拷贝到目标主机的某个目录上,但是你不确定此目录中是否已经存在此文件,当你使用ansible完成这项任务时,就非常简单了,因为如果目标主机的对应目录中已经存在此文件,那么ansible则不会进行任何操作,如果目标主机的对应目录中并不存在此文件,ansible就会将文件拷贝到对应目录中;
-
ansible是"以结果为导向的",我们指定了一个"目标状态",ansible会自动判断,"当前状态"是否与"目标状态"一致,如果一致,则不进行任何操作,如果不一致那么就将"当前状态"变成"目标状态"
-
-
剧本
-
模板
-
角色
其他的一些运维配置管理工具还有puppet或者saltstack而ansible相比较于他们的优点:
-
使用puppet管理100台主机,就要在这100台主机上安装puppet对应的agent(客户端代理程序),比较繁琐;
-
不同之处在于ansible只需要依赖ssh即可正常工作,不用在受管主机上安装agent,也就是说只要你能通过ssh连接到对应主机,你就可以通过ansible管理对应的主机。
-
为了好分辨后面将Ansible主机就是管理主机,受管理的主机叫做受控主机;
参考文档帮助:https://docs.ansible.com/ansible/latest/index.html
0x01 安装部署
1.Ansible 安装
环境设置:采用VMWARE-player模拟环境实现;
10.10.107.222 Master-Ansible管理端
10.10.107.234 Slave-Ansible 受控端(Ubuntu)
10.20.172.235 Slave-Ansible 受控端(Centos)
(1) CentOS下Ansible安装:
#Step1.我使用yum源的方式安装ansible,因为安装ansible需要epel源,所以我配置了阿里的epel源和centos7系统镜像源,
$ pwd
/etc/yum.repos.d
# cat aliBase.repo
[aliBase]
name=aliBase
baseurl=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/RPM-GPG-KEY-CentOS-$releasever
# cat aliEpel.repo
[aliEpel]
name=aliEpel
baseurl=https://mirrors.aliyun.com/epel/$releasever\Server/$basearch/
enabled=1
gpgcheck=0
#Step2.yum源配置完成后,安装ansible
yum install ansible #此时yum源中对应的版本为ansible-2.8.1-1.el7.noarch.rpm
#Step3.验证安装
$ansible 127.0.0.1 -m ping #使用ansible去ping本机,
127.0.0.1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
安装成功后如果想要通过ansible管理某主机,使用ansible管理必须同时满足两个最基本的条件如下
-
条件一、ansible所在的主机可以通过ssh连接到受管主机。
-
条件二、受管主机的IP地址等信息已经添加到ansible的"管理清单"中,如果清单中没有的主机无法通过ansible进行配置管理;
ansible提供一个默认的"清单"文件 /etc/ansible/hosts并且采用ini风格里面有默认的配置示例使用提示;
#由于ansible工作方式,需要将受管主机的IP地址、ssh端口号等信息添加到一个被称作为"清单(Inventory)"的配置文件中
# ansible_port 用于配置对应主机上的sshd服务端口号默认的22号端口,
# ansible_user 用于配置连接到对应主机时所使用的用户名称。
# ansible_ssh_pass 用于配置对应用户的连接密码。
echo "10.10.107.234 ansible_port=22 ansible_user=root ansible_ssh_pass=ubuntu" >> /etc/ansible/hosts #通过ansible主机管理234主机
#当为主机配置别名时,主机的IP地址必须使用anible_host关键字进行指明,否则ansible将无法正确的识别对应的主机。
echo "test ansible_host=10.20.172.104 ansible_port=22 ansible_user=root ansible_ssh_pass=2019" >> /etc/ansible/hosts #设置别名的方式
#注意:上述配置参数都是ansible2.0版本以后的写法,2.0版本之前,应遵从如下写法
ansible_port #应该写成ansible_ssh_port
ansible_user #应该写成ansible_ssh_user/pass
ansible_host #应该写成ansible_ssh_host
#验证清单配置(两台机器都是OK的)
$ansible 10.10.107.234 -m ping
10.10.107.234 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
ansible test -m ping
test | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
ansible主控端如何采用密匙来登录受控端?
#首先,生成默认格式的密钥对,私钥与公钥。
ssh-keygen
#然后将生成的公钥加入到10.10.107.234的认证列表
ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.107.234
#好了公钥认证的相关操作配置完成,此刻,我们已经可以通过ansible主机免密码连接到主机60中了。
因为配置了密钥认证,所以可以实现免密码创建ssh连接,既然已经能够免密码创建ssh连接,那么在配置"主机清单"时,就没有必要再提供对应主机的用户名与密码了,所以在完成了密钥认证的相关配置后,我们可以将清单中的配置精简为如下格式。
10.10.107.234 ansible_port=22 #精简模式(默认也是的22号端口,所以可以忽略)
test ansible_host=10.10.107.234 ansible_port=22 #别名模式
安装总结:
-
在上面我们使用的是ssh账号密码登录,但是在生产环境中为了提高安全性,我们通常会基于密钥进行ssh认证甚至会禁用密码认证;
-
在接入之前需要将受控端的公匙写入ansible的kown_hosts中;
偷偷的告诉你哟?【极客全栈修炼】微信小程序已开放
【全栈工程师修炼指南】小程序
可直接在微信里面直接浏览博主文章哟,后续将上线更多有趣的小工具。
(2) Ubuntu下Ansible安装:
安装方式:
# 1.官网安装方式(要有梯子)
$ sudo apt update
$ sudo apt install software-properties-common
$ sudo apt-add-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible
# 2.我们将使用默认的Ubuntu存储库安装(版本可能非最新)
sudo apt update # 首先使用以下命令刷新系统的软件包索引完成此更新后您可以使用以下方法
sudo apt install ansible # 安装Ansible软件:
# 3.安装后版本查看
ansible --version
ansible 2.9.6
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/weiyigeek/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 3.8.5 (default, Jul 28 2020, 12:59:40) [GCC 9.3.0]
至此现在,您的Ansible控制节点具有管理主机所需的所有软件;
2.Ansible 配置清单
描述:该清单文件包含有关你会Ansible管理的主机信息
-
清单文件中包括从一到数百台服务器的任何位置,并且可以将主机组织为组和子组。
-
清单文件通常还用于设置仅对特定主机或组有效的变量,以便在剧本和模板中使用。
我们可以在ansible提供的清单配置文件中进行配置我们以该文件进行讲解
$vim /etc/ansible/hosts
# This is the default ansible 'hosts' file.
# It should live in /etc/ansible/hosts
# 示例1.清单支持"分组"功能,我们可以将某些主机分为一组,然后通过组名去管理组内的所有主机。
# 比如,主机234和主机235都属于A模块的服务器,主机221属于B模块的服务器,我们则可以在清单中进行如下配置
[A]
10.10.107.234
10.10.107.235
[B]
10.10.107.221
# 示例2.如果两台主机的IP地址是连续的我们可以使用更简洁的方法,配置A组中的受管主机,示例如下
[A]
10.10.107.[234:235]
[B]
10.10.107.221
# 示例3. 使用主机名配置受管主机的前提是ansible主机可以正确解析对应的主机名,比如,我们想要通过主机名配置两台主机,示例如下。
[A]
db01.weiyigeek.net
db02.weiyigeek.net
[B]
db0[1:2].weiyigeek.net
# 示例4.为了更加的灵活的管理受管主机,可能需要在组内嵌套组。
#比如,服务器环境从大类上可以分为"生产环境"和"测试环境",把主机分成了两组生产组和测试组,但是生产环境又包含很多业务模块,
#比如,A模块生产组、B模块生产组,同理测试环境中也会有同样的问题,比如A模块测试环境组,B模块测试组,这时我们就需要更加细化的进行分组,示例如下
[testA]
10.10.107.1
[testB]
10.10.107.2
#而master组中包含"子组",没错,"children"关键字表示当前组中存在子组就是testA组和testB组
[Master:children]
test[A:B]
# 示例4.分组与子组与组的变量声明
[manager]
admin ansible_host=10.10.107.202 ansible_port=20211 ansible_user=WeiyiGeeker ansible_sudo_pass='123456'
[master]
k8s-master-1 ansible_host=10.10.107.210 ansible_port=20211
k8s-master-2 ansible_host=10.10.107.211
k8s-master-3 ansible_host=10.10.107.212
[node]
k8s-node-1 ansible_host=10.10.107.213
k8s-node-2 ansible_host=10.20.172.220
k8s-node-3 ansible_host=10.20.172.221
# k8s 组包含的 子组
[k8s:children]
master
node
# k8s 组内所共享的局部变量设置优先级高(全局设置在`/etc/ansible/ansible.cfg`)
[k8s:vars]
ansible_port=20211
ansible_user=WeiyiGeeker
ansible_become=true
ansible_become_method=sudo
ansible_become_pass='123456'
[all:vars]
ansible_python_interpreter=/usr/bin/python3
验证配置结果:
#验证1.A组中包含主机60与61,B组中包含主机70,经过上述配置后,我们可以通过组名去管理组内的所有主机,示例如下。
ansible A -m ping
ansible B -m ping
ansible all -m ping #将配置文件中所有的主机进行ping操作
#验证4.如我们需要针对生产环境中的所有主机进行操作时,调用master组即可
ansible Master -m ping
#验证5.通过执行以下命令查看包含清单文件中定义的自己的服务器基础结构
$ansible-inventory --list -y
all:
children:
k8s:
children:
master:
hosts:
k8s-master-1:
ansible_become: 'true'
ansible_become_method: sudo
ansible_become_pass: 123456
ansible_host: 10.10.107.210
ansible_port: 20211
ansible_python_interpreter: /usr/bin/python3
ansible_user: WeiyiGeeker
k8s-master-2:
ansible_become: 'true'
ansible_become_method: sudo
ansible_become_pass: 123456
ansible_host: 10.10.107.211
ansible_port: 20211
ansible_python_interpreter: /usr/bin/python3
ansible_user: WeiyiGeeker
k8s-master-3:
ansible_become: 'true'
ansible_become_method: sudo
ansible_become_pass: 123456
ansible_host: 10.10.107.212
ansible_port: 20211
ansible_python_interpreter: /usr/bin/python3
ansible_user: WeiyiGeeker
node:
hosts:
k8s-node-1:
ansible_become: 'true'
ansible_become_method: sudo
ansible_become_pass: 123456
ansible_host: 10.10.107.213
ansible_port: 20211
ansible_python_interpreter: /usr/bin/python3
ansible_user: WeiyiGeeker
k8s-node-2:
ansible_become: 'true'
ansible_become_method: sudo
ansible_become_pass: 123456
ansible_host: 10.20.172.220
ansible_port: 20211
ansible_python_interpreter: /usr/bin/python3
ansible_user: WeiyiGeeker
k8s-node-3:
ansible_become: 'true'
ansible_become_method: sudo
ansible_become_pass: 123456
ansible_host: 10.20.172.221
ansible_port: 20211
ansible_python_interpreter: /usr/bin/python3
ansible_user: WeiyiGeeker
manager:
hosts:
admin:
ansible_host: 10.10.107.202
ansible_port: 20211
ansible_python_interpreter: /usr/bin/python3
ansible_sudo_pass: 123456
ansible_user: WeiyiGeeker
ungrouped: {}
其实Ansible的清单文件/etc/ansible/hosts不仅能够识别INI的配置语法还能够识别"YAML"的配置语法。注意,为了使缩进显得更加明显,此处每次缩进使用两个空格
$vim /etc/ansible/hosts
#使用YAML语法配置的主机清单非常简单下面就是他的配置示例
#示例1.所有受管理组演示
all: #管理清单中的所有主机的一个组,这里的"all:"就是这个含义
hosts: #第二行开头使用一个空格作为缩进,使用hosts关键字,表示hosts属于all的下一级,(后面的都是采用两个空格)
10.10.107.1
10.10.107.2
#上例相当于如下INI配置
10.1.1.60
10.1.1.61
#示例2.ini风格对比yaml
#先看一个INI风格的配置表示当前清单中有3台受管主机,主机61不属于任何组,主机60属于test1组,主机70属于test2组
10.1.1.61
[test1]
10.1.1.60
[test2]
10.1.1.70
#使用YAML语法进行同等效果的配置如下
#当直接在清单中创建组时,需要在all关键字内使用children关键字,而定义每个组时,有必须使用hosts关键字,指明组内的主机
all:
hosts:
10.1.1.61:
children: #分组都是children
test1:
hosts:
10.1.1.60:
test2:
hosts:
10.1.1.70:
#从上例可以看出,
组中嵌套时候:
#仍然先写出INI风格的示例以作对比,如下
[proA]
10.1.1.60
[proB]
10.1.1.70
[pro:children]
proA
proB
#对应YAML格式的配置如下pro组有两个子组,分别为proA组和proB组,而这两个组分别有自己组内的主机。
all:
children:
pro:
children:
proA:
hosts:
10.1.1.60
proB:
hosts:
10.1.1.70
当我们使用YAML语法配置清单时,无非是使用hosts、children
等关键字与我们的自定义名称进行排列组合罢了。
认证管理yaml配置:
#ini格式如下:
10.1.1.6
test7 ansible_host=10.1.1.7 ansible_port=22
localhost ansible_connection=local
#yaml的配置语法
all:
hosts:
10.1.1.6
test7:
ansible_host: 10.1.1.7 #注意冒号后都有空格,注意yaml语法
ansible_port: 22
localhost:
ansible_connection: local
补充,使用将变量分配给多台机器:对变量进行分组
# In INI:
[atlanta]
host1
host2
[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
# In YAML:
atlanta:
hosts:
host[1:50] # host1,host2,...,host3...host50
vars:
ansible_host: 20211
ntp_server: ntp.atlanta.example.com
proxy: proxy.atlanta.example.com
综合示例:
#以下是如何立即部署到创建的容器的示例
- name: create jenkins container
docker_container:
docker_host: myserver.net:4243
name: my_jenkins
image: jenkins
- name: add container to inventory
add_host:
name: my_jenkins
ansible_connection: docker
ansible_docker_extra_args: "--tlsverify --tlscacert=/path/to/ca.pem --tlscert=/path/to/client-cert.pem --tlskey=/path/to/client-key.pem -H=tcp://myserver.net:4243" #设置守护进程
ansible_user: jenkins
changed_when: false
- name: create directory for ssh keys
delegate_to: my_jenkins
file:
path: "/var/jenkins_home/.ssh/jupiter"
state: directory
参考absible的yaml语法:https://docs.ansible.com/ansible/2.4/intro_inventory.html#id7
0x02 Ansible 常用命令
描述:主要讲解ansible命令以及子命令和ansible-doc命令参数使用,通过一些简单的命令进行absible 基础学习。
Ansible是一种自动化运维工具,可以用来简化系统配置、应用程序部署、任务执行等操作。下面是一些常用的Ansible命令:
-
ansible:执行Ansible命令的主要命令。可以用于执行各种操作,如执行任务、部署应用程序、更新配置等。
-
ansible-playbook:执行Ansible剧本的命令。剧本是一种用于定义和执行复杂操作的脚本。
-
ansible-galaxy:用于管理Ansible角色和集合的命令。可以用于搜索、安装、创建和发布Ansible角色和集合。
-
ansible-config:用于查看和修改Ansible配置的命令。可以用于设置全局配置、主机配置、角色配置等。
-
ansible-doc:用于查看Ansible模块文档的命令。可以用于查找模块的使用方法、参数说明等。
-
ansible-vault:用于加密和解密Ansible剧本中的敏感数据的命令。可以用于保护剧本中的密码、证书等敏感信息。
-
ansible-pull:用于从远程版本控制库(如Git)中拉取Ansible剧本并执行的命令。可以用于实现反向控制,让目标主机主动拉取剧本并执行。
这些只是一些常用的Ansible命令,还有很多其他命令和选项可供使用。你可以使用"ansible --help"来查看所有可用的命令和选项。
ansible 命令
语法参数:
ansible [主机] [选项] [主机连与认证]
-e 指定参数变量以供模块使用。
-i INVENTORY:指定主机清单文件。
-m MODULE_NAME:指定要使用的模块。
-a 'MODULE_ARGS':指定模块的参数。
-u REMOTE_USER:指定远程用户。
-b:以特权用户(如root)执行操作。
-K:使用sudo密码。
-l SUBSET:指定要操作的主机子集。
示例演示:
# 示例1.所有主机执行Ansible的ping模块任务。
ansible all -m ping
ansible-config 命令
描述:此命令主要用于查看和修改Ansible配置文件。
示例演示:
# 1.命令查看Ansible配置文件
ansible-config view
ansible-doc 命令
描述: 此命令主要用于模板帮助以及模块命令作用查看。
语法参数:
ansible-doc
# 参数
MODULE_NAME:查看指定模块的帮助文档。
-l,--list 模块简介与全部模块
-s 模块详情
语法参数:
# 示例1.用于查看ping模块的文档。
ansible-doc ping
ansible-playbook 命令
描述:此命令主要是运行剧本配置文件脚本。
语法参数:
# 语法
ansible-playbook
# 参数
PLAYBOOK:指定要运行的Playbook文件。
-i INVENTORY:指定主机清单文件。
-e EXTRA_VARS:传递额外的变量。
-u REMOTE_USER:指定远程用户。
-b:以特权用户(如root)执行操作。
-K:使用sudo密码。
-l SUBSET:指定要操作的主机子集
--syntax-check #语法验证
--check #模拟验证执行
--list-tags #概览一下playbook中都有哪些标签
--tags [tagname] #指定执行tagname的任务
--skip-tags [tagname] #跳过执行tagname的任务而执行其他任务;
-e,--extra-vars #指定在play中使用的变量传入多/单个变量,还可以通过json字符串形式传入;
示例演示:
示例:用于执行Ansible剧本。
ansible-playbook playbook.yml
#ansible-playbook进行yml配置语法检查
ansible-playbook --syntax-check test.yml
#ansible-playbook进行yml配置模拟执行
ansible-playbook --check test.yml
#只有标签对应的任务会被执行,其他任务都不会被执行
ansible-playbook --tags task1 test.yml
#指定"不执行的任务",task1标签的任务将不被执行
ansible-playbook --skip-tags task1 test.yml
#指定在play中使用的变量(传入单个变量 / diphenhydramine变量)
ansible-playbook cmdvar.yml --extra-vars "pass_var=cmdline pass var"
ansible-playbook cmdvar.yml -e 'pass_var="test" pass_var1="test1"'
ansible-playbook cmdvar.yml -e '{"testvar":"test","testvar1":"test1"}'
ansible-playbook cmdvar.yml -e '{"countlist":["one","two","three","four"]}' #获取值使用如下两种语法引用变量 {{countlist[0]}} 或者 {{countlist.0}}
0x03 Ansible 模块使用说明
描述:当我们使用ansible完成实际任务时,需要依靠ansible的各个模块,比如前的ping模块,此时我们可以举一反三配置使用其他ansible模块。
模块搜寻与使用帮助
# ping模块使用
$ansible all -m ping
ansible-doc -l #获取到的模块信息比较概括(查看absible当前所有模块)
ansible-doc -s ping #ping模块的详细使用
ansible-doc -s fetch #我们需要将受管主机中的文件拉取到ansible主机时则可以使用此模块
比如:查看fetch模块的使用帮助
# ansible-doc -s fetch
- name: Fetch files from remote nodes
fetch:
dest: # (required - 必须参数) 指定存入到ansible主机上文件路径
src: # (required - 必须参数) 指定远程主机文件路径
validate_checksum: #Verify checksums
fail_on_missing: #默认yes,只有再文件不存在的时候失败
flat: #文件重写覆盖
亲,文章就要看完了,不关注一下【全栈工程师修炼指南】吗?
基础示例:
#主机清单-yaml文件
all:
hosts:
local:
ansible_host: 10.10.107.222
ansible_user: root
ansible_ssh_pass: root@2019
children:
ops:
children:
testA:
hosts:
10.10.107.221
testB:
hosts:
10.20.172.179
#示例:拉取ops组中所有主机的/etc/fstab文件拉取到本地
ansible ops -m fetch -a "src=/etc/fstab dest=/tmp/ansible/" #初次拉取
#黄色提示,并且发生改变
10.10.107.221 | CHANGED => {
"changed": true, #关键点
"checksum": "2b8323413e9c5a3067f61c27ca5ea21378bae582", #远程MD5校验
"dest": "/tmp/ansible/10.10.107.221/etc/fstab", #(会以主机名称建立文件夹,然后再存入)
"md5sum": "edf31ba4fd10068f6310f4343855af89", #本地MD5
"remote_checksum": "2b8323413e9c5a3067f61c27ca5ea21378bae582", #远程MD5校验
"remote_md5sum": null
}
返回提示颜色来看幂等性
-
当返回信息为绿色时,"changed"为false,表示ansible没有进行任何操作,没有"改变什么"。
-
当返回信息为黄色时,"changed"为true,表示ansible执行了操作,"当前状态"已经被ansible改变成了"目标状态"。
比如:这时候我把10.10.107.221的fstab进行更改
echo " " >> /etc/fstab
#再次进行文件拉取查看效果
10.10.107.221 | CHANGED => { #对比点
"changed": true, #对比点 (Yellow)
"checksum": "e0719b31dd9445c5da3dd5e04f13ed44855aacd0",
"dest": "/tmp/ansible/10.10.107.221/etc/fstab",
"md5sum": "631e37410fac691ead3c90e6938494ef",
"remote_checksum": "e0719b31dd9445c5da3dd5e04f13ed44855aacd0", #比对点
"remote_md5sum": null
}
10.20.172.179 | SUCCESS => {
"changed": false, # 由于终端的问题我是白色的(Green)
"checksum": "39ffc633a100c2b2d06a3d9d0e625dff1ca7043c",
"dest": "/tmp/ansible/10.20.172.179/etc/fstab",
"file": "/etc/fstab",
"md5sum": "c63b434a7a09baea8b7b59fce8cb807b"
}
总结:
-
注释中包含 "required" 字样则表示使用模块中的参数必须要设置;
-
注意幂等性的区别点,以及yaml配置受管主机清单
本文至此完毕,更多技术文章,尽情等待下篇好文!
原文地址: https://blog.weiyigeek.top/
【 如果此篇文章对你有帮助,请你将它分享给更多的人! 】
学习书籍推荐 往期发布文章
回复【0014】获取【Nginx学习之路汇总】
回复【0015】获取【Jenkins学习之路汇总】
回复【10005】获取【adb工具刷抖音赚米】
回复【0011】获取【k8S二进制安装部署教程】
回复【10001】获取【WinServer安全加固脚本】
回复【0008】获取【Ubuntu22.04安装与加固脚本】
回复【10006】获取【CentOS8安全加固脚本】
回复【10002】获取【KylinOS银河麒麟安全加固脚本】
热文推荐
长按(扫描)二维码 ,关注 【全栈工程师修炼指南】(^U^)ノ~YO
欢迎添加作者微信【weiyigeeker】,一起入坑吧!
关注回复【学习交流群】即可加入【安全开发运维沟通交流群】
点击【"阅读原文"】获取更多有趣的知识
若有帮助请点个【在看 + 赞 】吧