当前位置: 首页 > news >正文

day1:ansible

ansible-doc <module_name>(如果没有网,那这个超级有用)

这个很有用,用来查单个模块的文档。

ansible-doc -l
列出所有模块
ansible-doc -s <module_name>
查看更详细的模块文档。
ansible-doc --help
使用 --help 或 -h 获取帮助信息

一,自动化运算场景与工具

场景描述

场景

假如我要为100台服务器做同一个操作,比如修改一下yum源

方案
  • 手动
    • 一台一台用手动或者ssh操作,效率低
  • shell
    • 写个脚本,到时快,但是每台机器都不太一样,占用进程,免密设置麻烦

概述

自动化运维(AIOps 或 DevOps)是指通过使用自动化工具和技术,将日常的系统运维任务、软件发布、配置管理、监控、日志分析等流程自动化,以提高运维效率、减少人工干预、降低错误率,并确保系统的高可用性和可靠性。自动化运维不仅包括基础设施的管理,还涉及软件生命周期管理、应用程序部署、监控、故障响应和性能优化等多个方面。

常见工具(很多)

  • Ansible:一个基于 YAML 配置文件的自动化工具,无代理架构,易于使用,适用于服务器配置、应用部署和任务自动化。(不需要客户端)
  • Puppet:一个配置管理工具,使用声明性语言来定义基础设施的状态。适用于大规模环境的自动化管理。(最完整最复杂)
  • Chef:类似于 Puppet,Chef 是一个自动化平台,用于管理基础设施的配置、部署和操作。它通过 Ruby 编写自定义资源和任务。
  • SaltStack:一个配置管理和自动化工具,支持并行执行任务,能够管理大量节点,特别适合大规模基础设施管理。(需要客户端)

二,ansible的概述与搭建

概述

Ansible 是一个开源的自动化工具,主要用于配置管理、应用程序部署、任务自动化和多台服务器的管理。它的设计目的是简化管理和自动化的过程,通过无代理(Agentless)的方法让运维人员能够以更高效和灵活的方式管理大量主机。Ansible 使用简单的配置语言和现有的 SSH 协议进行操作,能够非常高效地处理从单台机器到数千台机器的配置和管理任务。

1. Ansible 的特点• 简洁性:Ansible 使用 YAML 语法编写配置文件(称为 Playbook),易于理解和维护。• 无代理:Ansible 不需要在被管理的节点上安装任何代理软件。它通过 SSH 或 WinRM 连接到远程主机,执行命令和任务。• 可扩展性:Ansible 提供了多种扩展机制,如自定义模块、插件和动态库存支持,可以轻松集成到现有的基础设施和工具链中。• 跨平台支持:Ansible 可以管理 Linux、Unix、Windows 等多个平台上的主机。• 并行执行:Ansible 支持并行执行任务,能够高效地管理大量主机。
2. Ansible 的组件• 控制节点(Control Node):控制节点是运行 Ansible 的地方,通常是开发者或运维人员的工作站。控制节点负责执行 Playbook 和管理被控制节点。• 被管理节点(Managed Nodes):被管理节点是由 Ansible 管理的远程主机,它们可以是任何支持 SSH 或 WinRM 的设备,如服务器、虚拟机、云实例等。• Playbook:Playbook 是 Ansible 的核心部分,它是用 YAML 编写的配置文件,定义了一系列要在远程主机上执行的任务。Playbook 支持条件逻辑、循环、变量和包含其他 Playbook 等功能。• 模块(Modules):Ansible 提供了大量的模块,用于执行特定的操作,如安装软件包、管理服务、文件操作等。模块是 Ansible 中执行任务的实际代码单元。• 任务(Tasks):任务是 Playbook 中定义的具体操作,每个任务都调用一个模块来执行实际操作。• 库存(Inventory):库存是 Ansible 用来管理远程主机的清单。库存可以是静态的(例如一个简单的 INI 文件),也可以是动态的(例如通过 API 自动生成)。• 插件(Plugins):Ansible 提供了多种插件,可以扩展其功能,包括连接插件、回调插件、动态库存插件等。
3. Ansible 工作流程
Ansible 的工作流程通常是如下几步:1. 控制节点发起请求:用户通过 Ansible 控制节点(通常是本地计算机)发起请求来管理远程主机。2. 通过 SSH 或 WinRM 连接:Ansible 控制节点通过 SSH(Linux/Unix)或 WinRM(Windows)连接到远程主机。3. 执行任务:Ansible 在远程主机上执行任务。任务是通过模块来完成的,Ansible 会依次执行 Playbook 中定义的任务。4. 返回结果:任务执行结果返回到控制节点,供用户查看和分析。
4. Ansible 的常见使用场景• 配置管理:自动化服务器、应用程序和服务的配置。比如安装和配置 Nginx、MySQL 等软件。• 应用程序部署:自动化应用程序的部署过程,包括代码的推送、环境的配置等。• 基础设施管理:自动化管理虚拟机、容器等基础设施,进行系统更新和维护。• 云资源管理:通过与 AWS、Azure、Google Cloud 等云平台的集成,自动化云资源的创建、管理和销毁。• 持续集成和持续部署(CI/CD):与 Jenkins 等 CI/CD 工具结合,自动化软件构建、测试和部署

搭建

环境准备

IP地址

主机名

配置要求

服务器角色

192.168.13.129/24

ansible

可用就行,大于目标主机

ansible服务器

1192.168.13.133/24

host01

可用就行

目标主机

192.168.13.134/24

host02

可用就行

目标主机

192.168.13.130/24

host03

可用就行

目标主机

ansible主机

1,设置主机名
hostnamectl set-hostname ansible
su -root
2,修改hosts文件
echo "目标主机ip1  目标主机名1" >> /etc/hosts
echo "目标主机ip2  目标主机名2" >> /etc/hosts
echo "目标主机ip3  目标主机名3" >> /etc/hosts
比如
echo "192.168.13.133  host1" >> /etc/hosts
3,关闭防火墙和SELINUX
4,设置时间同步
安装虚拟机的时候勾选,同步宿主机时间就可以了
5,配置yum源,扩展源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repoyum clean all
yum makecache
yum install epel-release -y6,安装ansible,只用在ansible主机安装就可以了
yum install ansible -y
ansible --version

目标主机

目标主机要打开sshd服务,并查看是否使用了22端口
systemctl restart sshd;systemctl status sshd
修改主机名
hostnamectl set-hostname host1;su
hostnamectl set-hostname host2;su
hostnamectl set-hostname host3;su

ansible命令

ansible [host-pattern] [options] [module] [arguments]host-pattern:目标主机或主机组(如:all, webservers等)options:命令选项(如:-i指定库存文件,-u指定远程用户等)-i:指定库存文件路径-u:指定远程主机的用户名-k:在需要密码时,提示输入SSH密码(用于非免密登录的场景)-b:使用sudo权限执行命令-v:启用详细输出-f:指定并发任务的数量-o: 就是精简模式,一行显示,也可以放到最后module:Ansible模块(如:ping, shell, yum等)-m 【模块】的方式指定arguments:模块的参数-a "<arguments>":指定模块的参数。

