从零开始的云计算生活——第三十六天,山雨欲来,Ansible入门

目录

一.故事背景

二.Ansible简介

什么是Ansible?

Ansible的特点

Ansible的架构

三.Ansible任务执行解析

ansible任务执行模式

ansible执行流程

ansible命令执行过程(重要)

四.Ansible配置解析

ansible的安装方式

ansible的程序结构(yum安装为例)

ansible的配置文件查找顺序(重要)

ansible的配置文件

ansible的主机清单

五.Ansible常用命令

ansible命令集解释

ansible-doc命令

ansible命令

ansible配置公私钥

六.部署ansible管理集群

实验环境

实验步骤

添加主机清单

配置公私钥(三下回车)

七.Ansible常用模块

主机连通性测试

command模块

shell模块

copy模块

file模块

fetch模块

cron模块

yum模块

service模块

user模块

group模块

script模块

setup模块

八.总结


一.故事背景

结束zabbix之后,紧接着就是自动化模块,本节内容是有关Ansible自动化模块的内容,介绍了ansible最基础的内容。

二.Ansible简介

什么是Ansible?
  • ansible是新出现的自动化运维工具,基于python开发,集合了很多的运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

  • ansible是基于paramiko开发的,并且基于模块化工作,它本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架,ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经被红帽官方收购,是自动化运维工具认可度最高的。

  • 更加详细的资源参考官方文档,如右是Ansible的官方网站:Ansible Documentation

Ansible的特点
  • 部署简单,只需要在主控端部署Ansible环境,被控端无需做任何操作;

  • 默认使用SSH协议对设备进行管理;

  • 有大量的常规运维操作模块,可实现日常绝大部分的操作;

  • 配置简单、功能强大、扩展性强;

  • 支持API以及自定义模块,可以通过Python轻松扩展;

  • 通过Playbooks来定制强大的配置、状态管理;

  • 轻量级、无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;

  • 提供一个功能强大、操作性强的web管理界面和REST API接口——AWX平台。

Ansible的架构

  • Ansible:Ansible的核心程序

  • HostInventory:记录有Ansible管理的主机信息,包括端口、密码、IP地址等

  • Playbooks:“剧本”YAML格式的文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。

  • CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务

  • CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。

  • ConnectionPlugins:连接插件,Ansible和Host通信使用

三.Ansible任务执行解析

ansible任务执行模式
  • ansible系统由控制主机被管节点的操作方式可以分为两类,即adhoc和playbook

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

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

  • playbook模式(剧本模式)

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

ansible执行流程

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

ansible命令执行过程(重要)
  • 加载自己的配置文件,默认为/etc/ansible/ansible.cfg;

  • 查找对应的主机配置文件,找到要执行的主机或者组;

  • 加载自己对应的模块文件,如command;

  • 通过ansible将模块或者命令生成对应的py文件(python脚本),并且将该文件传输到远程服务器;

  • 对应执行用户的家目录.ansible/tmp/xxx/xxx.py文件;

  • 给文件添加执行权限;

  • 执行并且返回结果;

  • 删除临时的py文件, sleep 0退出;

四.Ansible配置解析

ansible的安装方式
  • ansible安装常用两种方式,yum安装和pip程序安装。

使用pip(python的包管理模块)安装

  • 首先,我们需要安装python-pip包,安装完成之后,则直接使用pip命令来安装我们的包,具体操作过程如下:

yum install python-pip
pip install ansible 

使用yum安装

  • yum安装是我们比较熟悉的安装方式。我们需要先安装一个epel-release包,然后再安装ansible即可。

yum install epel-release -y
yum install ansible -y 

ansible的程序结构(yum安装为例)
  • 配置文件目录:/etc/ansible/

  • 执行文件目录:/usr/bin/

  • Lib库依赖目录:/usr/lib/pyhtonX.X/site-packages/ansible/

  • Help文档目录:/usr/share/doc/ansible-X.X.X/

  • Man文档目录:/usr/share/man/man1/

ansible的配置文件查找顺序(重要)
  • ansible与我们其他的服务在这一点上又很大的不同,这里的配置文件查找是从多个地方找的,顺序如下:

1.检查环境变量 ANSIBLE_CONFIG 指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible/ansible.cfg);

2. ~/.ansible.cfg,检查当前目录下的ansible.cfg配置文件;

3./etc/ansible.cfg检查etc目录的配置文件。

ansible的配置文件
  • ansible的配置文件路径是/etc/ansible/ansible.cfg,ansible许多参数,

默认没有,可以使用命令生成或者去官网寻找,我们使用命令生成

ansible-config init --disabled -t all > ansible.cfg

下面我们列出一些常见的参数:

inventory = /etc/ansible/hosts    #这个参数表示资源清单inventory文件的位置
library = /usr/share/ansible    #指向存放ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就行。
 
fbrks = 5    #并发连接数,默认为5
sudo_user = root    #设置默认执行命令的用户 ,2.14版本中是:become_user=root
remote_port = 22    #指定连接被管理节点的端口,默认为22端口,为安全考虑,建议修改
host_key_checking = False    #设置是否检查SSH主机的密钥,值为True/False,关闭后第一次连接不会提示配置实例
timeout = 60    #设置SSH连接的超时时间,单位为秒
log_path = /var/log/ansible.cfg    #指定一个存储ansible日志的文件(默认不记录日志)

ansible的主机清单
  • 在配置文件中,我们提到了资源清单,这个清单就是主机清单,里面保存的是一些ansible需要连接管理的主机列表。

  • 如下是ansible主机清单的定义方式:

1.直接指明主机地址或者主机名:
#green.example.com#
#bule.example.com#
# 192.168.115.101
# 192.168.115.102
 
2.定义一个主机组(组名)把地址或者主机名加进去
[mysql_test]
192.168.115.101
192.168.115.102
192.168.115.103 

需要注意的是,这里的组成员可以使用通配符来匹配,这样对于一些标准化管理就比较方便。我们可以根据实际情况来配置我们的主机列表。

这里添加一组主机

五.Ansible常用命令

