Ansible自动化运维Inventory与Ad-Hoc

news2024/11/20 14:40:36

前言

自动化运维是指利用自动化工具和技术来简化、自动化和优化IT基础设施的管理和运维过程,从而提高效率、降低成本,并减少人为错误。在当今复杂的IT环境中,自动化运维已经成为许多组织和企业提高生产力和保证系统稳定性的重要手段。Ansible作为一种自动化运维工具,在这样的背景下应运而生,它通过简单、灵活的方式实现了IT基础设施的自动化管理。

目录

前言

一、Ansible 介绍

1. 概述

2. 组成

3. 工作原理

4. 特性

二、Install 部署

1. 环境准备

2. 安装 ansible

3. 相关文件

4. ansible 主配置文件

5. 免密管理 ssh-keygen

三、Ansible基础 

1. 定义主机清单

2. 测试连通性

3. 简洁输出

4. know_hosts

5. ping和ssh

四、Inventory 主机清单

1. 简介

2. 增加主机组

3. 增加用户名密码

4. 增加端口

5. 组:变量

6. 子分组

7. 自定义主机列表

五、Ad-Hoc 点对点模式

1. 简介

2. 模块

2.1 command 模块

2.2 shell 模块

2.3 script 模块

2.4 copy 模块

2.5 get_url 模块 

2.6 fetch 模块

2.7 file 模块

2.8 stat 模块

2.9 unarchive 模块

2.10 archive 模块

2.11 hostname 模块

2.12 cron 模块

2.13 yum 和 apt 模块  

2.14 yum_repository 模块

2.15 service 模块

2.16 mount 挂载和卸载

2.17 user 模块

2.18 group 模块

2.19 reboot模块

2.20 lineinfile 模块

2.21 replace 模

2.22 setup 模块


一、Ansible 介绍

1. 概述

Ansible基于Python开发,结合了众多运维工具的优点,最终实现批量系统配置、批量程序部署以及批量运行命令等功能。

2. 组成

  • INVENTORY:Ansible管理主机的清单 /etc/anaible/hosts 需要管理的服务清单
  • MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
  • PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
  • API:供第三方程序调用的应用程序编程接口

3. 工作原理

Ansible基于模块化工作,本身没有批量部署的能力,真正具有批量部署的是Ansible所运行的模块(Modules)。Ansible只是提供了一种框架,在Ansible管理体系中,存在着管理节点Control Node)和被管理节点(Managed Node)两种角色。被管理节点通常称之为资产,会放在主机清单(Inventory)文件中,Inventory其实就是由Ansible所管理的主机形成的。在管理节点上,Ansible将Ad-Hoc(批量执行单条命令,即单模块)或者Playbook(任务剧本)转化为Python脚本,最终通过ssh网络协议将这些Python脚本传递到被管理节点,在被管理服务器上依次执行,并且会实时将结果返回给管理节点。返回结果顺序根据网络、被管理服务器本身性能等因素有关。

① 管理节点(Control Node):在控制节点上安装Ansible,并使用Ansible的命令行工具或者其他接口来编写和执行自动化任务。

② 主机清单(Inventory):控制节点上维护一个主机清单文件,列出了需要管理的目标主机的信息,包括IP地址、主机名等。

③ 任务剧本(Playbook):Playbook通常是josn格式的YAML文件,定义了一系列任务和配置信息,用于描述自动化任务的执行流程。Playbook编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,相当于多个Ad-Hoc的配置文件。

④ 单模块(AD-Hoc):指的是在不使用Playbook的情况下,直接使用ansible命令行工具执行临时命令。这些命令通常是一次性的、针对特定任务的,而不需要编写长期维护的Playbook。通过AD-Hoc命令,可以快速地在远程主机上执行特定的任务,比如文件操作、软件安装、服务管理等。

⑤ 执行任务模块(Modules): Ansible提供了丰富的模块,用于执行各种管理任务,比如文件操作、软件包管理、服务管理等。

⑥ Python:在Ansible中,默认情况下,Ansible会利用目标主机上已安装的Python解释器来执行远程命令。Ansible的核心引擎和大部分模块都是基于Python编写的,因此要求目标主机上必须安装有Python(通常是2.6版本或以上)才能正常运行Ansible管理任务。

⑦ SSH连接:Ansible使用SSH协议来连接目标主机,并在目标主机上执行任务。

⑧ 被管理节点(Managed Node):是指由Ansible进行配置、管理和自动化操作的远程主机或设备。这些被管理节点是Ansible控制节点所管理的目标系统,可以是服务器、虚拟机、网络设备或其他类型的计算设备。 

4. 特性

① 模块化:调用特定的模块完成特定任务,支持自定义模块,可使用任何编程语言写模块(账号,软件等)

② Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块

③ 基于Python语言实现

④ 部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖PKI(无需ssl)

⑤ 安全,基于OpenSSH

⑥ 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对

⑦ 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构

⑧ 较强大的多层解决方案 role

二、Install 部署

1. 环境准备

① 设备准备(均关闭防火墙、核心防护)

ansible服务器:192.168.190.100

ansible客户机:192.168.190.101、192.168.190.102、192.168.190.103、192.168.190.104

② ansible服务器添加域名解析,客户机无需配置