主机清单

通过ansible的ping模块测试ansible的主机清单文件,主要验证:分组,子分组,组变量

需求1:使用ansible去ping三台主机

ansible host1 -m ping

这个警告表示Ansible无法找到你指定的目标主机或主机组,因此默认只会连接到本地主机(localhost)。出现这个问题的常见原因是库存文件为空或者没有正确指定库存文件。

解决:

rpm -qc ansible找到相关文件,有一个叫hosts的文件,和系统的hosts类似,但是ansible只能根据他操作说打开它。

将域名追加进入文件。

ansible host1 -m ping还是有问题,因为要密码和用户

ansible host1 -m ping -u 用户名 -k '密码'

需求2:给host2设置免密

先生成一个ssh的密钥

ssh-keygen [options]-t:指定密钥类型(例如 rsa, dsa, ecdsa, ed25519 等)。-b:指定密钥的位数(适用于 RSA 密钥),例如 2048 位、4096 位等。-f:指定密钥文件的保存路径。默认保存位置是 ~/.ssh/id_rsassh-keygen -t rsa -f /path/to/your_key-C:为密钥添加注释(一般用于标识密钥用途)。-p:更改现有私钥的密码,-p '' 表示密码移除ssh-keygen -p -f ~/.ssh/id_rsa移除现有私钥的密码:然后在提示输入新密码时,按回车键不设置密码即可。更改现有私钥的密码:输入密码就可以了-q:启用安静模式,禁止显示冗余的输出信息。-N:设置私钥的密码,如果不想设置密码,使用空字符串(""),而不是通过交互式输入。ssh-keygen -t rsa -b 2048 -N "your_password"-P 选项用于 直接设置私钥密码,它在密钥生成时提供一个密码,而不是通过交互式输入。ssh-keygen -t rsa -b 2048 -P "your_password"
-N和-P一样,就像是-N是新版本,-P是老版本。推荐-N,但是-P也可以用。

再将密钥发送到目标主机

ssh-copy-id user@hostname
使用 ssh-copy-id 将生成的公钥复制到目标主机的 ~/.ssh/authorized_keys 文件中,以便进行免密码登录。
cat ~/.ssh/id_rsa.pub | ssh user@hostname 'cat >> ~/.ssh/authorized_keys'
如果没有 ssh-copy-id 命令,可以手动将公钥内容复制到目标主机的 ~/.ssh/authorized_keys 文件中。

这样就可以免密登录了


说了这么多,还没有讲到分组之类的,前面出了命令还是牛头不搭马嘴的,其实我是想让大家先一个一个的ping,然后再说分组,让大家知道分组的好。

创建一个简单的主机清单文件

创建一个名为 hosts.ini 的清单文件,内容如下:(要说的是可以在默认的hosts文件中创建,在其他地方创建要用-i指定绝对路径才可以引用)

#分组是 Ansible 中的一个概念,它帮助你将多个主机组织到一起,以便批量执行操作。你可以将主机按功能、角色、地理位置等分类到不同的组中。[host]
#这里放域名,表示主机,其它设置可以在后面空格隔开,也可以在【xx:vars】中写
host1
#host1 ansible_host=192.168.1.102表示指定ip,但是我们之前在系统的hosts做了映射,所以就没必要了,要说的时【xx:vars】中放到是大家共有的参数。
host2
host3[host:vars]
ansible_ssh_user=root
#账号
ansible_ssh_pass=ly
#密码
ansible_ssh_port=80
#端口#子分组是指一个分组(父分组)下面可以包含其他分组(子分组)。子分组本质上是父分组的扩展,它能够继承父分组的所有主机和变量,并且可以定义自己的主机和变量。#Ansible 使用 :children 关键字来定义子分组关系。父分组中通过 :children 指定哪些子分组属于它。
#【父分组:children】
#子分组1
#子分组2
#…………[all_servers:children]
#父分组,简单的说就是当你有多个分组时,你可以将多个分组作为父分组的子成员,通过父分组的变量调控可以影响到其成员组。
#放组名
host[all_servers:vars]
#子分组也可以设置vars

变量优先级顺序(从低到高):

  • 全局变量:如 ansible.cfggroup_vars/all 中的变量。
  • 组变量:如 group_vars/ 目录中为特定分组(如 [all_servers][web_servers])定义的变量。
  • 子分组变量:子分组中的变量会覆盖父分组中的变量。
  • 主机变量host_vars/ 目录中为特定主机定义的变量,具有最高优先级。
  • 命令行传入的变量:通过 -e 参数传递的变量,优先级最高。

ansible host -i hosts.ini -m ping

作业

三,ansible模块

概述

Ansible 模块是执行自动化任务的基本单位。模块封装了执行特定操作的逻辑,并将它们作为任务执行。通过调用模块,Ansible 能够在远程主机上执行各种操作,例如管理文件、安装软件、配置系统等。

Ansible 模块的运行方式是通过命令行工具或者 Playbook 文件调用,它们使得任务更加可复用和易于维护。每个模块通常会执行一个单独的操作,并且返回一些结果(如成功与否、返回的输出数据等)。

常见模块