ansible命令集解释
  • /usr/bin/ansible,Ansible AD-Hoc临时命令执行工具,常用于临时命令的执行

  • /usr/bin/ansible-doc,Ansible模块功能查看工具(document)

  • /usr/bin/ansible-galaxy,下载上传优秀的代码或者Roles模块的官网平台,基于网络的

  • /usr/bin/ansible-playbook,Ansible定制自动化的任务集编排工具

  • /usr/bin/ansible-pull,Ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维架构能力要求高)

  • /usr/bin/ansible-vault,Ansible文件加密工具

  • /usr/bin/ansible-console,Ansible基于Linux Consoble界面可与用户交互的命令执行工具

  • ansible-community:

    • 含义:

      • “ansible-community” 严格来说不是一个命令。Ansible 是一个自动化工具,Ansible 社区(Ansible-community)是围绕 Ansible 项目的一个开源社区。这个社区主要负责维护和开发 Ansible 相关的内容,包括模块、插件、角色等。社区成员通过贡献代码、提交问题、参与讨论等方式来改进 Ansible 生态。

    • 用法:

      • 作为用户,你可以在社区网站(Ansible Galaxy)上查找其他人共享的 Ansible 角色。例如,如果你要部署一个 Web 服务器,你可以搜索像 “nginx-ansible-role” 这样的角色。下载并使用这些角色可以极大地简化你的 Ansible 配置过程。

      • 你也可以参与社区讨论,在社区论坛或者 Ansible 官方的 GitHub 仓库(https://github.com/ansible/ansible)中提交问题或者功能请求。如果你是开发者,还可以贡献自己编写的 Ansible 模块或角色,帮助完善 Ansible 的功能。

  • ansible-config

    • 含义:

      • ansible-config命令用于查看和管理 Ansible 的配置。Ansible 的配置文件控制着 Ansible 的行为,例如它会指定 Inventory 文件(用于定义主机列表和主机组)的位置、连接类型(SSH 等)、模块搜索路径等诸多设置。

    • 用法:

      • 查看配置选项:

        • 运行ansible-config view可以查看 Ansible 的当前配置。它会显示配置文件中的所有设置,包括默认设置和用户自定义设置。例如,它会显示inventory选项的值,该值指向 Ansible 用于确定受管主机的文件或脚本路径。

      • 列出配置文件搜索路径:

        • 使用ansible-config list命令可以列出 Ansible 在启动时查找配置文件的路径顺序。Ansible 会按照一定的顺序查找配置文件,通常会先查找当前目录下的ansible.cfg,然后是用户主目录下的~/.ansible.cfg,最后是系统默认的配置文件路径(如/etc/ansible/ansible.cfg)。这有助于你了解 Ansible 从哪里读取配置信息。

      • 检查配置文件中的特定选项:

        • 可以使用ansible-config dump-- only-changed命令来只显示用户修改过的配置选项。这在你有一个复杂的 Ansible 配置环境,并且只想查看与默认设置不同的部分时非常有用。例如,如果你在ansible.cfg文件中修改了remote_user选项,运行此命令就会只显示remote_user相关的配置内容。

  • ansible-inventory:

  • 含义

    1. ansible-inventory是 Ansible 的一个重要组件,用于管理 Ansible 的主机清单。主机清单定义了 Ansible 将要管理的目标主机,包括主机的 IP 地址、主机名、所属的组等信息。它就像是 Ansible 的 “目标地图”,告诉 Ansible 需要在哪些主机上执行任务。

 用法

  • 查看主机清单内容

    • 基本的查看命令是

以特定格式输出主机清单,YAML 格式对于人类阅读可能更友好一些。继续以上面的主机清单为例,YAML 格式输出如下

    • 检查主机是否在清单中

      • 可以使用ansible-inventory --host <hostname>命令来检查特定主机是否在主机清单中,并查看该主机的相关变量。例如,ansible-inventory --host web1.example.com会输出该主机所属的组以及其变量(如果有)。如果主机不在清单中,会显示相应的提示信息。

    • 使用动态主机清单脚本

      • Ansible 也支持动态主机清单。你可以编写一个脚本来动态生成主机清单内容,例如从一个数据库或者云服务提供商的 API 获取主机信息。假设你有一个名为dynamic_inventory.py的动态主机清单脚本,你可以通过ansible-inventory-- inventory <path_to_script>来使用它。这样,每次 Ansible 运行任务时,都会先执行这个脚本获取最新的主机清单信息。

较为常用的是/usr/bin/ansible和/usr/bin/ansible-playbook

ansible-doc命令
  • ansible-doc命令常用于获取模板块信息及其适用帮助,一般用法如下:

 ansible-doc -l    ##获取全部模块信息
ansible-doc -s MOD_NAME    #获取指定模块的使用帮助

ansible-doc的全部用法:

usage: ansible-doc [-h] [--version] [-v] [-M MODULE_PATH]
...
optional arguments:--metadata-dump       **For internal testing only** Dump json metadata forall plugins.--playbook-dir BASEDIRSince this tool does not use playbooks, use this as asubstitute playbook directory.This sets the relativepath for many features including roles/ group_vars/etc.--version             show program's version number, config file location,configured module search path, module location,executable location and exit-F, --list_files      Show plugin names and their source files withoutsummaries (implies --list)##-M,指定模块的路径-M MODULE_PATH, --module-path MODULE_PATHprepend colon-separated path(s) to module library (default=~/.ansible/plugins/modules:/usr/share/ansible/plugins/modules)
##-h,显示命令参数API文档-h, --help            show this help message and exit##输出为json格式-j, --json            Change output into json format.
##-l,列出可用模块-l, --list            List available plugins##-s,显示剧本指定模块的用法-s, --snippet         Show playbook snippet for specified plugin(s)
ansible命令
  • ansible命令的具体格式如下

ansible <host-pattern> <-f forks> [-m module_name] [-a args]

#使用ansible -h来查看帮助-a,MODULE_ARGS     #模块的参数,如果执行默认COMMAND的模块,即是命令参数,如:“date”,"pwd"。
-k,--ask-pass    #ask for SSH password。登录密码,提示输入SSH密码而不是假设基于密钥的验证
--ask-pass    #ask for SSH。su切换密码
-K,--ask-sudo-pass    #ask for sudo password。提示密码使用sudo,sudo表示提权操作
--ask-vault-pass    #ask for vault password。 假设我们设定了加密的密码,则用该选项进行访问
-B SECONDS    #后台超时时间
-C    #模拟运行环境并且进行预运行,可以进行查错测试
-c CONNECTION    #连接类型使用
-f FORKS    #并行任务数,默认为5
-i INVENTORY    #指定主机清单的路径,默认为/etc/ansible/hosts
--list-hosts    #查看有哪些主机组
-m MODULE_NAME #执行模块的名字,默认使用command模块,所以如果只执行单一命令可以不用 -m 参数
-o    #压缩输出,尝试讲所有结果在一行输出,一般针对收集工具使用
-S    #用su命令
-R SU_USER #指定su的用户,默认为root用户
-s    #用sudo的命令
-U SUDO_USERSUDO    #指定sudo到哪个用户,默认为root用户
-T TIMEOUT    #指定ssh默认超时时间,默认为10s,也可以在配置文件中修改
-u REMOTE_USER #远程用户,默认为root用户
-v    #查看详细信息,同时支持 -vvv,-vvvv可以查看更加详细的信息
ansible配置公私钥

上面已经提到ansible是基于ssh协议实现管理主机的,所以ansible配置公私钥的方式与ssh协议的方式相同,具体操作步骤如下:

1.生产私钥
ssh-keygen
2.向被管理主机分发私钥
ssh-copy-id root@192.168.71.193
ssh-copy-id root@192.168.71.195

六.部署ansible管理集群

实验环境

主机名IP地址安装包
ansible192.168.71.196/24epel-release、ansible
node1192.168.71.195/24-
node2192.168.71.193/24

实验步骤

添加主机清单

vim /etc/ansible/hosts

配置公私钥(三下回车)

将密钥拷贝过去

 

七.Ansible常用模块

主机连通性测试

使用下列命令对主机清单中的资源进行连通性测试,出现下列信息说明主机处于连通状态

command模块

command模块可以直接在远程主机上执行命令,并且结果返回打印出来

命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行,它不会通过shell进行处理,比如$HOME和操作如“<”,">","| ", " ; " ," & " (需要使用 shell模块实现这些功能)。注意,command模块不支持 |  管道命令。

下面是command模块常用的几个命令:

  • chdir:在执行命令之前,先切换到该目录

  • execurable:切换shell来执行命令,需要使用命令的绝对路径

  • free_form:要执行的Linux指令,一般使用Ansible的-a参数代替

  • creates:一个文件名,当这个文件存在,则该命令不执行,可以用来做判断

  • removes:一个文件名,这个文件不存在,则该命令不执行

shell模块

  • shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等

  • 只要是shell命令都可以在通过这个模块在远程主机里面运行

由于command不支持 管道符,所以它只会支持cat /etc/passwd命令         

copy模块

  • 这个模块用于将文件复制到远程主机上,同时支持给定的内容生成文件和修改权限等

  • copy模块的相关选项如下:

    • src:被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径。如果路径是一个目录,则会递归复制,用法类似于“rsync”。

    • content:用于替换“src”,可以直接指定文件的值。

    • dest:必选项,将源文件复制到远程主机的绝对路径

    • backup:当文件内容发生改变之后,在覆盖之前,把源文件备份,备份文件包含时间信息

    • directory_mode:递归设定目录的权限,默认为系统默认权限。

    • force:当目标主机包含该文件,但是内容不同时,设定为“yes”,表示强制覆盖;设定为“no”表示目标主机的目标位置不存在该文件才复制。默认为“yes”

    • others:所有的file模块中的选项可以在这里使用

    • mode:设置文件权限

给定内容生成文件,并且制定权限

我们在两台主机上查看文件以及权限 

备份源文件,并且覆盖源文件

创建新的内容覆盖原文件,并且备份

查看被控主机的文件状态 

file模块

  • file模块主要用于设置文件的属性,比如创建文件、创建连接文件、删除文件等,如下为常见的命令:

    • force:需要两种情况下强制创建软连接,一种是源文件不存在,但是之后会建立的情况下;另外一种是目标软链接已存在,需要取消之前的软链接,然后创建新的,有两个选项:yes|no。

    • path:指定创建路径

  • group:定义文件/目录的属组。后面可以加上mode:定义文件/目录的权限。

  • owner:定义文件/目录的属主,后面必须加上path:定义文件/目录的路径。

  • recurse:递归设置文件的属性,只对目录有效,后面跟上src:被链接的源文件路径,只应用于state=link的情况

  • dest:被链接到的路径,只应用于state=link的情况

  • mode:指定权限。

  • state:状态,有如下选项:

    • directory:如果目录不存在,就创建目录

    • file:即使文件不存在,也不会被创建;已经存在的文件可以修改文件的属性。

    • link:创建软链接

    • hard:创建硬链接

    • touch:如果文件不存在,则会创建一个新的文件,如果文件或者目录已经存在,则更新其最后修改时间

    • absent:删除目录、文件或者取消链接文件

创建链接文件,实例如下:

删除文件如下所示:

fetch模块

  • fetch模块用于从远程某个主机获取(复制)文件到本地来

    • dest:用来存储文件的目录。

    • src:在远程拉取的文件,并且是一个file,不能是目录

cron模块

  • cron模块用于管理crontab计划性任务的,它的语法和crontab中的语法一致

    • day= :日应该运行的工作( 1-31, *, */2, )

    • hour= :小时 ( 0-23, *, */2, )

    • minute= :分钟( 0-59, *, */2, )

    • month= :月( 1-12, *, /2, )

    • weekday= : 周 ( 0-6 for Sunday-Saturday,, )

    • job= :指明运行的命令是什么

    • name= :定时任务描述

    • reboot :任务在重启时运行,不建议使用,建议使用special_time

    • special_time :特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)

    • state :指定状态

      • present表示添加定时任务,也是默认设置,

      • absent表示删除定时任务

    • user :以哪个用户的身份执行

  • 添加计划性任务如下,实例如下:

删除计划性任务,比如我们计划任务添加错误,则可以执行以下命令删除计划任务

yum模块

  • yum模块主要用于软件的安装,它的选项如下

    • name=  :所安装的软件包的名称

  • state=  :

    • present--》安装

    • latest--》安装最新的

    • absent--》卸载软件

  • update_cache :强制更新yum的缓存

  • conf_file  :指定远程yum安装时所依赖的配置文件(安装本地已有的包)。

  • disable_pgp_check  :是否禁止GPG checking,只用于present 或者 latest。

  • disablerepo  :临时禁止使用yum库。只用于安装或者更新时。

  • enablerepo  :临时使用的yum库。只用于安装或者更新时。

service模块

  • service模块用于服务程序的管理,它的主要选项如下:

    • arguments:命令行提供额外的参数

  • enabled:设置开机自启;true | false

  • name:服务名称

  • runlevel:开机启动的级别,一般不用指定。

  • sleep:在重启服务的过程中,是否等待。如在服务关闭以后等待2秒在启动。(定义在剧本当中)

  • state:有四种状态分别为

    • started(启动服务)

    • stopped(停止服务)

    • restarted(重启服务)

    • reloaded(重载服务)

开启httpd服务并且设置开启自启

httpd服务必须自行安装httpd软件包