[root@localhost ~]# vim /etc/hosts
192.168.190.100 ansible
192.168.190.101 host1
192.168.190.102 host2
192.168.190.103 host3
192.168.190.104 host4

2. 安装 ansible

① 配置阿里云yum源,本机已存在可以忽略

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# mkdir bak;mv *.repo bak
[root@localhost yum.repos.d]# vim CentOS-Base.repo
[base]
name=CentOS-$releasever - Base - aliyun
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=0
enabled=1

[updates]
name=CentOS-$releasever - Updates - aliyun
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
gpgcheck=0
enabled=1

[extras]
name=CentOS-$releasever - Extras - aliyun
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
gpgcheck=0
enabled=1

[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=https://mirrors.aliyun.com/epel/7/$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[root@localhost yum.repos.d]# ls
bak  CentOS-Base.repo
[root@localhost yum.repos.d]# yum clean all
[root@localhost yum.repos.d]# yum makecache

② Install安装

[root@localhost ~]# yum install ansible -y
已安装:
  ansible.noarch 0:2.9.27-1.el7                                                                                  

作为依赖被安装:
  PyYAML.x86_64 0:3.10-11.el7                             libyaml.x86_64 0:0.1.4-11.el7_0                       
  python-babel.noarch 0:0.9.6-8.el7                       python-jinja2.noarch 0:2.7.2-4.el7                    
  python-markupsafe.x86_64 0:0.11-10.el7                  python-paramiko.noarch 0:2.1.1-9.el7                  
  python2-httplib2.noarch 0:0.18.1-3.el7                  python2-jmespath.noarch 0:0.9.4-2.el7                 
  sshpass.x86_64 0:1.06-2.el7 

[root@localhost ~]# rpm -qc ansible
/etc/ansible/ansible.cfg
/etc/ansible/hosts

③ 查看基本信息

[root@localhost ~]# ansible --version
ansible 2.9.27
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Aug  4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]

3. 相关文件

  • /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文件
  • /etc/ansible/hosts 主机清单
  • /etc/ansible/roles/ 存放角色的目录

4. ansible 主配置文件

Ansible 的默认配置文件路径:/etc/ansible/ansible.cfg

[defaults]
#inventory     = /etc/ansible/hosts 	#主机列表配置文件
#library = /usr/share/my_modules/ 		#库文件存放目录
#remote_tmp = $HOME/.ansible/tmp 		#临时py命令文件存放在远程主机目录
#local_tmp     = $HOME/.ansible/tmp 	#本机的临时命令执行目录
#forks         = 5   					#默认并发数
#sudo_user     = root 					#默认sudo 用户
#ask_sudo_pass = True 					#每次执行ansible命令是否询问ssh密码
#ask_pass      = True                   #当连接到远程主机时,会提示用户输入SSH密码
#remote_port   = 22                     #连接到远程主机时所使用的SSH端口号。默认为22。
#host_key_checking = False     			#检查对应服务器的host_key,建议取消此行注释,实现第一次连接自动信任目标主机
#log_path=/var/log/ansible.log 			#日志文件,建议启用
#module_name = command   				#默认模块,可以修改为shell模块
[privilege_escalation] 					#普通用户提权配置
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

5. 免密管理 ssh-keygen

用于生成SSH密钥对的命令行工具。它通常用于创建公钥和私钥,以便进行安全的SSH通信。