模块功能常见参数
ping用于测试目标主机的连通性。
command运行系统命令(不支持 shell 特性)。cmd(要执行的命令)
shell在远程主机上执行 shell 命令。cmd(要执行的命令),creates(命令创建的文件路径,用于避免重复执行),chdir(工作目录)
wait_for等待某些条件满足(如端口开启、文件出现等)。host(主机 IP 或域名),port(端口号),statestartedstopped),timeout(超时时间)
assert用于验证某些条件是否为真。如果条件不成立,任务失败。that(条件表达式,例如 ansible_facts['distribution'] == 'CentOS'),msg(失败时输出的消息)
file管理文件和目录的属性(如权限、所有者、符号链接等)。path(目标文件或目录路径),state(文件状态,如 file, directory, absent),mode(文件权限),owner(所有者),group(用户组)
copy将本地文件复制到远程主机。src(本地文件路径),dest(目标文件路径),mode(文件权限),owner(所有者),group(用户组)
lineinfile管理文件中的单行内容(添加、修改或删除行)。path(文件路径),line(行内容),state(行状态,如 presentabsent),regexp(匹配正则)
template将 Jinja2 模板文件复制到远程主机,并渲染内容。src(模板文件路径),dest(目标文件路径)
cron管理 cron 任务,设置定时任务。name(任务名称),minute(分钟),hour(小时),day(日期),month(月份),weekday(星期几),job(任务命令)
yum管理 CentOS/RHEL 系统上的软件包。name(软件包名称),state(软件包状态,如 present, absent, latest),enablerepo(启用的仓库),disablerepo(禁用的仓库)
apt用于管理基于 Debian 的系统上的软件包(如 Ubuntu)。name(软件包名称),state(软件包状态,如 present, absent, latest),update_cache(是否更新缓存)
service管理服务的启动、停止、重启等操作。name(服务名称),state(服务状态,如 started, stopped, restarted),enabled(是否开机启动)
user管理用户账户(如创建、删除用户、修改用户属性)。name(用户名),state(用户状态,如 present, absent),uid(用户ID),groups(用户组),password(密码)
group管理 Linux 用户组(如创建、删除用户组、修改用户组属性)。name(用户组名称),state(用户组状态,如 present, absent),gid(用户组 ID)
git在目标主机上操作 Git 仓库(如克隆、拉取等)。repo(Git 仓库 URL),dest(目标路径),version(分支或标签),clone(是否克隆仓库)
docker_container用于管理 Docker 容器(启动、停止、删除等)。name(容器名称),state(容器状态,如 started, stopped, restarted),image(镜像名称)
docker_image用于管理 Docker 镜像(拉取、删除等)。name(镜像名称),state(镜像状态,如 present, absent),tag(镜像标签)
firewalld管理 firewalld 防火墙规则。service(服务名称),state(防火墙规则状态,如 enabled, disabled),zone(防火墙区域)
selinux管理 SELinux 状态。policy(SELinux 策略),state(SELinux 状态,如 enabled, disabled, permissive

功能分组:

  1. 系统检查与验证

    • ping:测试主机连通性。
    • wait_for:等待特定条件满足(如端口开启)。
    • assert:验证条件是否为真。
  2. 文件管理与配置

    • file:管理文件和目录的权限、所有者等。
    • copy:复制本地文件到远程主机。
    • lineinfile:编辑文件中的单行内容。
    • template:通过 Jinja2 模板渲染文件并复制。
  3. 定时任务与服务管理

    • cron:设置定时任务(cron jobs)。
    • service:启动、停止或重启服务。
  4. 软件包管理

    • yum:管理 CentOS/RHEL 系统的 RPM 包。
    • apt:管理 Debian/Ubuntu 系统的 APT 包。
  5. 用户与用户组管理

    • user:管理用户账户。
    • group:管理用户组。
  6. 版本控制与容器管理

    • git:操作 Git 仓库(克隆、拉取等)。
    • docker_container:管理 Docker 容器。
    • docker_image:管理 Docker 镜像。
  7. 安全与防火墙管理

    • firewalld:管理防火墙规则。
    • selinux:管理 SELinux 状态。

file模块

file 模块是 Ansible 中用于管理文件和目录的模块,可以用于设置文件或目录的属性,例如权限、所有者、符号链接等。该模块常用于配置文件的管理,比如设置文件的权限、创建目录、删除文件等。

常见用途

  • 设置文件或目录的权限、所有者和用户组
  • 创建或删除文件/目录
  • 管理符号链接
  • 更改文件的内容状态(比如将文件删除)

模块参数

参数描述
path目标文件或目录的路径。
state文件或目录的状态,常用值:file(文件),directory(目录),absent(文件或目录不存在)。
mode设置文件权限,格式如 0644
owner设置文件的所有者,通常是一个用户名。
group设置文件的用户组,通常是一个用户组名。
follow设置是否追踪符号链接。默认为 no,如果设置为 yes,会遵循符号链接。
recurse如果设置为 yes,会递归操作所有子目录和文件。适用于目录操作。
selevel用于设置 SELinux 安全上下文的级别。
serole用于设置 SELinux 安全角色。
setype用于设置 SELinux 安全类型。
seuser用于设置 SELinux 安全用户。

常见的 state

  • touch:确保目标是一个文件,若目标不存在,则创建它。(有些地方可能说是file,但是这是错误的)
  • file:即使文件不存在也不会创建,一般用于更改(只对文件有效)
  • directory:确保目标是一个目录,若目标不存在,则创建它。
  • absent:确保目标不存在,若目标存在则删除它(连同内部文件一起删除,如果是文件夹的话)。
  • link:创建符号链接,指向目标文件或目录。src=/源  dest=/目标,其它都用path不用src
  • hard:创建硬链接,指向目标文件或目录。src=/源  dest=/目标,其它都用path不用src

示例用法

ansible host -m file -a "path=/root/liye state=directory mode=0644 owner=root group=root"

注意这里报错的原因是mode,通常目录的权限是0755,我的意思是要有x权限,至少要有一个x权限

ansible host -m file -a "src=/root/liye dest=/root/liye/liye.l state=link"这个是创链接的

copy模块

常见用途

  • 将文件从控制节点复制到目标主机。
  • 配置文件的分发。
  • 复制脚本、配置文件到远程服务器。
  • 设置文件权限、所有者、组等属性。

模块参数

参数描述示例用法
src指定源文件的路径(控制节点上的文件)。src=/path/to/local_file
dest目标文件路径(远程主机上的路径)。dest=/path/to/remote_file
mode设置文件权限(如:06440755)。mode=0644
owner设置文件的所有者。owner=root
group设置文件的所属组。group=root
backup如果目标文件已存在,是否备份文件。备份会将文件重命名为 <filename>.<timestamp>.bakbackup=yes
force是否强制复制文件。如果设置为 no,只有当文件内容发生变化时,才会复制文件;默认值是 yesforce=no
content将内容直接写入文件,而不是从源文件复制。此时,src 参数无效。content="Hello World!"
validate复制文件后,验证文件内容是否符合正则表达式。validate='sha256sum %s'

示例用法

示例 1:将本地文件复制到远程主机

将控制节点上的 /path/to/local_file 文件复制到远程主机的 /path/to/remote_file

ansible host -m copy -a "src=/path/to/local_file dest=/path/to/remote_file"

示例 2:复制文件并设置权限

将文件复制到目标路径,并设置文件权限为 0644

ansible host -m copy -a "src=/path/to/local_file dest=/path/to/remote_file mode=0644"

示例 3:设置文件所有者和组

将文件复制并设置文件所有者为 root,组为 root

ansible host -m copy -a "src=/path/to/local_file dest=/path/to/remote_file owner=root group=root"

示例 4:备份目标文件

如果目标文件已存在,设置 backup=yes 会自动备份该文件。

ansible host -m copy -a "src=/path/to/local_file dest=/path/to/remote_file backup=yes"

备份的是目标主机上的原始文件,而不是要发送的本地文件。

备份文件会被重命名,通常是原文件名后加上一个时间戳(例如:file.txt.1638730242.bak)。

示例 5:强制覆盖文件

即使文件内容没有变化,也强制覆盖目标文件。

ansible host -m copy -a "src=/path/to/local_file dest=/path/to/remote_file force=yes"

示例 6:将内容直接写入文件

将直接内容写入文件,而不是从本地文件复制。src 参数无效。

ansible host -m copy -a "dest=/root/testfile content='This is a test file.'"(多次写覆盖)

示例 7:将目录复制到远程主机

将本地目录 /path/to/local_dir 复制到远程主机的 /path/to/remote_dir

ansible host -m copy -a "src=/path/to/local_dir/ dest=/path/to/remote_dir/ mode=0755"
注意src 后面有斜杠 /,表示复制目录内容,而不是整个目录本身。不加就是复制目录,很奇怪,我的显示"changed": false,但是却移动过去了。

示例 8:验证文件内容

复制文件后,通过正则验证文件内容是否符合要求。

ansible host -m copy -a "src=/path/to/local_file dest=/path/to/remote_file validate='sha256sum %s'"

user模块

user 模块是 Ansible 中用于管理用户账户的模块,可以用来创建、删除或修改远程主机上的用户账户。它提供了多种参数,可以灵活地管理用户的相关设置。

常用的 user 模块参数

参数类型描述默认值常用度
name字符串必填,指定用户的用户名。★★★★★
state字符串用于管理用户的状态,present 表示创建用户,absent 表示删除用户。present★★★★★
password字符串设置用户的密码,通常是加密后的密码。★★★★☆
echo "mypassword" | openssl passwd -1 -stdin
  • -1:选择 MD5 算法。这是较老的加密算法,在现代系统中已经被认为不够安全,因此推荐使用 SHA-512(即 -6 参数,更安全)或者 SHA-256(即 -5 参数)。
  • -stdin:表示从标准输入读取密码。在这里,echo 命令的输出通过管道传递给 openssl,而无需手动输入密码。
comment字符串设置用户的描述信息,通常是用户的全名或其他相关信息。★★★★☆
group字符串设置用户的主组,用户只能属于一个主组。★★★★☆
groups字符串设置用户的附加组,支持多个组,多个组名用逗号分隔。★★★★☆
append布尔值如果你希望添加附加组而不覆盖现有的组,可以使用 append=yes 参数。no★★★☆☆
home字符串设置用户的主目录。如果目录不存在,可以自动创建(如果 create_homeyes)。默认目录在/home/下★★★☆☆
move_home布尔值是否在修改用户的主目录时,自动将用户现有的文件移动到新主目录。no★★★☆☆
shell字符串设置用户的登录 shell,例如 /bin/bash/bin/bash★★★☆☆
create_home布尔值是否在创建用户时自动创建主目录。如果为 yes,则创建;如果为 no,则不创建。yes★★★☆☆
uid整数设置用户的 UID(用户标识符)。如果未指定,则系统自动分配。★★★☆☆
remove布尔值删除用户时是否删除用户的主目录。yes 表示删除,no 表示不删除。no★★★☆☆
force布尔值如果为 yes,强制修改用户属性,忽略任何已有的文件和目录冲突(例如,修改主目录时)。no★★★☆☆
system布尔值如果为 yes,则创建系统用户,系统用户的 UID 通常较低。no★★★☆☆
non_unique布尔值如果为 yes,允许多个用户具有相同的 UID(用户标识符)。no★★☆☆☆

示例使用

1. 创建一个用户 alice,并指定主目录、shell 和描述信息:

ansible host -m user -a "name=alice state=present home=/home/alice shell=/bin/bash comment='Alice User'"

2. 创建用户并强制修改其主目录:

ansible host -m user -a "name=bob state=present home=/home/bob move_home=yes force=yes"

3. 删除用户 alice,并删除用户的主目录:

ansible host -m user -a "name=bob state=present home=/home/bob move_home=yes force=yes"

4. 设置用户 alice 的密码(使用加密后的密码):

ansible host -m user -a "name=alice password='$6$rounds=5000$saltsalt$encryptedpassword'"

5. 创建一个系统用户 webuser,并设置其为系统用户:

ansible host -m user -a "name=webuser state=present system=yes"

yum模块

yum 模块是 Ansible 中用于管理和操作基于 RPM 的 Linux 系统(如 CentOS、RHEL、Fedora 等)软件包的一个模块。它允许你通过 Ansible 来安装、升级、删除软件包,或管理 yum 仓库的配置。

常用参数
参数类型描述默认值
name字符串/列表要安装、更新或删除的软件包名称,支持多个包名用逗号分隔。只有仓库操作时才不会用到name
state字符串软件包的状态。present 表示安装,latest 表示更新到最新版本,absent 表示删除软件包。present
update_cache布尔值是否更新缓存。yes 表示更新,no 表示不更新。no
disable_gpg_check布尔值是否禁用 GPG 检查。yes 禁用 GPG 检查,no 启用 GPG 检查。no
enablerepo字符串/列表启用指定的仓库,可以指定一个或多个仓库名,多个仓库名之间用逗号分隔。
disablerepo字符串/列表禁用指定的仓库,多个仓库名用逗号分隔。
update_only布尔值如果为 yes,则仅更新已安装的软件包。no
installroot字符串指定软件包安装的根目录。默认情况下是 //
verify布尔值是否在安装后验证软件包。yes 表示验证,no 表示不验证。no
exclude字符串/列表exclude 是一个以逗号分隔的软件包名称列表。Ansible 在执行 yum 操作时,会排除这些包,避免它们被更新或安装。(可以用*通配)

示例使用

1. 安装软件包

安装一个或多个软件包,例如安装 httpdvim

ansible host -m yum -a "name=httpd,vim state=present"

2. 安装最新版本的软件包

如果你想安装软件包的最新版本,可以将 state 设置为 latest(对已安装进行更新)

ansible host -m yum -a "name=httpd state=latest"

3. 删除软件包

如果你要删除一个或多个软件包,可以将 state 设置为 absent

ansible host -m yum -a "name=httpd state=absent"

4. 更新缓存

在某些情况下,你可能希望更新软件包缓存(尤其是在添加了新的仓库后):

ansible host -m yum -a "name=httpd update_cache=yes state=present"

5. 禁用 GPG 检查

如果你遇到 GPG 错误,或者在使用不受信任的仓库时,可以选择禁用 GPG 检查:

ansible host -m yum -a "name=httpd state=present disable_gpg_check=yes"

6. 启用和禁用特定的仓库

如果你只想使用特定的仓库来安装软件包,可以使用 enablerepodisablerepo 参数。

  • 启用特定仓库:

    • ansible host -m yum -a "name=httpd enablerepo=epel state=present"

  • 禁用特定仓库:

    • ansible host -m yum -a "name=httpd disablerepo=base state=present"

7. 仅更新已安装的软件包

如果你只想更新已安装的软件包,而不是安装新软件包,可以使用 update_only=yes

ansible host -m yum -a "name=httpd update_only=yes"

service模块

Ansible 的 service 模块用于管理和控制系统服务(如启动、停止、重启等)。它是一个通用模块,适用于大多数 Linux 和 Unix 系统。通过这个模块,可以在目标主机上启用、禁用、启动、停止或重启服务。

常用参数
参数类型描述默认值
name字符串要管理的服务名称(如 httpd, sshd, nginx 等)。service 模块中,一次只能操作一个服务。每次调用 service 模块时,你只能指定一个服务名(通过 name 参数)。必填
state字符串服务的状态。常见值:started, stopped, restarted, reloadedstarted
enabled布尔值是否在系统启动时启用或禁用服务。yes 启用,no 禁用。no
sleep整数在执行服务操作后等待指定的秒数,通常用于等待服务完全启动。
runlevel字符串在特定运行级别下启用服务,通常用于 SysV 或 Upstart 服务。
pattern字符串用于匹配一个或多个服务。通常在某些系统中用来选择服务(如使用通配符匹配)。

常见的 state

  • started:启动服务。
  • stopped:停止服务。
  • restarted:重启服务。
  • reloaded:重新加载服务(如果服务支持重载)。
示例用法
1. 启动服务

ansible host -m service -a "name=httpd state=started"

2. 停止服务

ansible host -m service -a "name=httpd state=stopped"

3. 重启服务

ansible host -m service -a "name=httpd state=restarted"

4. 重新加载服务

ansible host -m service -a "name=httpd state=reloaded"

5. 启用服务

ansible host -m service -a "name=httpd enabled=yes"

6. 禁用服务

ansible host -m service -a "name=httpd enabled=no"

7. 检查服务状态(用于调试)

如果你不确定服务的状态,可以通过 ansibleservice_facts 来获取目标主机上所有服务的状态信息:

ansible host -m service_facts

cron模块

Ansible 的 cron 模块用于管理 cron 作业(定时任务)。你可以使用它来添加、删除或修改 cron 作业。

常用参数
参数类型描述默认值
name字符串cron 任务的名称,用于标识该任务。必填
minute字符串任务执行的分钟,支持值为 0 到 59,或 *(每分钟)。*
hour字符串任务执行的小时,支持值为 0 到 23,或 *(每小时)。*
day字符串任务执行的日期,支持值为 1 到 31,或 *(每天)。*
month字符串任务执行的月份,支持值为 1 到 12,或 *(每月)。*
weekday字符串任务执行的星期几,支持值为 0 到 6(0=周日,1=周一...),或 *(每天)。*
user字符串运行任务的用户(通常是 root)。当前用户
state字符串任务的状态。常用值:present(存在)和 absent(删除)。present
job字符串要执行的命令。必填
special_time字符串特殊的时间设置,如 reboot

常见 state

  • present:确保 cron 任务存在。如果任务不存在,则会添加。
  • absent:确保 cron 任务不存在。如果任务存在,则会删除。
示例用法

添加一个简单的定时任务

例如:每小时运行一个脚本 /path/to/script.sh

ansible host -m cron -a "name='run script every hour' minute='0' hour='*' job='/path/to/script.sh' state=present"

添加一个每天执行的任务

例如:每天凌晨 2 点执行 backup.sh 脚本:

ansible host -m cron -a "name='daily backup' minute='0' hour='2' job='/path/to/backup.sh' state=present"

删除一个定时任务

例如:删除名称为 run script every hourcron 任务:

ansible host -m cron -a "name='run script every hour' state=absent"

使用 special_time 设置特殊时间

例如:系统重启后执行某个命令:

ansible host -m cron -a "name='run on reboot' special_time='reboot' job='/path/to/reboot_script.sh' state=present"

shell模块

Ansible 的 shell 模块用于在目标主机上执行 Shell 命令。这是一个通用模块,可以用来执行任何可以在 Shell 中运行的命令,包括脚本、命令行工具等。

常用参数
参数类型描述默认值
cmd字符串要执行的命令或脚本。{不是cmd=xx的形式}必填
executable字符串指定要使用的 Shell 类型,例如 /bin/bash/bin/sh
creates字符串如果指定的文件已存在,则不会执行命令。
chdir字符串在指定目录下执行命令。
stdin字符串向命令传递标准输入。
warn布尔值是否显示警告信息,通常是用来忽略某些潜在错误。yes
示例用法

执行一个简单的命令

例如:执行 echo 命令来输出信息:

ansible host -m shell -a "echo 'Hello, World!'"

执行脚本

例如:在 /tmp 目录下执行一个脚本 /tmp/my_script.sh

ansible host -m shell -a "bash /tmp/my_script.sh"

在指定目录下执行命令

例如:在 /tmp 目录下执行 ls 命令:

ansible host -m shell -a "ls" chdir="/tmp"

使用 creates 参数避免重复执行

例如:如果 /tmp/my_file.txt 文件存在,则不执行命令:

ansible host -m shell -a "touch /tmp/my_file.txt" creates="/tmp/my_file.txt"

使用 executable 指定 Shell 类型

例如:使用 /bin/bash 执行命令:

ansible host -m shell -a "echo 'Hello, Bash!'" executable="/bin/bash"

执行命令并传递标准输入

例如:使用标准输入传递给命令:

ansible host -m shell -a "cat" stdin="This is a test"

template模块(多和playbook一起)

Ansible 的 template 模块用于从模板文件中生成配置文件或其他文本文件。它基于 Jinja2 模板引擎,将变量和表达式嵌入到文本中生成最终的文件内容。

使用 template 模块时,通常会在源文件中使用 Jinja2 的语法来替换变量和执行条件判断、循环等操作。

常见选项:

选项描述示例
src模板文件的路径(通常是 .j2 后缀)。src=nginx.conf.j2
dest目标文件的路径,生成的文件将保存到此位置。dest=/etc/nginx/nginx.conf
owner设置目标文件的所有者。owner=root
group设置目标文件的组。group=root
mode设置目标文件的权限。mode=0644
backup如果设置为 yes,会创建目标文件的备份。backup=yes

示例命令:

ansible <host> -m template -a "src=/path/to/template.j2 dest=/path/to/destination owner=root group=root mode=0644 backup=yes"

注意,这里的xx.j2其实就是你写好的配置文件,他会去找同名的替换。和copy不一样的是,可以接收playbook中的变量,直接在文中就这种方式引入{{playbook中的binlog}}

四,playbook

Ansible自动化运维(三)Playbook 模式详解_ansible-playbook -e-CSDN博客

概述

Ansible Playbook 是 Ansible 中用于自动化任务的核心文件,它是一个以 YAML 格式编写的文件,包含了一组定义自动化任务的 "plays"。每个 "play" 主要定义了哪些主机需要执行哪些任务(任务通常是模块的调用)。Playbook 可以让你描述并执行一系列任务,以实现系统配置、应用部署、任务管理等自动化操作。

Playbook 是 Ansible 中最强大的功能之一,支持复杂的工作流、条件逻辑、循环等结构。

核心元素

Playbook 的核心元素包括:

  1. play: 每个 Play 描述了一个特定的主机组和与这些主机进行交互的任务。一个 Playbook 由一个或多个 Play 组成。

  2. host: Play 定义了要操作的主机,可以是单个主机、主机组或 IP 地址。主机列表通常来自于 inventory 文件。

  3. tasks: Playbook 中的每个 Play 下会包含一个或多个任务(tasks),每个任务通常调用一个模块来执行某个操作(如安装软件、复制文件等)。

  4. vars: 变量可以用于动态控制 Playbook 的行为,如根据环境、目标主机等条件决定要执行的任务。

  5. handlers: Handlers 是特殊类型的任务,它们只有在某个任务被触发时才会执行(例如:当某个文件被修改时,触发服务重启)。

  6. roles: Roles 是 Playbook 中的一种组织方式,允许将复杂的任务分解成多个小块,以便更好地重用、维护和管理。

  7. Loops and Conditionals: Playbook 支持循环和条件语句,可以根据条件来控制任务的执行。比如,基于特定变量的值执行不同的任务。

  8. tags: Playbook 支持使用标签来标识任务,这样可以选择性地执行特定任务。

  9. Includes and Imports: Playbook 允许包含或导入其他 Playbook 或任务文件,以便分割任务并提高重用性。

格式语法(yaml)

Playbook 文件使用 YAML 格式编写,遵循以下基本语法规则:

  • 缩进:YAML 使用缩进来表示层级,通常每个层级缩进 2 个空格。
  • 键值对:键值对之间使用冒号分隔。
  • 列表:列表项以 - 开头。
基本结构

一个简单的 Playbook 的结构通常如下所示:

---
# Playbook 开始
- name: Playbook 的描述hosts: web_servers  # 指定目标主机组,执行任务的主机是 web_servers 组中的主机become: yes  # 提升权限,以 root 用户执行任务# 定义 Playbook 使用的变量vars:nginx_version: "1.20.1"  # 定义 nginx 版本号custom_html: |  # 定义一个自定义 HTML 内容,用作网页<html><head><title>Welcome to Nginx!</title></head><body><h1>This is a custom Nginx page!</h1></body></html># 任务部分,Playbook 中的主要操作tasks:- name: 安装 nginxyum:  # 使用 yum 模块进行包管理name: nginx-{{ nginx_version }}  # 安装指定版本的 nginxstate: present  # 确保 nginx 包已经安装- name: 复制自定义的 index.html 到目标主机copy:  # 使用 copy 模块复制文件content: "{{ custom_html }}"  # 使用自定义 HTML 内容dest: /usr/share/nginx/html/index.html  # 复制到 nginx 的默认网页路径- name: 启动 nginx 服务service:  # 使用 service 模块管理服务name: nginx  # 服务名称state: started  # 确保 nginx 服务已启动- name: 设置 nginx 服务为开机自启service:  # 使用 service 模块设置开机自启name: nginx  # 服务名称enabled: yes  # 启用开机启动- name: 修改配置文件template:src: 模版文件.j2(里面可以用到playbook的变量)dest: /etc/xx/要替换的文件notify: #如果任务成功了而且changed为true就触发对应的hander- 在路上hander的名字# 处理程序部分,处理需要触发的操作(如服务重启)handlers:# 定义一个 handler,用于重启 nginx 服务- name: Restart nginx serviceservice:  # 使用 service 模块重启 nginx 服务name: nginx  # 服务名称state: restarted  # 重启服务

补充声明关于yaml文档书写方式

在 Ansible Playbook 中,模块的参数可以用简化的 key=value 形式进行声明。这样书写方式的目的是让 Playbook 更简洁,容易理解和书写。也可以向使用命令一样的使用

比如简化写法:
---
- name: 安装 httpd 包yum:name: httpdstate: present通过键值对的形式书写任务的模块和参数。这种方式更简洁,也更符合 YAML 的结构。它通常是针对 Ansible 中一些常见的模块(如 yum、service、copy 等)来书写参数的,而无需完全展开模块的详细语法。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
比如完整写法:
---
- name: 安装 httpd 包yum: name=httpd state=present disable_gpg_check=no enablerepo=epel简洁性:这种写法可以显著简化 Playbook 的结构,尤其是在任务比较简单时,参数不多时使用这种方式非常方便。
易读性:对于参数较少、简单的任务来说,这种写法有助于提高 Playbook 的紧凑性,但如果参数较多,还是推荐使用多行书写。当参数较多时,单行的写法可能会导致可读性差,因为参数过长时可能会变得难以辨认。这时推荐采用多行书写(即每个参数一行),以提高可读性和维护性。

相关命令

ansible-playbook 是用来执行 Playbook 文件的命令。

命令/选项描述示例
ansible-playbook playbook.yml执行指定的 Playbook 文件。ansible-playbook playbook.yml
-i <inventory_file>指定使用的库存文件,默认是 /etc/ansible/hostsansible-playbook -i my_inventory playbook.yml
-v / -vv / -vvv设置输出的详细级别,-v 是普通输出,-vv 是更详细的输出,-vvv 是最详细的输出。ansible-playbook -v playbook.yml
--tags <tag1,tag2,...>只运行带有指定标签的任务。ansible-playbook playbook.yml --tags "install,configure"
--skip-tags <tag1,tag2,...>跳过带有指定标签的任务。ansible-playbook playbook.yml --skip-tags "install"
--check执行 Playbook 的干运行(dry-run),仅检查会发生的更改而不实际执行。ansible-playbook playbook.yml --check
--limit <host>限制运行指定的主机,可以是单个主机名、主机组或主机模式(例如 web_servers[1])。ansible-playbook playbook.yml --limit web_server1
--list-vars列出所有可以使用的变量和相关信息。ansible-playbook playbook.yml --list-vars
--syntax-check检查 Playbook 文件的语法是否正确。ansible-playbook playbook.yml --syntax-check
--start-at-task <task_name>从指定任务开始执行 Playbook,而不是从头开始执行。ansible-playbook playbook.yml --start-at-task "Install nginx"
--extra-vars <key=value>传递额外的变量值,可以在命令行中动态覆盖 Playbook 中的变量。ansible-playbook playbook.yml --extra-vars "my_var=value"
--private-key <path_to_key>使用指定的私钥文件进行 SSH 连接,通常用于免密登录。ansible-playbook playbook.yml --private-key /path/to/key
--ask-vault-pass在执行时提示输入 Ansible Vault 密码。ansible-playbook playbook.yml --ask-vault-pass
--vault-password-file <file>指定包含 Vault 密码的文件,用于解密敏感数据。ansible-playbook playbook.yml --vault-password-file ~/.ansible-vault-password

五,roles

概述

Ansible 的 Roles 是一种用于组织 Playbook 和任务的结构化方法。通过使用 Roles,可以将一个复杂的自动化过程分解为多个独立的部分,每个部分处理不同的任务。这样有助于提高任务复用性和模块化。

Roles 使得 Ansible 配置管理更加清晰、可维护,并可以方便地共享和重用。每个 Role 包含了一组与某个特定功能相关的任务、变量、模板和文件等。

目录结构

  • defaults/main.yml
    存放该角色的默认变量,这些变量的优先级最低,用户可以通过覆盖文件来改变变量值。

  • files/
    存放静态文件,这些文件可以被传送到目标主机上,如配置文件、脚本等。

  • handlers/main.yml
    存放处理程序(handlers),处理程序通常在任务运行完成后根据条件触发,比如重新启动服务。

  • meta/main.yml
    存放该角色的元数据,如依赖关系、作者、版本等信息。

  • tasks/main.yml
    存放角色执行的具体任务。一个角色的任务列表会在这个文件中定义,任务的执行顺序由此文件确定。

  • templates/
    存放 Jinja2 模板文件,这些文件可以通过变量动态生成配置文件等。

  • tests/test.yml
    用于测试角色是否正确执行的 Playbook 文件。通过执行测试 Playbook 可以验证角色的功能是否正常。

  • vars/main.yml
    存放该角色的变量,优先级高于 defaults/main.yml。这些变量用于控制角色的行为。

编写步骤

步骤 1: 创建 Role 目录(注意目录结构,建议在/etc/ansible/roles执行命令)

使用 ansible-galaxy 命令来创建一个新的 Role 结构:

ansible-galaxy init myrole
#ansible-galaxy init 【角色名】

这将自动生成上面提到的标准目录结构。

步骤 2: 编写角色任务(Tasks)

myrole/tasks/main.yml 中定义角色的任务。例如:

---
- name: Install nginxyum:name: nginxstate: present- name: Start nginx serviceservice:name: nginxstate: startedenabled: yes
步骤 3: 设置默认变量(Defaults)

myrole/defaults/main.yml 中定义默认变量。例如:

---
nginx_port: 80
nginx_user: nginx

这些变量可以在其他地方被覆盖。

步骤 4: 编写模板(Templates)

myrole/templates 目录下,创建 Jinja2 模板文件。例如 nginx.conf.j2

server {listen       {{ nginx_port }};server_name  localhost;root         /usr/share/nginx/html;
}
步骤 5: 使用文件(Files)

如果需要在角色中使用静态文件,添加到 files/ 目录下,例如上传的配置文件。

步骤 6: 编写处理程序(Handlers)

handlers/main.yml 中定义处理程序,通常用于在任务变更时进行额外的操作,如重启服务:

---
- name: Restart nginxservice:name: nginxstate: restarted
步骤 7: 编写元数据(Meta)

meta/main.yml 中定义角色的元数据,可以指定角色的依赖关系、版本等信息

---
dependencies:- { role: common, version: "1.0" }
步骤 8: 编写测试 Playbook

tests/test.yml 中编写测试 Playbook,确保角色按预期工作:

- hosts: localhostroles:- myrole
步骤 9: 使用 Role

在 Playbook 中使用创建的 Role,例如:

- hosts: web_serversroles:- myrole

六,ansible面试题

ansible的执行模式:

执行模式:Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook

ad-hoc模式(点对点模式):

使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell

playbook模式(剧本模式):

是Ansible 主要管理方式 ,也是Ansib1e功能强大的关健所在。playbook通过多个task集合完成一类功能,如web服务的安装部署、数据库服务器的批量备份等。可以简单地把p1aybook理解为通过组合多条ad-hoc操作的配置文件

ansible的执行流程:

执行流程:

简单理解就是ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取Inventory中的管理主机列表,并行的在这些主机中执行配置的任务, 最后等待执行返回的结果

具体流程:

  1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
  2. 查找对应的主机配置文件,找到要执行的主机或者组
  3. 加载自己对应的模块文件,如command
  4. 通过ansible将模块或命令生成对应的临时py文件(python脚本),并将读文件传输至远程服务器
  5. 对应执行用户的家目录的.ansible/tmp/x00/x0.PY文件
  6. 给文件 +x 执行权限
  7. 执行并返回结果
  8. 删除临时py文件,sleep 0退出

ansible的常用模块,如何使用

Ansible 模块是 Ansible 提供的可用于执行特定任务的代码单元

常用的模块有:copy文件拷贝 yum软件安装与卸载 file文件管理 shell执行she11命令 user用户管理 service服务管理等

你用ansible实现了什么功能

  1. 通过ansible批量jdk,nginx等软件的安装
  2. 根据指定内容查找文件,统一处理。比如Fast]son反序列化漏洞,通过'Fast]son"关键字查找有无对应文件,如果有则进行整改