检查80端口有没有开启

开启httpd服务并且设置开机自启

详细过程 

[root@ansible 192.168.71.193]# ansible webs -m service -a 'name=httpd state=started enabled=true'
192.168.71.193 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"enabled": true,"name": "httpd","state": "started","status": {"AccessSELinuxContext": "system_u:object_r:httpd_unit_file_t:s0","ActiveEnterTimestampMonotonic": "0","ActiveExitTimestampMonotonic": "0","ActiveState": "inactive","After": "network.target httpd-init.service system.slice systemd-tmpfiles-setup.service sysinit.target tmp.mount remote-fs.target basic.target nss-lookup.target systemd-journald.socket -.mount","AllowIsolate": "no","AssertResult": "no","AssertTimestampMonotonic": "0","Before": "shutdown.target","BlockIOAccounting": "no","BlockIOWeight": "[not set]","CPUAccounting": "yes","CPUAffinityFromNUMA": "no","CPUQuotaPerSecUSec": "infinity","CPUQuotaPeriodUSec": "infinity","CPUSchedulingPolicy": "0","CPUSchedulingPriority": "0","CPUSchedulingResetOnFork": "no","CPUShares": "[not set]","CPUUsageNSec": "[not set]","CPUWeight": "[not set]","CacheDirectoryMode": "0755","CanFreeze": "yes","CanIsolate": "no","CanReload": "yes","CanStart": "yes","CanStop": "yes","CapabilityBoundingSet": "cap_chown cap_dac_override cap_dac_read_search cap_fowner cap_fsetid cap_kill cap_setgid cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock cap_ipc_owner cap_sys_module cap_sys_rawio cap_sys_chroot cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config cap_mknod cap_lease cap_audit_write cap_audit_control cap_setfcap cap_mac_override cap_mac_admin cap_syslog cap_wake_alarm cap_block_suspend cap_audit_read cap_perfmon cap_bpf cap_checkpoint_restore","CleanResult": "success","CollectMode": "inactive","ConditionResult": "no","ConditionTimestampMonotonic": "0","ConfigurationDirectoryMode": "0755","Conflicts": "shutdown.target","ControlGroupId": "0","ControlPID": "0","CoredumpFilter": "0x33","DefaultDependencies": "yes","DefaultMemoryLow": "0","DefaultMemoryMin": "0","Delegate": "no","Description": "The Apache HTTP Server","DevicePolicy": "auto","Documentation": "\"man:httpd.service(8)\"","DropInPaths": "/usr/lib/systemd/system/httpd.service.d/php-fpm.conf","DynamicUser": "no","Environment": "LANG=C","ExecMainCode": "0","ExecMainExitTimestampMonotonic": "0","ExecMainPID": "0","ExecMainStartTimestampMonotonic": "0","ExecMainStatus": "0","ExecReload": "{ path=/usr/sbin/httpd ; argv[]=/usr/sbin/httpd $OPTIONS -k graceful ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }","ExecReloadEx": "{ path=/usr/sbin/httpd ; argv[]=/usr/sbin/httpd $OPTIONS -k graceful ; flags= ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }","ExecStart": "{ path=/usr/sbin/httpd ; argv[]=/usr/sbin/httpd $OPTIONS -DFOREGROUND ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }","ExecStartEx": "{ path=/usr/sbin/httpd ; argv[]=/usr/sbin/httpd $OPTIONS -DFOREGROUND ; flags= ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }","ExitType": "main","FailureAction": "none","FileDescriptorStoreMax": "0","FinalKillSignal": "9","FragmentPath": "/usr/lib/systemd/system/httpd.service","FreezerState": "running","GID": "[not set]","GuessMainPID": "yes","IOAccounting": "no","IOReadBytes": "18446744073709551615","IOReadOperations": "18446744073709551615","IOSchedulingClass": "2","IOSchedulingPriority": "4","IOWeight": "[not set]","IOWriteBytes": "18446744073709551615","IOWriteOperations": "18446744073709551615","IPAccounting": "no","IPEgressBytes": "[no data]","IPEgressPackets": "[no data]","IPIngressBytes": "[no data]","IPIngressPackets": "[no data]","Id": "httpd.service","IgnoreOnIsolate": "no","IgnoreSIGPIPE": "yes","InactiveEnterTimestampMonotonic": "0","InactiveExitTimestampMonotonic": "0","JobRunningTimeoutUSec": "infinity","JobTimeoutAction": "none","JobTimeoutUSec": "infinity","KeyringMode": "private","KillMode": "mixed","KillSignal": "28","LimitAS": "infinity","LimitASSoft": "infinity","LimitCORE": "infinity","LimitCORESoft": "0","LimitCPU": "infinity","LimitCPUSoft": "infinity","LimitDATA": "infinity","LimitDATASoft": "infinity","LimitFSIZE": "infinity","LimitFSIZESoft": "infinity","LimitLOCKS": "infinity","LimitLOCKSSoft": "infinity","LimitMEMLOCK": "8388608","LimitMEMLOCKSoft": "8388608","LimitMSGQUEUE": "819200","LimitMSGQUEUESoft": "819200","LimitNICE": "0","LimitNICESoft": "0","LimitNOFILE": "524288","LimitNOFILESoft": "1024","LimitNPROC": "14261","LimitNPROCSoft": "14261","LimitRSS": "infinity","LimitRSSSoft": "infinity","LimitRTPRIO": "0","LimitRTPRIOSoft": "0","LimitRTTIME": "infinity","LimitRTTIMESoft": "infinity","LimitSIGPENDING": "14261","LimitSIGPENDINGSoft": "14261","LimitSTACK": "infinity","LimitSTACKSoft": "8388608","LoadState": "loaded","LockPersonality": "no","LogLevelMax": "-1","LogRateLimitBurst": "0","LogRateLimitIntervalUSec": "0","LogsDirectoryMode": "0755","MainPID": "0","ManagedOOMMemoryPressure": "auto","ManagedOOMMemoryPressureLimit": "0","ManagedOOMPreference": "none","ManagedOOMSwap": "auto","MemoryAccounting": "yes","MemoryAvailable": "infinity","MemoryCurrent": "[not set]","MemoryDenyWriteExecute": "no","MemoryHigh": "infinity","MemoryLimit": "infinity","MemoryLow": "0","MemoryMax": "infinity","MemoryMin": "0","MemorySwapMax": "infinity","MountAPIVFS": "no","NFileDescriptorStore": "0","NRestarts": "0","NUMAPolicy": "n/a","Names": "httpd.service","NeedDaemonReload": "no","Nice": "0","NoNewPrivileges": "no","NonBlocking": "no","NotifyAccess": "main","OOMPolicy": "continue","OOMScoreAdjust": "0","OnFailureJobMode": "replace","OnSuccessJobMode": "fail","Perpetual": "no","PrivateDevices": "no","PrivateIPC": "no","PrivateMounts": "no","PrivateNetwork": "no","PrivateTmp": "yes","PrivateUsers": "no","ProcSubset": "all","ProtectClock": "no","ProtectControlGroups": "no","ProtectHome": "no","ProtectHostname": "no","ProtectKernelLogs": "no","ProtectKernelModules": "no","ProtectKernelTunables": "no","ProtectProc": "default","ProtectSystem": "no","RefuseManualStart": "no","RefuseManualStop": "no","ReloadResult": "success","ReloadSignal": "1","RemainAfterExit": "no","RemoveIPC": "no","Requires": "-.mount system.slice sysinit.target","RequiresMountsFor": "/var/tmp","Restart": "no","RestartKillSignal": "28","RestartUSec": "100ms","RestrictNamespaces": "no","RestrictRealtime": "no","RestrictSUIDSGID": "no","Result": "success","RootDirectoryStartOnly": "no","RuntimeDirectoryMode": "0755","RuntimeDirectoryPreserve": "no","RuntimeMaxUSec": "infinity","RuntimeRandomizedExtraUSec": "0","SameProcessGroup": "no","SecureBits": "0","SendSIGHUP": "no","SendSIGKILL": "yes","Slice": "system.slice","StandardError": "inherit","StandardInput": "null","StandardOutput": "journal","StartLimitAction": "none","StartLimitBurst": "5","StartLimitIntervalUSec": "10s","StartupBlockIOWeight": "[not set]","StartupCPUShares": "[not set]","StartupCPUWeight": "[not set]","StartupIOWeight": "[not set]","StateChangeTimestampMonotonic": "0","StateDirectoryMode": "0755","StatusErrno": "0","StopWhenUnneeded": "no","SubState": "dead","SuccessAction": "none","SyslogFacility": "3","SyslogLevel": "6","SyslogLevelPrefix": "yes","SyslogPriority": "30","SystemCallErrorNumber": "2147483646","TTYReset": "no","TTYVHangup": "no","TTYVTDisallocate": "no","TasksAccounting": "yes","TasksCurrent": "[not set]","TasksMax": "22817","TimeoutAbortUSec": "1min 30s","TimeoutCleanUSec": "infinity","TimeoutStartFailureMode": "terminate","TimeoutStartUSec": "1min 30s","TimeoutStopFailureMode": "terminate","TimeoutStopUSec": "1min 30s","TimerSlackNSec": "50000","Transient": "no","Type": "notify","UID": "[not set]","UMask": "0022","UnitFilePreset": "disabled","UnitFileState": "disabled","UtmpMode": "init","Wants": "httpd-init.service php-fpm.service","WatchdogSignal": "6","WatchdogTimestampMonotonic": "0","WatchdogUSec": "infinity"}
}
192.168.71.195 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"enabled": true,"name": "httpd","state": "started","status": {"AccessSELinuxContext": "system_u:object_r:httpd_unit_file_t:s0","ActiveEnterTimestampMonotonic": "0","ActiveExitTimestampMonotonic": "0","ActiveState": "inactive","After": "tmp.mount -.mount systemd-tmpfiles-setup.service nss-lookup.target httpd-init.service systemd-journald.socket basic.target system.slice remote-fs.target network.target sysinit.target","AllowIsolate": "no","AssertResult": "no","AssertTimestampMonotonic": "0","Before": "shutdown.target","BlockIOAccounting": "no","BlockIOWeight": "[not set]","CPUAccounting": "yes","CPUAffinityFromNUMA": "no","CPUQuotaPerSecUSec": "infinity","CPUQuotaPeriodUSec": "infinity","CPUSchedulingPolicy": "0","CPUSchedulingPriority": "0","CPUSchedulingResetOnFork": "no","CPUShares": "[not set]","CPUUsageNSec": "[not set]","CPUWeight": "[not set]","CacheDirectoryMode": "0755","CanFreeze": "yes","CanIsolate": "no","CanReload": "yes","CanStart": "yes","CanStop": "yes","CapabilityBoundingSet": "cap_chown cap_dac_override cap_dac_read_search cap_fowner cap_fsetid cap_kill cap_setgid cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock cap_ipc_owner cap_sys_module cap_sys_rawio cap_sys_chroot cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config cap_mknod cap_lease cap_audit_write cap_audit_control cap_setfcap cap_mac_override cap_mac_admin cap_syslog cap_wake_alarm cap_block_suspend cap_audit_read cap_perfmon cap_bpf cap_checkpoint_restore","CleanResult": "success","CollectMode": "inactive","ConditionResult": "no","ConditionTimestampMonotonic": "0","ConfigurationDirectoryMode": "0755","Conflicts": "shutdown.target","ControlGroupId": "0","ControlPID": "0","CoredumpFilter": "0x33","DefaultDependencies": "yes","DefaultMemoryLow": "0","DefaultMemoryMin": "0","Delegate": "no","Description": "The Apache HTTP Server","DevicePolicy": "auto","Documentation": "\"man:httpd.service(8)\"","DropInPaths": "/usr/lib/systemd/system/httpd.service.d/php-fpm.conf","DynamicUser": "no","Environment": "LANG=C","ExecMainCode": "0","ExecMainExitTimestampMonotonic": "0","ExecMainPID": "0","ExecMainStartTimestampMonotonic": "0","ExecMainStatus": "0","ExecReload": "{ path=/usr/sbin/httpd ; argv[]=/usr/sbin/httpd $OPTIONS -k graceful ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }","ExecReloadEx": "{ path=/usr/sbin/httpd ; argv[]=/usr/sbin/httpd $OPTIONS -k graceful ; flags= ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }","ExecStart": "{ path=/usr/sbin/httpd ; argv[]=/usr/sbin/httpd $OPTIONS -DFOREGROUND ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }","ExecStartEx": "{ path=/usr/sbin/httpd ; argv[]=/usr/sbin/httpd $OPTIONS -DFOREGROUND ; flags= ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }","ExitType": "main","FailureAction": "none","FileDescriptorStoreMax": "0","FinalKillSignal": "9","FragmentPath": "/usr/lib/systemd/system/httpd.service","FreezerState": "running","GID": "[not set]","GuessMainPID": "yes","IOAccounting": "no","IOReadBytes": "18446744073709551615","IOReadOperations": "18446744073709551615","IOSchedulingClass": "2","IOSchedulingPriority": "4","IOWeight": "[not set]","IOWriteBytes": "18446744073709551615","IOWriteOperations": "18446744073709551615","IPAccounting": "no","IPEgressBytes": "[no data]","IPEgressPackets": "[no data]","IPIngressBytes": "[no data]","IPIngressPackets": "[no data]","Id": "httpd.service","IgnoreOnIsolate": "no","IgnoreSIGPIPE": "yes","InactiveEnterTimestampMonotonic": "0","InactiveExitTimestampMonotonic": "0","JobRunningTimeoutUSec": "infinity","JobTimeoutAction": "none","JobTimeoutUSec": "infinity","KeyringMode": "private","KillMode": "mixed","KillSignal": "28","LimitAS": "infinity","LimitASSoft": "infinity","LimitCORE": "infinity","LimitCORESoft": "0","LimitCPU": "infinity","LimitCPUSoft": "infinity","LimitDATA": "infinity","LimitDATASoft": "infinity","LimitFSIZE": "infinity","LimitFSIZESoft": "infinity","LimitLOCKS": "infinity","LimitLOCKSSoft": "infinity","LimitMEMLOCK": "8388608","LimitMEMLOCKSoft": "8388608","LimitMSGQUEUE": "819200","LimitMSGQUEUESoft": "819200","LimitNICE": "0","LimitNICESoft": "0","LimitNOFILE": "524288","LimitNOFILESoft": "1024","LimitNPROC": "14260","LimitNPROCSoft": "14260","LimitRSS": "infinity","LimitRSSSoft": "infinity","LimitRTPRIO": "0","LimitRTPRIOSoft": "0","LimitRTTIME": "infinity","LimitRTTIMESoft": "infinity","LimitSIGPENDING": "14260","LimitSIGPENDINGSoft": "14260","LimitSTACK": "infinity","LimitSTACKSoft": "8388608","LoadState": "loaded","LockPersonality": "no","LogLevelMax": "-1","LogRateLimitBurst": "0","LogRateLimitIntervalUSec": "0","LogsDirectoryMode": "0755","MainPID": "0","ManagedOOMMemoryPressure": "auto","ManagedOOMMemoryPressureLimit": "0","ManagedOOMPreference": "none","ManagedOOMSwap": "auto","MemoryAccounting": "yes","MemoryAvailable": "infinity","MemoryCurrent": "[not set]","MemoryDenyWriteExecute": "no","MemoryHigh": "infinity","MemoryLimit": "infinity","MemoryLow": "0","MemoryMax": "infinity","MemoryMin": "0","MemorySwapMax": "infinity","MountAPIVFS": "no","NFileDescriptorStore": "0","NRestarts": "0","NUMAPolicy": "n/a","Names": "httpd.service","NeedDaemonReload": "no","Nice": "0","NoNewPrivileges": "no","NonBlocking": "no","NotifyAccess": "main","OOMPolicy": "continue","OOMScoreAdjust": "0","OnFailureJobMode": "replace","OnSuccessJobMode": "fail","Perpetual": "no","PrivateDevices": "no","PrivateIPC": "no","PrivateMounts": "no","PrivateNetwork": "no","PrivateTmp": "yes","PrivateUsers": "no","ProcSubset": "all","ProtectClock": "no","ProtectControlGroups": "no","ProtectHome": "no","ProtectHostname": "no","ProtectKernelLogs": "no","ProtectKernelModules": "no","ProtectKernelTunables": "no","ProtectProc": "default","ProtectSystem": "no","RefuseManualStart": "no","RefuseManualStop": "no","ReloadResult": "success","ReloadSignal": "1","RemainAfterExit": "no","RemoveIPC": "no","Requires": "sysinit.target system.slice -.mount","RequiresMountsFor": "/var/tmp","Restart": "no","RestartKillSignal": "28","RestartUSec": "100ms","RestrictNamespaces": "no","RestrictRealtime": "no","RestrictSUIDSGID": "no","Result": "success","RootDirectoryStartOnly": "no","RuntimeDirectoryMode": "0755","RuntimeDirectoryPreserve": "no","RuntimeMaxUSec": "infinity","RuntimeRandomizedExtraUSec": "0","SameProcessGroup": "no","SecureBits": "0","SendSIGHUP": "no","SendSIGKILL": "yes","Slice": "system.slice","StandardError": "inherit","StandardInput": "null","StandardOutput": "journal","StartLimitAction": "none","StartLimitBurst": "5","StartLimitIntervalUSec": "10s","StartupBlockIOWeight": "[not set]","StartupCPUShares": "[not set]","StartupCPUWeight": "[not set]","StartupIOWeight": "[not set]","StateChangeTimestampMonotonic": "0","StateDirectoryMode": "0755","StatusErrno": "0","StopWhenUnneeded": "no","SubState": "dead","SuccessAction": "none","SyslogFacility": "3","SyslogLevel": "6","SyslogLevelPrefix": "yes","SyslogPriority": "30","SystemCallErrorNumber": "2147483646","TTYReset": "no","TTYVHangup": "no","TTYVTDisallocate": "no","TasksAccounting": "yes","TasksCurrent": "[not set]","TasksMax": "22816","TimeoutAbortUSec": "1min 30s","TimeoutCleanUSec": "infinity","TimeoutStartFailureMode": "terminate","TimeoutStartUSec": "1min 30s","TimeoutStopFailureMode": "terminate","TimeoutStopUSec": "1min 30s","TimerSlackNSec": "50000","Transient": "no","Type": "notify","UID": "[not set]","UMask": "0022","UnitFilePreset": "disabled","UnitFileState": "disabled","UtmpMode": "init","Wants": "httpd-init.service php-fpm.service","WatchdogSignal": "6","WatchdogTimestampMonotonic": "0","WatchdogUSec": "infinity"}
}