[root@localhost ~]# ssh-keygen   #一直按回车
[root@localhost ~]# ls .ssh/
id_rsa  id_rsa.pub
[root@localhost ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.190.101 #推送公钥给host1

[root@localhost ~]# ssh root@192.168.190.101
Last login: Wed Mar 13 14:04:13 2024 from 192.168.190.1
[root@localhost ~]# ifconfig ens33 | grep netmask | awk "{print \$2}"
192.168.190.101

三、Ansible基础 

1. 定义主机清单

[root@localhost ~]# vim /etc/ansible/hosts
host1
host2
host3
host4

2. 测试连通性

① 测试本机

[root@localhost ~]# ansible localhost -m ping
localhost | SUCCESS => {                        #绿色字体
    "changed": false, 
    "ping": "pong"
}

② 分别测试host1和host2,此时host1做了免密登录,观察返回信息

[root@localhost ~]# ansible host1 -m ping
Are you sure you want to continue connecting (yes/no)? yes
host1 | SUCCESS => {                                        #绿色字体
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
[root@localhost ~]# ansible host2 -m ping
Are you sure you want to continue connecting (yes/no)? yes
host2 | UNREACHABLE! => {                                   #红色字体
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added 'host2,192.168.190.102' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", 
    "unreachable": true
}

3. 简洁输出

[root@localhost ~]# ansible host1 -m ping -o
host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
#绿色字体

4. know_hosts

[root@localhost ~]# ansible host2 -m ping -o -u root -k  #指定用户交互式ssh登录
SSH password: 
host2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
#绿色字体

关闭ssh询问

方法一:修改sshd配置,StrictHostKeyChecking no

[root@localhost ~]# vim /etc/ssh/ssh_config
 35 #   StrictHostKeyChecking ask
 36     StrictHostKeyChecking no
[root@localhost ~]# systemctl restart sshd

 方法二:修改ansible配置,启用host_key_checking = False

[root@localhost ~]# vim /etc/ansible/ansible.cfg
71 host_key_checking = False

5. ping和ssh

Ping 是一种基于 ICMP(Internet Control Message Protocol)的网络工具,通常用于测试两台计算机之间的连接和延迟。通过发送 ICMP 回显请求消息到目标主机并等待其回应,可以确定目标主机是否可达以及网络延迟情况。

SSH(Secure Shell)是一种加密的网络协议,用于安全地远程连接到另一台计算机,并在该计算机上执行命令。SSH 提供了加密的通信渠道,使得数据传输过程中更加安全,并且还允许用户进行身份验证,确保只有授权用户能够访问远程计算机。

区别:
协议类型:

  • Ping 使用 ICMP 协议,用于检测主机之间的连通性。
  • SSH 使用安全的加密通信协议,用于远程登录和执行命令。

功能:

  • Ping 用于测试主机之间的连通性和延迟。
  • SSH 用于建立安全的远程连接,允许用户登录并在远程主机上执行命令。

安全性:

  • Ping 不提供加密或身份验证,仅用于测试连接。
  • SSH 提供加密通信和身份验证,确保通信的安全性和用户身份的合法性

四、Inventory 主机清单

1. 简介

Inventory 主机清单是 Ansible 的一个重要概念,它用于定义 Ansible 将要管理的主机、服务器或设备。这个清单可以包含主机名、IP 地址、主机组以及其他相关的信息。

2. 增加主机组

[root@localhost ~]# vim /etc/ansible/hosts
[webserver]          #下方主机将被分配到webserver组中
host1
host2
host3
host4

[root@localhost ~]# ansible webserver -m ping -o
host3 | UNREACHABLE!: Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
host2 | UNREACHABLE!: Failed to connect to the host via ssh: Warning: Permanently added 'host2,192.168.190.102' (ECDSA) to the list of known hosts.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
host4 | UNREACHABLE!: Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
#由此可见webserver已经生效被调用,只有host1做了免密登录,返回结果可以忽略

3. 增加用户名密码

[root@localhost ~]# vim /etc/ansible/hosts 
[webserver]
host[1:4] ansible_ssh_user='root' ansible_ssh_pass='123'
[root@localhost ~]# ansible webserver -m ping -o
host3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host4 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
#此时可以看到返回结果全部成功,且字体均为绿色;即使host1配置过免密,不冲突

4. 增加端口

① 修改host4 ssh协议端口号

[root@localhost ~]# vim /etc/ssh/sshd_config
 17 #Port 22
 18  Port 9527
[root@localhost ~]# systemctl restart sshd

② 测试ansible通信

[root@localhost ~]# ansible webserver -m ping -o
host4 | UNREACHABLE!: Failed to connect to the host via ssh: ssh: connect to host host4 port 22: Connection refused
host3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
#此时host4无法通信,提示端口故障

 ③ 修改服务器Inventory主机清单配置,再次访问

[root@localhost ~]# vim /etc/ansible/hosts
[webserver]
host[1:3] ansible_ssh_user='root' ansible_ssh_pass='123'
host4     ansible_ssh_user='root' ansible_ssh_pass='123' ansible_ssh_port='9527'

[root@localhost ~]# ansible webserver -m ping -o
host2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host4 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
#可见全部成功

5. 组:变量

当一个组中需要大量定义变量,可以统一定义。定义完成后,改组的所有成员都将收到、适应这个变量。

[root@localhost ~]# vim /etc/ansible/hosts
[webserver]
host[1:3]
host4     ansible_ssh_port='9527'

[webserver:vars]
ansible_ssh_user='root'
ansible_ssh_pass='123'

[root@localhost ~]# ansible webserver -m ping -o
host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host4 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
#全部返回成功

常用变量:

参数用途示例
ansible_ssh_host定义 hosts ssh 地址ansible_ssh_host=192.168.190.100
ansible_ssh_port定义 hosts ssh 端口ansible_ssh_port=9527
ansible_ssh_user定义 hosts ssh 认证用户ansible_ssh_user=root
ansible_ssh_pass定义 hosts ssh 认证密码ansible_ssh_pass=123
ansible_sudo定义 hosts sudo 用户ansible_sudo=zhangsan
ansible_sudo_pass定义 hosts sudo 密码ansible_sudo pass=123
ansible_sudo_exe定义 hosts sudo 路径ansible_sudo_exe=/usr/bin/sudo
ansible_connection定义 hosts 连接方式ansible_connection=local
ansible_ssh_private_ key_file定义 hosts 私钥ansible_ssh_private_key_file=/root/key
ansible_ssh_shell_ type定义 hosts shell 类型ansible_ssh_shell_type=bash
ansible_python_interpreter定义 hosts 任务执行python路径ansible_python_ interpreter=/usr/bin/python2.6
ansible_*_interpreter定义 hosts 其它语言解析路径ansible_*_interpreter=/usr/bin/ruby

6. 子分组

将不同的分组进行组合

[root@localhost ~]# vim /etc/ansible/hosts
[apache]
host[1:2]

[nginx]
host3
host4     ansible_ssh_port='9527'

[webserver:children]
apache
nginx

[webserver:vars]
ansible_ssh_user='root'
ansible_ssh_pass='123'

[root@localhost ~]# ansible webserver -m ping -o
host2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host4 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
#可见webserver这个总组调用了apache和nginx这两个从组

7. 自定义主机列表

打包主机清单,多处使用

将host4 ssh协议端口号改为默认22。

① 创建主机清单文件

[root@localhost ~]# vim /data/hostlist
[apache]
host[1:2]

[nginx]
host3
host4

[webserver:children]
apache
nginx

[webserver:vars]
ansible_ssh_user='root'
ansible_ssh_pass='123'

② 指定 Inventory 主机清单的位置,访问管理节点

[root@localhost ~]# ansible -i /data/hostlist webserver -m ping -o
host3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host4 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
#访问成功,字体均为绿色

五、Ad-Hoc 点对点模式

1. 简介

指的是在不使用Playbook的情况下,直接使用ansible命令行工具执行临时命令。这些命令通常是一次性的、针对特定任务的,而不需要编写长期维护的Playbook。通过AD-Hoc命令,可以快速地在远程主机上执行特定的任务,比如文件操作、软件安装、服务管理等。

2. 模块

2.1 command 模块

command 模块允许用户在目标主机上执行特定的命令,主要功能是在远程主机执行命令,此为默认模块,可忽略 -m 选项;此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现 ;注意此模块不具有幂等性 。以下是 command 模块的一般用法:

ansible <host-pattern> -m command -a "<command>"
#<host-pattern> 是要操作的目标主机或主机组。
#-m command 指定要使用的模块是 "command"。
#-a "<command>" 传递给模块的参数,即要在目标主机上执行的命令。

示例: 复制文件至指定目录

如何修改默认模块?

[root@ansible ~]# vim /etc/ansible/ansible.cfg
114 #module_name = command

2.2 shell 模块

和command相似,用shell执行命令支持各种符号,比如:*,$, >,此模块不具有幂等性。

示例:创建文件hello.txt,写入内容hello

示例:提权操作

① 先在被控制端(host1)sudo授权

[root@localhost ~]# vim /etc/sudoers
 93 fql     ALL=(ALL)       NOPASSWD:ALL

② 以fql用户身份连接,然后以特权模式切换到fql用户,并执行whoami命令,查看当前登录用户

[root@ansible ~]# ansible host1 -m shell -a 'whoami' -u fql -k -b --become-user=fql
SSH password: 
[WARNING]: Module remote_tmp /home/fql/.ansible/tmp did not exist and was created with a mode of 0700, this may
cause issues when running as another user. To avoid this, create the remote_tmp dir with the correct permissions
manually
host1 | CHANGED | rc=0 >>
fql

2.3 script 模块

在远程主机上运行ansible服务器上的脚本(无需执行权限,本身不执行),此模块不具有幂等性。

示例:执行脚本新建hello文件

2.4 copy 模块

从ansible服务器主控端复制文件到远程主机,src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件。关键字选项如下:

src       #代表源文件路径
dest      #代表文件落地路径
owner     #属主
group     #属组
mode      #代表权限
backup    #如果复制时有同名文件会先备份再复制(注意:源文件内容有变化才会备份)

准备:被管理节点新建用户fql

示例:拷贝管理节点文件至被管理节点指定目录,并指定属主及权限

注意:

  • etc不加/:连etc一起复制,etc会变成子目录
  • etc加/:只复制etc下的文件

2.5 get_url 模块 

用于将文件从http、https或ftp下载到被管理节点上。关键字选项如下:

url:     #下载文件的URL,支持HTTP,HTTPS或FTP协议
dest:    #下载到目标路径(绝对路径),如果目标是一个目录,就用服务器上面文件的名称,如果目标设置了名称就用目标设置的名称
owner:   #指定属主
group:   #指定属组
mode:    #指定权限
force:   #如果yes,dest不是目录,将每次下载文件,如果内容改变,替换文件。如果否,则只有在目标不存在时才会下载该文件
checksum:#对目标文件在下载后计算摘要,以确保其完整性(md5sum)
##可以检测文件是否有问题
[root@ansible ~]# md5sum nginx-1.18.0.tar.gz 
3ca4a37931e9fa301964b8ce889da8cb  nginx-1.8.0.tar.gz

[root@ansible ~]# ansible web -m get_url -a 'url=https://nginx.org/download/nginx-1.18.0.tar.gz dest=/opt checksum="md5:3ca4a37931e9fa301964b8ce889da8cb"'

示例:下载nginx源码包至被管理节点指定目录

2.6 fetch 模块

从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录(可以将文件夹打包成压缩包传输)。

示例:拷贝被管理节点文件至服务端

2.7 file 模块

设置文件属性,创建软链接等,关键字选项如下:

path       #指定文件路径
state      #文件状态 有:新建(touch) 删除(absent) 文件夹(directory)  连接文件(link)等
src        #源文件
mode       #权限
owner      #属主
group      #属组
recurse    #递归,修改属性时有效

示例:

[root@ansible ~]# ansible web -m file -a 'path=/mnt/web.txt state=touch owner=fql group=fql mode=644'
#创建空文件
[root@ansible ~]# ansible web -m file -a 'path=/mnt/web state=directory'
#新建目录
[root@ansible ~]# ansible web -m file -a 'src=/mnt/web path=/opt/web-link state=link'
#新建软连接 path|dest|name   这三个选项都可以使用
[root@ansible ~]# ansible web -m file -a 'path=/opt/web-link state=absent'
#删除文件
[root@ansible ~]# ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql"
[root@ansible ~]# ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql recurse=yes"
#递归修改目录及子目录的属性

2.8 stat 模块

检查文件或文件系统的状态,对于Windows目标,请改用win_stat模块。

选项: 

  • path:文件/对象的完整路径(必须)

常用的返回值判断:

  • exists: 判断是否存在
  • isuid: 调用用户的ID与所有者ID是否匹配 

示例:判断文件是否存在

[root@ansible ~]# ansible webserver -m stat -a 'path=/opt/xxxxxx' -o
host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "stat": {"exists": false}}
host3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "stat": {"exists": false}}
host4 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "stat": {"exists": false}}
host2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "stat": {"exists": false}}
#不存在