简单的说一下ansible在一百台机器上安装nginx的过程

  1. 收集被管主机的信息(IP,账号,密码)
  2. 编写主机清单文件工
  3. 准备相关配置文件(yum源文件,nginx配置文件)
  4. 编写playbook剧本,主要是以下几个方面(定义变量,yum配置,软件安装,基于模板的配置文件,服务管理等)
  5. 修改nginx配置文件,通过变量获取数据
  6. 检查剧本格式
  7. 执行
  8. 找其中一台主机确认结果

相关文章:

day1:ansible

ansible-doc <module_name>&#xff08;如果没有网&#xff0c;那这个超级有用&#xff09; 这个很有用&#xff0c;用来查单个模块的文档。 ansible-doc -l 列出所有模块 ansible-doc -s <module_name> 查看更详细的模块文档。 ansible-doc --help 使用 --help …...

如何设置Java爬虫的异常处理?

在Java爬虫中设置异常处理是非常重要的&#xff0c;因为网络请求可能会遇到各种问题&#xff0c;如连接超时、服务器错误、网络中断等。通过合理的异常处理&#xff0c;可以确保爬虫的稳定性和健壮性。以下是如何在Java爬虫中设置异常处理的步骤和最佳实践&#xff1a; 1. 使用…...

阿里云盘permission denied