通过service模块关闭httpd服务

user模块

  • user模块主要用来管理用户账号,它的主要选项如下所示:

    • comment :用户的描述信息

  • createhome:是否创建家目录

  • force:在使用state=absent时,行为于userdel --force一致

  • group:指定基本组

  • groups:指定附加组

  • home:指定用户家目录

  • move_home:如果设置为home=时,试图将用户主目录移动到指定的目录

  • name:指定用户名

  • non_unique:该选项允许改变非唯一的用户ID值

  • password:指定用户密码,使用密文密码

  • remove:在使用state=absent时,行为是与userdel --remove一致

  • shell:指定默认的shell

  • state:设置账号状态,不指定为默认创建,指定值为absent表示删除

  • system:当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有的用户

  • uid:指定用户的uid

添加用户并且指定用户的uid和密码

删除用户

group模块

  • group模块主要用于添加或者删除组,常用选项如下所示:

    • gid= 设置组的GID号

  • name= 指定组的名称

  • state= 指定组的状态,默认为创建,设置值为absent为删除

  • system= 设置值为yes,表示创建为系统组

创建组

查看已经创建的组

删除组

script模块

  • script模块用于将本机的脚本在被管理端的机器上运行。该模块直接指定脚本的路径即可

  • 现在本机写一个脚本文件