2.9 unarchive 模块

解包解压缩。实现有两种用法:

  • 将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes,此为默认值,可省略
  • 将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no

常见参数:

copy:      #默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到被控制节点上,如果设置为copy=no,会在被控制节点上寻找src源文件
remote_src:#和copy功能一样且互斥,yes表示在被控制节点,不在ansible主机,no表示文件在ansible主机上
src:       #源路径,可以是ansible主机上的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,如果是远程主机上的路径,则需要设置copy=no
dest:      #被控制节点的目标路径
mode:      #设置解压缩后的文件权限 

示例:将管理节点压缩包解压到被管理节点

① 管理节点创建(或指定现有)压缩包

[root@ansible data]# touch {1..3}.txt
[root@ansible data]# ls
1.txt  2.txt  3.txt
[root@ansible data]# tar -zcvf file.tar.gz 1.txt 2.txt 3.txt .
[root@ansible data]# ls
1.txt  2.txt  3.txt  file.tar.gz

②  将管理节点压缩包解压到被管理节点

示例:将被管理节点压缩包解压到被管理节点,即压缩包从被管理节点寻找

2.10 archive 模块

对被管理节点文件进行压缩,打包压缩保存在被管理节点。

参数:

path=/var/log/:        #指定要打包的目录路径为/var/log/。
dest=/data/log.tar.bz2:#指定创建的归档文件名为log.tar.bz2,并保存在/data/目录下。
format=bz2:            #指定归档文件的格式为bz2,即使用 bzip2 进行压缩。
owner=fql:             #指定归档文件的所有者为fql。
mode=0600:             #指定归档文件的权限模式为0600,即只有所有者具有读写权限,没有执行权限