问题是执行 ./aliyunpan 时遇到了 Permission denied 的错误。这通常是因为文件没有执行权限。以下是解决问题的步骤&#xff1a; 检查文件权限 运行以下命令检查文件的权限&#xff1a; ls -l aliyunpan输出中会看到类似以下内容&#xff1a; -rw-r--r-- 1 user group 123…...

在 Ubuntu 24 上安装 Redis 7.0.15 并配置允许所有 IP 访问

前提条件 一台运行 Ubuntu 24 的服务器拥有 sudo 权限的用户 步骤一&#xff1a;更新系统包 首先&#xff0c;确保系统包是最新的&#xff0c;以避免潜在的依赖问题。 sudo apt update sudo apt upgrade -y步骤二&#xff1a;安装编译 Redis 所需的依赖 Redis 需要一些编译…...

构建高效可靠的分布式推理系统:深入解析控制器与模型服务的协同工作

在现代互联网应用中,随着用户需求的增长和技术的进步,单一服务器已经难以满足大规模并发请求的需求。为了提升系统的性能和可靠性,开发者们越来越多地采用分布式架构。本文将结合具体的代码示例,深入浅出地探讨如何构建一个高效的分布式推理系统,并详细解析其中的关键组件…...

springboot394疫情居家办公系统(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统疫情居家办公系统信息管理难度大&#xff0c;容错率低&a…...

共筑数字安全防线,2024开源和软件安全沙龙即将启幕

随着数字化转型进程的加快以及开源代码的广泛应用&#xff0c;开源凭借平等、开放、协作、共享的优秀创作模式&#xff0c;逐渐成为推动数字技术创新、加速传统行业转型升级的重要模式。但随着软件供应链日趋复杂多元&#xff0c;使得其安全风险不断加剧&#xff0c;针对软件供…...

后端报错: message: “For input string: \“\““

这个错误信息表明后端尝试将一个空字符串 "" 转换为某种数值类型&#xff08;如整数、长整型等&#xff09;&#xff0c;但转换失败了。在许多编程语言中&#xff0c;如果你试图解析一个非数字的字符串&#xff08;在这个情况下是一个空字符串&#xff09;为数值类型…...

39 矩阵置零

39 矩阵置零 39.1 矩阵置零解决方案 解题思路&#xff1a; 利用第一行和第一列标记&#xff1a; 使用两个标记变量&#xff0c;rowZero和colZero&#xff0c;来判断第一行和第一列是否需要置零。遍历矩阵从(1,1)开始&#xff0c;如果某个元素是0&#xff0c;则标记该行和该列…...

使用伪装IP地址和MAC地址进行Nmap扫描

使用伪装IP地址和MAC地址进行Nmap扫描 在某些网络设置中&#xff0c;攻击者可以使用伪装的IP地址甚至伪装的MAC地址进行系统扫描。这种扫描方式只有在可以保证捕获响应的情况下才有意义。如果从某个随机的网络尝试使用伪装的IP地址进行扫描&#xff0c;很可能无法接收到任何响…...

linux安装docker和mysql

1.下载安装doker 1. 更新系统,确保系统是最新的 sudo yum update -y2.安装 Docker 所需的依赖包&#xff1a; sudo yum install -y yum-utils 2. 设置 Docker 仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 3. 安装 Dock…...

贪心算法专题(四)

目录 1. 单调递增的数字 1.1 算法原理 1.2 算法代码 2. 坏了的计算器 2.1 算法原理 2.2 算法代码 3. 合并区间 3.1 算法原理 3.2 算法代码 4. 无重叠区间 4.1 算法原理 4.2 算法代码 5. 用最少数量的箭引爆气球 5.1 算法原理 ​5.2 算法代码 1. 单调递增的数字…...

QT 多级嵌套结构体,遍历成员--半自动。<模板+宏定义>QTreeWidget树结构显示

Qt的QTreeWidget来显示嵌套结构体的成员&#xff0c;并以树形结构展示。 #include <QApplication> #include <QTreeWidget> #include <QTreeWidgetItem> #include <QString> #include <cstdint>// 假设这些是你的结构体定义 struct BaseMeterPa…...

NLP-中文分词

中文分词 1、中文分词研究背景及意义 和大部分西方语言不同&#xff0c;书面汉语的词语之间没有明显的空格标记&#xff0c;句子是以字串的形式出现。因此对中文进行处理的第一步就是进行自动分词&#xff0c;即将字串转变成词串。 比如“中国建筑业呈现新格局”分词后的词串…...

详解LeetCode地下城游戏(动态规划)——区分两种状态表示形式

地下城游戏 题目链接&#xff1a;174. 地下城游戏 状态表示&#xff1a; 按照以往题的表示&#xff0c;dp[i][j]表示&#xff1a;从起点&#xff08;0&#xff0c;0&#xff09;位置到达&#xff08;i&#xff0c;j&#xff09;位置时&#xff0c;所需的最小初始健康值。但是…...

.NET正则表达式

正则表达式提供了功能强大、灵活而又高效的方法来处理文本。 正则表达式丰富的泛模式匹配表示法使你可以快速分析大量文本&#xff0c;以便&#xff1a; 查找特定字符模式。 验证文本以确保它匹配预定义模式&#xff08;如电子邮件地址&#xff09;。 提取、编辑、替换或删除…...

k8s 为什么需要Pod?

Pod&#xff0c;是 Kubernetes 项目中最小的 API 对象&#xff0c;更加专业的说&#xff0c;Pod&#xff0c;是 Kubernetes 项目的原子调度单位。 Pod 是 Kubernetes 里的原子调度单位。这就意味着&#xff0c;Kubernetes 项目的调度器&#xff0c;是统一按照 Pod 而非容器的资…...

CV(3)--噪声滤波和特征

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 图像噪声&#xff08;需要主动干扰的场景&#xff09;&#xff1a; 添加高斯噪声&#xff1a;概率密度函数服从高斯分布的一类噪声 通过设置sigma和mean生成符合高斯分布的随机数&#xff0c;然后计算输出像素&#xff0c;放缩…...

LDR6500:音频双C支持,数字与模拟的完美结合

在当今数字化快速发展的时代&#xff0c;音频设备的兼容性和性能成为了用户关注的重点。LDR6500&#xff0c;作为乐得瑞科技精心研发的USB Power Delivery&#xff08;PD&#xff09;协议芯片&#xff0c;凭借其卓越的性能和广泛的应用兼容性&#xff0c;为音频设备领域带来了新…...

python web app开发

背景: web app VS 本地GUI开发 web app开发以来一直被人诟病性能,无法访问本地设备,无状态的等缺点而被迫转向本地GUI开发;但本地开发如C++ QT,MFC,WinForm等开发结构又太重,使人望而生畏。web app有个有点就…...

redis数据结构和内部编码及单线程架构

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 1. 数据结构和内部编码 Redis会在合适的场景选择合适的内部编码 我们可以通过objectencoding命令查询内部编码 : 2. 单线程架构 …...

【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2024年最新的方法,实测有效)