运行这个脚本于被管理端

setup模块

  • setup模块主要用于收集信息,是通过调用facts组件来实现的,facts组件时Ansible用于采集被管理机器设备信息的一个功能。我们可以使用setup模块查看机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据文件中,ansible_facts是最上层的值。

  • facts就是变量,内建变量。每个主机的各种信息,cpu个数,内存的大小等。会存在facts中的某个变量中,调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。比如redhat系列用yum安装,而debian系列用apt安装软件

  • 查看信息实例,查看被管理主机的内存

setup模块还有一个很好的功能就是保存我们筛选出来的信息到我们的主机上,同时,文件名是被管理主机的IP地址,方便检测那台主机出现问题。

八.总结

本节内容介绍了有关ansible的最基础的知识和命令的用法,为之后的深入使用做好铺垫。

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

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

相关文章

【6G新技术探索】AG-UI(Agent User Interaction Protocol) 协议介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

线性代数 下

文章目录十一、方程组解的结构和性质1、齐次线性方程组2、非齐次线性方程组十二、Ax0的基础解系十三、两个方程组的公共解十四、同解方程十五、求特征值、特征向量十六、判断A能否相似对角化十七、若A可以相似对角化&#xff0c;求P(Q)十八、二次型化标准型1、拉格朗日配方法2、…