示例:

2.11 hostname 模块

管理主机名,一般不使用此模块,主机名会一致。

示例:修改host1主机名

[root@ansible ~]# ansible host1 -m hostname -a 'name=node1'

2.12 cron 模块

用于管理 cron 作业(定时任务),支持时间:minute,hour,day,month,weekday。

功能、参数:

功能:
添加/删除 cron 作业: #可以使用 Ansible 的 cron 模块添加新的 cron 作业或删除现有的作业。
修改 cron 作业:      #可以更新现有的 cron 作业的时间表、命令等信息。
列出 cron 作业:      #可以列出系统中所有的 cron 作业,以便进行查看和管理。

参数:
name:        #cron 作业的名称。
minute/hour/day/month/weekday:  #cron 作业执行的时间表设定。
user:        #作业执行的用户。
job:         #要执行的命令或脚本。
state:       #指定作业的状态,可以是 present(存在)、absent(不存在)等。

示例:创建备份计划任务

示例:关闭计划任务

示例:删除计划任务

管理节点另外写法:ansible websrvs -m cron -a 'state=absent name=Synctime' 

2.13 yum 和 apt 模块  

yum管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本

apt类似yum模块的功能,主要管理Debian相关版本的软件包

参数:

Yum 模块参数:
name:             #要安装、升级或删除的软件包名称。
state:            #指定软件包的状态,可以是 present(存在)、latest(最新)、absent(不存在)等。
update_cache:     #指定是否更新 Yum 软件包缓存。
disablerepo:      #禁用特定的 Yum 软件源。
enablerepo:       #启用特定的 Yum 软件源。
disable_gpg_check:#禁用 GPG 检查。
installroot:      #指定要安装软件包的根目录。
update_only:      #仅更新软件包而不安装新软件包。
conf_file:        #指定要使用的 Yum 配置文件。

apt 模块参数:
name:                  #要安装、升级或删除的软件包名称。
state:                 #指定软件包的状态,可以是 present(存在)、latest(最新)、absent(不存在)等。
update_cache:          #指定是否更新 apt 软件包缓存。
cache_valid_time:      #指定软件包缓存的有效时间。
force:                 #强制执行操作,即使可能有依赖关系问题。
allow_unauthenticated: #允许安装未经身份验证的软件包。
autoremove:            #自动删除不再需要的软件包。
purge:                 #卸载软件包并删除其配置文件。
upgrade:               #执行软件包升级操作。

示例:批量安装httpd

其他示例:

ansible websrvs -m yum -a 'name=nginx state=present enablerepo=epel'  #启用epel源进行安装
ansible websrvs -m yum -a 'name=* state=lastest exclude=kernel*,foo*' #升级除kernel和foo开头以外的所有包
ansible websrvs -m yum -a 'name=httpd state=absent'                   #删除

2.14 yum_repository 模块