文章目录 前言一、前置条件1、已安装Visual Studio Code&#xff0c;并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号]&#xff0c;2、在Visual Studio Code扩展中搜索Unity&#xff0c;并安装3、同时注意这个插件下面的描述&#xff0c;需要根…...

AI大模型学习笔记|人工智能的发展历程、智能体的发展、机器学习与深度学习的基本理论

学习链接&#xff1a;冒死上传&#xff01;价值2W的大模型入门到就业教程分享给大家&#xff01;轻松打造专属大模型助手&#xff0c;—多模态、Agent、LangChain、ViT、NLP_哔哩哔哩_bilibili 百度网盘自己整理的笔记&#xff1a; 通过网盘分享的文件&#xff1a;1-人工智能的…...

C#实现一个HttpClient集成通义千问-多轮对话功能实现

多轮对话功能实现 视频教程实现原理消息的类型 功能开发消息类修改请求体修改发送请求函数修改用户消息输入 多轮对话的token消息完整文档消息类型 视频教程 .NetAI开发入门HttpClient实现通义千问集成-多轮对话功能实现 实现原理 一直保留更新messages 现在设置的meessages只…...

Java Web 7 请求响应(Postman)

前言&#xff08;SpringBoot程序请求响应流程&#xff09; 以上一章的程序为例&#xff0c;一个基于SpringBoot的方式开发一个web应用&#xff0c;浏览器发起请求 /hello 后 &#xff0c;给浏览器返回字符串 “Hello World ~”。 而我们在开发web程序时呢&#xff0c;定义了一…...