Go语言实战案例-自定义队列结构

以下是《Go语言100个实战案例》中的 数据结构与算法篇 - 案例24&#xff1a;自定义队列结构 的完整内容&#xff0c;帮助初学者通过自定义结构体来实现队列的数据结构。&#x1f3af; 案例目标实现一个自定义的队列结构&#xff0c;并提供常见的队列操作&#xff1a;入队&#…

Windows-WSL-Docker端口开放

本文介绍如何在局域网内访问Windows服务器端口&#xff0c;特别是针对已安装WSL环境并在其中运行Docker服务的情况。主要解决Docker服务向局域网开放端口的配置问题步骤一&#xff1a;配置转发当你的应用程运行在WSL中时&#xff0c;需要执行此步骤。在宿主机&#xff08;windo…

面试知识梳理-vue3和vue2区别

vue3相对于vue2的优势 性能更好体积更小更好的ts支持&#xff08;vue3 ts开发&#xff09;更好的代码组织更好的逻辑抽离更多新功能&#xff08;vue2其实也都能自己做出来&#xff09; 更好的代码组织 Composition API 的革新 Vue 2 采用 ​​Options API​​&#xff0c;通过 …

栈的核心原理

1 栈的概念及结构栈是一种特殊的线性表&#xff0c;其特点是只允许在固定的一端进行插入和删除操作。进行操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的元素遵循后进先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09; 原则。压\入\进栈&#xff08;Push…