用于管理 YUM 软件包管理器中的软件仓库配置的模块。它允许用户添加、删除和更新系统上的 YUM 软件仓库。

参数关键字:

name参数:			#必须参数,用于指定要操作的唯一的仓库ID,也就是”.repo”配置文件中每个仓库对应的”中括号”内的仓库ID。
baseurl参数:		#此参数用于设置 yum 仓库的 baseurl。
description参数:	#此参数用于设置仓库的注释信息,也就是”.repo”配置文件中每个仓库对应的”name字段”对应的内容。
file参数:			#此参数用于设置仓库的配置文件名称,即设置”.repo”配置文件的文件名前缀,在不使用此参数的情况下,默认以 name 参数的仓库ID作					  为”.repo”配置文件的文件名前缀,同一个”.repo” 配置文件中 可以存在多个 yum 源。
enabled参数:		#此参数用于设置是否激活对应的 yum 源,此参数默认值为 yes,表示启用对应的 yum 源,设置为 no 表示不启用对应的 yum 源。
gpgcheck参数:		#此参数用于设置是否开启 rpm 包验证功能,默认值为 no,表示不启用包验证,设置为 yes 表示开启包验证功能。
gpgcakey参数:		#当 gpgcheck 参数设置为 yes 时,需要使用此参数指定验证包所需的公钥。
state参数:		    #默认值为 present,当值设置为 absent 时,表示删除对应的 yum 源。

示例:批量新建yum仓库epel源

2.15 service 模块

管理系统服务状态的模块。它可以启动、停止、重新启动和重新加载系统服务。

参数关键字:

name参数:		#此参数用于指定需要操作的服务名称,比如 nginx。
state参数:	    #此参数用于指定服务的状态,比如,我们想要启动远程主机中的 nginx,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted、reloaded。
enabled参数:	#此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。

示例:启动httpd服务并开机自启

2.16 mount 挂载和卸载

管理文件系统挂载和卸载的模块。它允许用户在远程主机上挂载和卸载文件系统,以及设置文件系统的相关属性。

主要参数:

path (必需): #要挂载或卸载的目标路径。
src:         #要挂载的设备、分区或者远程位置。
fstype:      #文件系统类型,例如 ext4、xfs 等。
state:       #可以是 mounted(已挂载)、unmounted(已卸载)或者 present(存在)。
opts:        #挂载选项,如 "rw"(读写)、"ro"(只读)等。
dump:        #控制备份程序是否应该备份文件系统。
passno:      #控制启动时文件系统检查的顺序。

示例:

#临时挂载
mount websrvs -m mount -a 'src="UUID=b3e48f45-f933-4c8e-a700-22a159ec9077" path=/home fstype=xfs opts=noatime state=present'
#临时取消挂载
mount websrvs -m mount -a 'path=/home fstype=xfs opts=noatime state=unmounted'
#永久挂载
ansible websrvs -m mount -a 'src=10.0.0.8:/data/wordpress path=/var/www/html/wp-content/uploads opts="_netdev" state=mounted'
#永久卸载
ansible websrvs -m mount -a 'src=10.0.0.8:/data/wordpress path=/var/www/html/wp-content/uploads state=absent'
#UUID为设备序列号,可以通过lsblk获得
[root@ansible ~]# ansible webserver -a "blkid"

2.17 user 模块

管理系统用户的模块。它允许用户创建、删除和修改系统用户以及相关属性。

主要参数:

comment         #用户的描述信息
createhome      #是否创建家目录
force           #在使用state=absent时, 行为与userdel –force一致.
group           #指定基本组(需要已存在的组)
groups          #指定附加组,如果指定为(groups=)表示删除所有组
home            #指定用户家目录
move_home       #如果设置为home=时, 试图将用户主目录移动到指定的目录
name            #指定用户名(必需)
non_unique      #该选项允许改变非唯一的用户ID值
password        #指定用户密码,使用 SHA512 hash
remove          #在使用state=absent时, 行为是与userdel –remove一致
shell           #指定默认shell
state           #设置帐号状态,不指定为创建,指定值为absent表示删除
system          #当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid             #指定用户的uid
update_password   #用于控制何时更新用户的密码。该参数有三个可能的取值:
always:           #始终更新用户密码。
on_create:        #仅在创建用户时更新密码。
never:            #永远不更新密码。

示例:添加用户

示例:删除用户 

2.18 group 模块

管理系统用户组的模块。它允许用户创建、删除和修改系统用户组以及相关属性。

主要参数:

name (必需):  #要操作的用户组名称。
state:        #可以是 present(存在)、absent(不存在)。
gid:          #用户组的 GID。
system:       #如果为 true,则创建一个系统用户组。
append:       #如果为 true,则将用户添加到指定的用户组中;如果为 false,则只会将用户包含在指定的用户组中

示例:创建组

示例:删除组 

2.19 reboot模块

重启远程主机的模块。它允许用户在远程主机上执行重启操作。

主要参数:

msg:               #在执行重启操作之前向远程主机发送的消息。
pre_reboot_delay:  #在重启之前等待的时间。
post_reboot_delay: #在重启后等待的时间。
test_command:      #用于测试重启完成后系统是否可访问的命令。
confirm:           #指定是否需要在执行重启操作之前进行确认,默认为 false。

示例:重启被管理节点服务器