Android APP自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记&#xff0c;当前清理空间&#xff0c;本来想直接删除掉的&#xff0c;但是感觉有些舍不得&#xff0c;因此先搬移过来。 Android导入已有外部数据库 2015.06.26在QQ空间记录&#xff1a;在Android中不能直接打开res aw目录中的数据…...

Linux 系统报打开的文件过多

1.问题 1804012290 [reactor-http-epoll-1] WARN i.n.channel.DefaultChannelPipeline - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception. - io.nett…...

javaWeb之过滤器(Filter)

目录 前言 过滤器概述 什么是过滤器 过滤器详细 过滤器的生命周期 过滤器的应用 创建一个简单的Filter类步骤 注意&#xff1a;指定拦截路径&#xff0c;我们有两种方式 实例 前言 本篇博客的核心 知道过滤器的整个拦截过程知道如何指定拦截路径知道过滤器的生命周期…...

ModStartBlog v10.0.0 发布时间自定义,多图快速粘贴,博客编辑器升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装 …...

Unexpected token ‘<‘, “<!doctype “... is not valid JSON

Unexpected token ‘<’, "<!doctype "… is not valid JSON 在前端开发时&#xff0c;遇到以下报错内容。 1.报错内容如下&#xff1a; // 报错内容 Uncaught (in promise) SyntaxError: Unexpected token <, "<!doctype "... is not valid…...