【无标题】暗物质暗能量——以下是用11维拓扑量子色动力学模型解释暗物质和暗能量的完整理论框架。

暗物质暗能量——以下是用11维拓扑量子色动力学模型解释暗物质和暗能量的完整理论框架。暗物质的拓扑本质 1. 跨桥零模振动理论 暗物质对应跨桥结构的基态振动模&#xff1a; math \phi_{\text{DM}} \frac{1}{\sqrt{6}} \sum_{f1}^6 \mathcal{B}_f^{(0)} $$ 其中 $\mathcal{B}…

【接口自动化】-1- 初识接口

一、什么是接口 接口涉及到四个实体&#xff1a;&#xff08;我去饭店点餐&#xff09; 我是客人 &#xff1a;客户端 厨师&#xff1a;服务器 服务员&#xff1a;接口 菜单&#xff1a;接口文档 接口定义了一套信息规则让两个系统之间互相不必知道对方的内部&#xff0c…

华为FTTR光猫V173 F30改公开版界面 附带真正的s161补全一体固件

【本文介绍】 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 这款FTTR的V173 F30看着颜值很高 也很实用 毕竟是XGPON万兆的光猫…

【学习】数字化车间与智能工厂如何推进制造业转型

在制造业转型升级的浪潮中&#xff0c;数字化车间与智能工厂已成为推动产业变革的核心引擎。前者通过物联网、大数据与自动化技术的深度融合&#xff0c;实现生产流程的精细化管控与资源优化&#xff1b;后者则依托人工智能、5G通信与数字孪生技术&#xff0c;构建起具备自感知…

HTML元素与高级功能完全教程:从基础到精通

目录 章节1:HTML的灵魂——元素的本质与结构化思维 1.1 元素的核心:标签、属性与内容 1.2 语义化的革命 1.3 常见的“坑”与避坑指南 章节2:表单元素:打造交互的基石 2.1 表单基础:与核心控件 2.2 高级输入类型与验证 2.3 表单的可访问性与用户体验 章节3:HTML5多媒…

IP证书:构建数字世界知识产权安全防线的基石

引言 在数字化浪潮席卷全球的今天&#xff0c;知识产权&#xff08;IP&#xff09;的保护已成为企业、机构乃至个人面临的重要挑战。无论是商业秘密、专利技术&#xff0c;还是数字版权&#xff0c;其安全性和可信度都直接影响着创新生态的健康发展。而作为数字安全的核心工具…

CAD插件『PDF转CAD格式』安装教程

在工程设计领域&#xff0c;常规流程是将完成的CAD图纸直接转换为PDF格式或输出为纸质蓝图进行分发。由于PDF文件具有跨平台兼容性强、防篡改等特性&#xff0c;在工程交付环节被广泛采用。但当需要对既有图纸进行二次修改时&#xff0c;PDF格式的编辑局限性便凸显出来&#xf…

【硬件-笔试面试题】硬件/电子工程师,笔试面试题-26,(知识点:硬件电路的调试方法:信号追踪,替换,分段调试)

目录 1、题目 2、解答 一、信号追踪法&#xff08;Signal Tracing&#xff09; 原理 操作步骤 应用场景 二、替换法&#xff08;Replacement Method&#xff09; 原理 操作要点 应用场景 三、分段调试法&#xff08;Segmented Debugging&#xff09; 原理 操作步骤…

Qt中QObject类的核心作用与使用

一、QObject类简介 各位小伙伴&#xff0c;在Qt的世界里&#xff0c;QObject类就像是"万物之母"&#xff0c;它是Qt对象模型的核心基类。几乎所有的Qt类都直接或间接地继承自QObject。QObject提供了很多重要的功能&#xff0c;比如对象树管理、信号与槽机制、元对象系…

TVBOXOS6.0双端APP二开源码完整版全开源源码重构版

今天介绍的TVBOXOS手机版App源码采用了纯64位的前端架构&#xff0c;版本则基于本站修正过的6.0前端进行构建。经过多次优化&#xff0c;这款应用不仅操作流畅&#xff0c;界面设计也颇具美感。前端完全集成了安卓原生Java架构&#xff0c;而后端管理采用的是PHP的如意系统。前…

VoWiFi技术深度解析:架构、流程与演进

在蜂窝网络覆盖盲区实现高清语音通话的秘密,就藏在这套基于IMS的Wi-Fi呼叫系统中 一、VoWiFi概述与技术价值 VoWiFi(Voice over Wi-Fi)是一种基于IMS核心网的语音通信技术,允许用户通过Wi-Fi接入运营商的EPC(演进分组核心网)和IMS系统,实现与传统蜂窝网络无缝集成的语音…

DuoPlus云手机再上新:统一配置品牌型号、代理分组与便捷搜索功能全面提升!

前言&#xff1a;在这个日新月异的时代&#xff0c;每一个微小的变化都可能引领行业新潮流&#xff0c;DuoPlus云手机基于不断创新的原则&#xff0c;把用户的需求放在第一位&#xff0c;不断对产品进行调整优化&#xff0c;致力于给用户最全面的产品体验。DuoPlus通过收集用户…

C/C++内存陷阱:为何返回局部变量地址是“定时炸弹”?

资料合集下载链接: ​https://pan.quark.cn/s/472bbdfcd014​ 在编程世界里,有些错误就像是隐藏在代码里的“定时炸弹”,平时可能相安无事,但在某个不经意的时刻就会引爆,导致程序崩溃或出现无法解释的诡异行为。今天,我们要拆解的,就是这样一个极具迷惑性又极其危险的…

编程与数学 03-001 计算机组成原理 21_服务器计算机组成实例解析

编程与数学 03-001 计算机组成原理 21_服务器计算机组成实例解析一、引言二、硬件架构特点&#xff08;一&#xff09;多核/多处理器设计&#xff08;二&#xff09;大容量高带宽内存&#xff08;三&#xff09;存储系统&#xff08;四&#xff09;高可用性设计三、性能优化技术…