[root@ansible ~]#ansible websrvs -m reboot

2.20 lineinfile 模块

ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,存在问题,无法正常进行替换。其实在ansible自身提供了两个模块:lineinfile模块和replace模块,可以方便的进行替换一般在ansible当中去修改某个文件的单行进行替换的时候需要使用lineinfile模块。
regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
如果想进行多行匹配进行替换需要使用replace模块。

关键字参数:

path	        #指定要操作的文件
regexp	        #使用正则表达式匹配对应的行
line	        #修改为新的内容
insertafter	    #将文本插入到“指定的行”之后
insertbefore	#将文本插入到“指定的行”之前
state	        #删除对应的文本时,需要state=absent
backrefs	    # 1.支持后向引用、2.当未匹配到内容则不操作文件
backup	        #是否在修改文件之前对文件进行备份
create	        #当要操作的文件并不存在时,是否创建对应的文件

示例:

查找内容:
ansible web -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen' line='Listen 80'"
#修改apache监听端口

替换内容:
ansible all -m   lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'"
#关闭核心防护
ansible all -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'
#去掉#号

2.21 replace 模

该模块有点类似于sed命令,主要也是基于正则进行匹配和替换,建议使用。

示例:

ansible all -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'"  
#给UUID开头行加上注释
ansible all -m replace -a "path=/etc/fstab regexp='^#(UUID.*)' replace='\1'"
#给#UUID开头行去掉注释
ansible web -m replace -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen.*' line='Listen 80'"
#修改监听端口为80

2.22 setup 模块

收集有关远程主机的各种系统信息。这些信息包括操作系统类型、IP 地址、内存和 CPU 使用情况、磁盘空间以及许多其他有用的系统级信息。这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度。可以使用 gather_facts: no 来禁止 Ansible 收集 facts 信息。

常用参数:

gather_subset: #指定要收集的子集信息,例如all, network, hardware, virtual等。
gather_timeout:#设置收集信息的超时时间,以秒为单位。
filter:        #用于过滤输出信息,可以根据需要选择性地显示特定信息。
fact_path:     #指定一个目录,将收集到的信息保存为 JSON 文件。
retries:       #在发生连接问题时尝试重新连接的次数。

示例:禁止 Ansible 收集 facts 信息

[root@ansible ~]# ansible all -m setup -a "gather_facts:no"

以上内容就是Ansible主机清单和单模块使用的介绍,Ad-Hoc 命令是一次性的、即时执行的命令,当我们需要执行多个任务、配置复杂场景或需要可重复使用的操作应该如何处理?下篇介绍Ansible非标记语言YAML与任务剧本Playbook-CSDN博客

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

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

相关文章

Kubernetes operator系列:kubebuilder 实战演练 之 开发多版本CronJob

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列文章&#xff0c;本节会在上一篇开发的Cronjob基础上&#xff0c;进行 多版本Operator 开发的实战 本文的所有代码&#xff0c;都存储于github代码库&#xff1a;https://github.c…

three.js 元素周期表,可鼠标控制

一些文章里的元素周期表,能显示,但控制器却无法使用,周期表没法旋转 后来发现是three.js版本问题, 旧版本在调试状态下是可以旋转的。新版本只要在正常页面打开状态下就能鼠标控制 <!DOCTYPE html> <html> <head> <meta charset="utf-8"&…

网盘聚合工具:统筹管理所有网盘资源 | 开源日报 No.203

alist-org/alist Stars: 35.6k License: AGPL-3.0 alist 是一个支持多存储的文件列表/WebDAV 程序&#xff0c;使用 Gin 和 Solidjs。 该项目的主要功能、关键特性、核心优势包括&#xff1a; 支持多种存储方式易于部署和开箱即用文件预览&#xff08;PDF、markdown、代码等&…

Jmeter文件上传不成功问题

前言 最近好忙呀&#xff0c;项目上线然后紧接着又客户培训了&#xff0c;由于项目有个模块全是走配置的&#xff0c;所以导致问题不断&#xff0c;近期要培训为了保障培训时客户同时操作的情况&#xff0c;所以把我从功能端抽出来做压测了&#xff0c;之前安排了2个同事写压测…

微调大型语言模型进行命名实体识别

大型语言模型的目标是理解和生成与人类语言类似的文本。它们经过大规模的训练&#xff0c;能够对输入的文本进行分析&#xff0c;并生成符合语法和语境的回复。这种模型可以用于各种任务&#xff0c;包括问答系统、对话机器人、文本生成、翻译等。 命名实体识别&#xff08;Na…

基于深度学习的口罩人脸识别研究进展

MTCNN模型训练输入的所有图像都是正样本&#xff08;戴口罩的照片&#xff09;&#xff0c;没有负样本作为模型输入。在后续的识别任务模块中&#xff0c;导入MTCNN模型检测结果&#xff0c;对特征点进行编码比较进行识别。 基于MTCNN的口罩人脸识别框架可分为四个阶段&#xf…

Linux 时间系统调用

UNIX及LinuxQ的时间系统是由「新纪元时间」Epoch开始计算起。Epoch是指定为1970年1月1日凌晨零点零分零秒&#xff0c;格林威治时间。目前大部份的UNX系统都是用32位来记录时间&#xff0c;正值表示为1970以后&#xff0c;负值则表示1970年以前。 对于当前时间到Epoch 我们用两…

刷题日记——干碎那个BFS!(含国科大机试2021)

例题小引——迷宫问题 问题描述: 迷宫由n行m列的单元格组成(n&#xff0c;m都小于等于50&#xff09;&#xff0c;每个单元格要么是空地&#xff0c;要么是障碍物。 现请你找到一条从起点到终点的最短路径长度。 分析——&#xff08;迷宫问题BFS解法&#xff09; 使用BFS…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:GridRow)

栅格布局可以为布局提供规律性的结构&#xff0c;解决多尺寸多设备的动态布局问题&#xff0c;保证不同设备上各个模块的布局一致性。 栅格容器组件&#xff0c;仅可以和栅格子组件(GridCol)在栅格布局场景中使用。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本…

实战!wsl 与主机网络通信,在 wsl 中搭建服务器。学了计算机网络,但只能刷刷面试题?那也太无聊了!这篇文章可以让你检测你的计网知识!

前言&#xff08;碎碎念&#xff09;&#xff1a;每次发布文章时&#xff0c;我都是一个纠结的过程。因为我给自己写笔记时&#xff0c;只需要记录自己不清晰或者易忘的知识点就可以了&#xff0c;但一旦想要作为文章发布&#xff0c;那么我就得考虑到很多人是纯新手&#xff0…

1TGE120011R1111变频器全国发货质保一年

1TGE120011R1111 ABB ABB的1TGE120011R1111是一个属于其TGE系列的小型断路器&#xff08;也称为微型断路器或MCB&#xff09;。这个系列的断路器主要用于低压配电系统&#xff0c;为电路提供过载和短路保护。以下是这款断路器的一些特点&#xff1a; 紧凑设计&#xff1a;TGE系…

【数据库】数据库基本知识

1.数据库的四个基本概念 1.1 数据&#xff1a;描述事务的符号记录 1.2 数据库&#xff1a;概括的说&#xff0c;数据库数据具有永久存储、有组织的、可共享的大量数据的集合&#xff0c;数据库中的数据按一定的数据模型组织、描述和储存&#xff0c;具有较小的冗余度、较高的…

2、鸿蒙学习-申请调试证书和调试Profile文件

申请发布证书 发布证书由AGC颁发的、为HarmonyOS应用配置签名信息的数字证书&#xff0c;可保障软件代码完整性和发布者身份真实性。证书格式为.cer&#xff0c;包含公钥、证书指纹等信息。 说明 请确保您的开发者帐号已实名认证。每个帐号最多申请1个发布证书。 1、登录AppGa…

AI美图设计室试用,可以生成PPT,以及模特试衣

文章目录 美图设计室试用 美图设计室试用 美图设计室是美图秀秀的公司推出的AI图像处理工具&#xff0c;其功能涵盖图片编辑、抠图、海报设计、文生图等常用的AI功能。尽管很多功能需要开通会员使用&#xff0c;但一些免费功能的表现也还不错&#xff0c;值得一用。 美图设计…

【解读】NIST网络安全框架CSF 2.0

2014年&#xff0c;NIST&#xff08;美国国家标准与技术研究所&#xff0c;类似于中国的工信部&#xff09;首次发布了网络安全框架CSF&#xff08;Cybersecurity Framework)&#xff0c;十年后&#xff0c;在2024年2月26日发布了重大更新&#xff08;CSF 2.0&#xff09;&…

【蓝屏分析】WHEA_UNCORRECTABLE_ERROR 问题分析与解决

背景信息 电脑名字电脑类型厂商使用时间magicbook14 2020款 R5 4500U笔记本电脑荣耀HONOR3年9个月 内存CPUGPU硬盘焊死在主板上焊死在主板上集显PCIe 4.0 NVMe M.2 固态 软硬件错误源确定 电脑莫名频繁随机蓝屏&#xff0c;由于在软件环境上无迹可寻推测是硬件问题 蓝屏画面…

Pretrain-finetune、Prompting、Instruct-tuning训练方法的区别

来自&#xff1a;【多模态】28、LLaVA 第一版 | Visual Instruction Tuning 多模态模型的指令微调_多模态指令跟随数据-CSDN博客 几种模型训练方法的区别&#xff1a; 1、Pretrain-finetune&#xff1a;先在大量数据集上做预训练&#xff0c;然后针对某个子任务做 finetune 2…

Python图像处理指南:PIL与OpenCV的比较【第136篇—PIL】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python图像处理指南&#xff1a;PIL与OpenCV的比较 图像处理在计算机视觉和图像识别等领域…

实现悲观协议,除了锁还能咋办?

相对乐观和局部悲观是一体两面的关系&#xff0c;识别它的要点就在于是否有全局有效性验证&#xff0c;这也和分布式数据库的架构特点息息相关。但是关于悲观协议&#xff0c;还有很多内容没有提及&#xff0c;下面我们就来填补这一大块空白。 悲观协议的分类 要先跳出来&…

Word使用通配符替换

1.通配符替换 使用&#xff08;[通配替换文本]&#xff09; M-MM12-00([0123456789])-0([0123456789])([0123456789])-0([0123456789])([0123456789]) 2.根据自定义格式替换 根据格式、样式替换&#xff0c;如只替换标题的内容&#xff0c;不替换征文