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

运维Linux之Ansible详解学习(更新中)

什么是Ansible

Ansible 是一款新出现的自动化运维工具,基于 Python 开发。以下是对它的详细介绍:

  • 功能特点:集合了众多运维工具的优点,能实现批量系统配置、批量程序部署、批量运行命令等功能。它是基于模块工作的,本身没有批量部署能力,而是提供一种框架,真正具有批量部署能力的是其运行的模块。
  • 工作原理:通过 SSH 或 Windows 远程管理机制建立临时远程连接,控制节点在大多数安装了 Python 的类 Unix 系统上执行,包括安装了 WSL 的 Windows 系统。系统配置部分通过其自己的声明式语言定义。
  • 主要组件
    • 连接插件:负责和被监控端实现通信。
    • host inventory:指定操作的主机,是一个配置文件,里面定义了监控的主机。
    • 各种模块:包括核心模块、command 模块、自定义模块等。
    • 插件:借助于插件完成记录日志邮件等功能。
    • playbook:剧本,执行多个任务时可让节点一次性运行多个任务,非必需。
  • 设计目标:本质上为最小、一致性、安全和可靠的。如果小心撰写程序,Ansible playbook 脚本文件可以是幂等的,以防止对受控系统产生意外的副作用。Playbook 使用基于 YAML 和 Jinja 模板的简单叙述性语言,仅需要最少的学习。
  • 平台支持:控制机器必须是 Linux/Unix 主机,并且需要 Python 2.7 或 3.5。托管节点(如果是类 Unix)必须具有 Python 2.4 或更高版本。从 1.7 版本开始,Ansible 也可以管理 Windows 节点,使用 WS - Management 协议支持的本机 PowerShell 远程处理,而不是 SSH。Ansible 可以部署到裸机主机、虚拟机和云环境。
官网文档地址:

https://docs.ansible.com/ansible/latest/

配置文件


rpm -qc ansible-core
在没下载之前查询不到,q是query(查询),c是configfile(配置文件)/etc/ansible/ansible.cfg # 主配置文件
/etc/ansible/hosts # 主机清单文件

概念

主机清单

官方文档:

https://docs.ansible.com/ansible/latest/inventory_guide/intro_inventory.
html
主机清单(Inventory)是 Ansible 中用于管理目标主机的配置文件。它是一个文本文件,其
中列出了要在其上执行 Ansible 任务的远程主机。
主机清单可以包含 IP 地址、域名或主机别名等信息,并且可以将主机分组以便更好地组织和
管理。主要清单文件默认位于 /etc/ansible/hosts 文件中,但也可以使用 -i 参数指定其
他位置的清单文件。
例如,下面定义了一个清单文件示例:
[web-servers]
webserver1.example.com
webserver2.example.com
[database-servers]
dbserver1.example.com
dbserver2.example.com

连接插件

官方文档:

https://docs.ansible.com/ansible/latest/plugins/connection.html
连接插件(Connection Plugins)是 Ansible 中的组件,用建立与远程主机的连接。Ansible
支持多种连接插件,包括 SSH、WinRM 等。连接插件的选择取决于目标主机的操作系统和
配置。 通过连接插件,Ansible 可以与目标主机进行通信,并在其上执行任务。在主机清单中,可以通过在主机名后连接插件名称来指定连接插件。如果不指定,默认使用 SSH 连接插件。
以下是示例:
[web-servers]
webserver1.example.com ansible_connection=ssh
webserver2.example.com ansible_connection=ssh
[database-servers]
dbserver1.example.com ansible_connection=ssh
dbserver2.example.com ansible_connection=winrm

模块

模块(Modules)是 Ansible 的核心组件,用于在远程主机上执行任务。
Ansible 提供了丰富的内置模块,涵盖了各种任务,如文件操作、软件包管理、服务管理、用
户管理等。还能通过在剧本中调用模块,可以实现自动化任务的执行。
常用模块有:
ping:检测远程主机的连通性。
command/shel:在目标主机上执行命令或命令字符串。
copy:将文件从控制节点复制到远程主机。
file:创建、修改或删除文件和目录。
template:使用 jinja2 模板生成文件,并将其复制到远程主机。
apt/yum:在基于 Debian/RedHat 的系统上安装、升级或移除软件包。
service:启动、停止、重新启动或重载系统服务。
user/group:创建、修改或删除用户和用户组。
lineinfile:在文中添加、修改或删除一行文本。
raw:在目标主机上执行原始命令,绕过模块系统。
wait_for:等待一定时间或直到某个条件为真。
script:在在目标主机上执行本地脚本。
git:克隆或更新 Git 代码库。
debug:打印调试信息。

Playbook

Ansible Playbook(剧本)是 Ansible 的核心组件之一,是一种以 YAML 格式编写的自动化
任务描述文件。
每个 Playbook 由一个或多个 Play 组成。在每个 Play 下面,通过 tasks 关键字来定义一组
任务。每个任务由一个或多个模块组成,用于在远程主机上实现自动化部署、配置和管理等操
作。
下面示例演示了一个简单的Playbook:
- name: Install and start Nginx #描述 Playbook 或任务的简短名称
hosts: web_servers #指定要执行任务的目标主机或主机组
become: yes #可选参数,用于指定是否以管理员权限执行任务及执行任务的用户。
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
- name: Start Nginx service
service:
name: nginx
state: started
playbook基本格式及用法:
一、Playbook 基础结构

Playbook 由一个或多个 Play(剧本) 组成,每个 Play 定义了一组 主机 和 任务。基本框架如下:

 
---  # YAML 文件起始标记(必须存在)
- name: <Play 的名称>  # 描述性名称(建议明确任务目的,如 "Install Nginx")hosts: <主机或主机组>  # 目标主机(必填)gather_facts: <是否收集主机信息>  # 可选(默认值为 yes)become: <是否提权>  # 可选(默认值为 no)vars:  # 定义变量(可选)- var1: value1- var2: value2tasks:  # 任务列表(必填)- name: <任务名称>  # 描述性名称(建议明确操作,如 "Install nginx package")<模块名>:  # 模块名称(如 yum、apt、copy 等)<参数1>: value1  # 模块参数<参数2>: value2when: <条件判断>  # 条件执行(可选)tags: <标签>  # 标记任务(可选,用于选择性执行)register: <变量名>  # 注册任务结果到变量(可选)handlers:  # 处理程序(可选,用于响应 notify 事件)- name: <处理程序名称><模块名>:  # 通常用于重启服务等操作<参数>: valueroles:  # 引入角色(可选,用于模块化管理)- <角色名称>
二、关键组成部分详解

1. Play 级别参数

参数说明示例
namePlay 的描述性名称(建议清晰易懂,便于调试)name: "Configure Web Servers"
hosts目标主机或主机组(必填),支持清单中的组名、正则表达式或动态主机hosts: webservers
hosts: 'node[1:3]'
hosts: all:!db
gather_facts是否收集目标主机的系统信息(如 IP、内核版本等),值为 yes 或 nogather_facts: no (适用于无需系统信息的轻量级任务)
become是否提权(如切换为 root 用户),值为 yes 或 nobecome: yes
become_user: root (指定提权用户)
vars定义 Play 内的变量(优先级高于清单变量)vars: <br> - port: 8080 <br> - user: admin
remote_user指定连接远程主机的用户(默认取清单中的 ansible_userremote_user: ubuntu

2. tasks 任务列表

任务是 Playbook 的核心,每个任务调用一个 Ansible 模块完成具体操作。

 
  • 模块类型
    • 核心模块:如 ping(测试连通性)、yum/apt(包管理)、service(服务管理)、copy(文件复制)等。
    • 扩展模块:如 git(代码拉取)、mysql_user(数据库用户管理)等。
  • 关键参数
    参数说明示例
    name任务的描述性名称(必填,建议明确操作内容,如 "Create directory")name: "Create data directory"
    module模块名称(必填,如 fileshelltemplate 等)file: path=/data state=directory mode=0755
    when条件判断(可选,支持 Jinja2 表达式)when: ansible_os_family == 'Debian'
    tags标记任务(可选,用于通过 --tags 或 --skip-tags 选择性执行)tags: [install, web]
    register注册任务结果到变量(可选,用于后续任务引用)register: result <br> debug: var=result.stdout

3. handlers 处理程序

处理程序是被动触发的任务,通常用于重启服务、重载配置等操作,需配合 notify 触发。

 
tasks:- name: Update config filecopy: src=nginx.conf dest=/etc/nginx/nginx.confnotify: Restart Nginx  # 触发名为 "Restart Nginx" 的处理程序handlers:- name: Restart Nginx  # 处理程序名称需与 notify 一致service: name=nginx state=restarted

4. roles 角色

角色用于将 Playbook 拆分为模块化组件,提升复用性。

 
roles:- role: common  # 引用 roles/common 目录下的角色var1: value1  # 传递参数给角色- role: webserverport: 8080
三、Playbook 示例

以下是一个完整的 Playbook 示例,用于在 Debian 系统上安装 Nginx 并启动服务:

 
---
- name: Install and configure Nginxhosts: webserversgather_facts: yesbecome: yesvars:nginx_pkg: nginxnginx_port: 80tasks:- name: Ensure Nginx is installedapt:name: "{{ nginx_pkg }}"state: presentwhen: ansible_os_family == 'Debian'- name: Copy Nginx configcopy:src: nginx.conf.j2dest: /etc/nginx/nginx.confnotify: Reload Nginx- name: Ensure Nginx is runningservice:name: nginxstate: startedenabled: yeshandlers:- name: Reload Nginxservice:name: nginxstate: reloaded
四、最佳实践
  1. 命名规范
    • Play 和任务名称应清晰描述操作(如 Install Docker Engine 而非 Task 1)。
  2. 变量管理
    • 复杂变量可通过 vars_files 引入外部 YAML 文件,避免 Playbook 臃肿。
  3. 条件判断
    • 使用 when 区分不同系统或环境(如 ansible_distribution == 'CentOS')。
  4. 错误处理
    • 添加 ignore_errors: yes 忽略非关键错误,或 failed_when: condition 自定义失败条件。
  5. 测试与调试
    • 使用 --syntax-check 验证语法,-C(--check)模式试运行,-vvv 查看详细日志。
五、执行 Playbook
ansible-playbook -i inventory/hosts site.yml  # 标准执行
ansible-playbook -i inventory/hosts site.yml --tags="install"  # 仅执行标记为 install 的任务
ansible-playbook -i inventory/hosts site.yml --limit=webservers  # 仅对 webservers 组执行
 

通过以上结构和规范,可高效编写可维护、易扩展的自动化任务脚本。

安装

安装方法

Ansible 提供了多种安装方式,适应不同的操作系统和需求。以下是常见的安装方法:
1.通过包管理器安装
在 Ubuntu/Debian 上安装
[root@ansible-controller ~]# apt install ansible -y
在 CentOS/RHEL 上安装
[root@ansible-controller ~]# dnf install ansible -y
在 RockyLinux9上安装
[root@ansible-controller ~]# dnf install ansible-core -y
查看版本信息:
[root@ansible-controller ~]# ansible --version
2.通过pip安装
安装 Python 和 pip(如果尚未安装):
在 Ubuntu/Debian:
[root@ansible-controller ~]# apt install python3 python3-pip -y
在 CentOS/RHEL:
[root@ansible-controller ~]# sudo yum install python3 python3-pip -y
一般自带
[root@free ~]# python
Python 3.9.18 (main, Sep  7 2023, 00:00:00) 
[GCC 11.4.1 20230605 (Red Hat 11.4.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> >>> exit
Use exit() or Ctrl-D (i.e. EOF) to exitquit()也行

使用pip安装:

[root@ansible-controller ~]# pip3 install ansible
3.阿里云镜像下载eple辅助安装

阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区阿里巴巴开源镜像站,免费提供Linux镜像下载服务,拥有Ubuntu、CentOS、Deepin、MongoDB、Apache、Maven、Composer等多种开源软件镜像源,此外还提供域名解析DNS、网络授时NTP等服务,致力于为互联网用户提供全面,高效和稳定的基础服务。https://developer.aliyun.com/mirror/eple中选择对应版本。

https://mirrors.aliyun.com/epel/epel-release-latest-9.noarch.rpmhttps://mirrors.aliyun.com/epel/epel-release-latest-9.noarch.rpm

1. 什么是 EPEL?
全称:Extra Packages for Enterprise Linux(企业 Linux 额外软件包)
作用:由 Fedora 社区维护的第三方开源软件仓库,为 RHEL、CentOS、Rocky Linux 等系统提供大量 非官方默认源 的软件包(如开发工具、系统工具、库文件等)。
优势:补充官方源中缺失的软件,版本更新相对及时,方便用户快速安装常用工具。
2. epel-release 软件包的作用
功能:这个软件包是 EPEL 源的 安装器和配置文件,用于自动配置系统的软件源信息(如 /etc/yum.repos.d/epel.repo 或 /etc/dnf.repos.d/epel.repo)。
安装后效果:
启用 EPEL 源,允许使用 yum 或 dnf 命令直接安装 EPEL 中的软件包。
包含 GPG 密钥,确保软件包的完整性和安全性。验证 EPEL 源是否启用
# 列出所有已启用的源
dnf repolist enabled# 输出应包含类似内容:
# epel                Extra Packages for Enterprise Linux 9 - x86_64
三、使用 EPEL 源安装软件包
安装方式与官方源完全相同,直接使用 dnf 或 yum 命令:
# 示例:安装 htop(系统监控工具,官方源可能没有)
dnf install htop -y# 示例:安装 ansible(自动化运维工具)
dnf install ansible -y# 搜索 EPEL 源中的软件包
dnf search <关键词>
四、EPEL 源的配置与管理
1. 临时禁用 / 启用 EPEL 源
# 禁用 EPEL 源(本次命令生效)
dnf --disablerepo=epel install <软件包># 仅从 EPEL 源安装(忽略其他源)
dnf --enablerepo=epel install <软件包>
2. 永久禁用 EPEL 源
编辑配置文件,将 enabled=1 改为 enabled=0:
vi /etc/yum.repos.d/epel.repo# 修改为:
[epel]
name=Extra Packages for Enterprise Linux 9 - $basearch
#baseurl=https://download.fedoraproject.org/pub/epel/9/$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-9&arch=$basearch
enabled=0  # 禁用 EPEL 源
gpgcheck=1
...

免密配置

这个是之前的内容(ssh服务)

准备主机

控制节点是运行 Ansible 的主机 ,负责发送任务并收集结果。 被控节点是被 Ansible 管理的
主机,无需安装任何额外软件 ,仅需确保 SSH 服务正常运行,并具备必要的访问权限。

生成密钥对

[root@ansible-controller ~]# ssh-keygen -t rsa (三次回车,不输入其他信息)
复制本机公钥到其它被控节点
# 执行命令后,输入正确密码即可
ssh-copy-id root@192.168.72.64
ssh-copy-id root@192.168.72.65
配置好后测试连接:
# 如果免密做成功则无需密码即可登录
ssh root@192.168.72.64
ssh root@192.168.72.65

注意

ssh-copy-id 命令格式有两种:
1. ssh-copy-id 远端用户@远端IP 或 仅IP
2. ssh-copy-id -i /root/.ssh/id_rsa.pub 远端用户@远端IP 或 仅IP
3. 如果在生成密钥时指定了密钥的名称,此处需要通过 ssh-copy-id -i 指定的名称 远程
用户@远端IP 或仅IP
远程登录无需密码就成功了

主机清单

官方文档

https://docs.ansible.com/ansible/latest/inventory_guide/intro_inventory.
html
清单(Inventory)定义 Ansible 将要管理的一批主机。 这些主机也可以分配到组中,以进
行集中管理。组可以包含子组,主机也可以是多个组的成员。清单还可以设置应用到它所定义
的主机和组的变量。
可以通过静态和动态两种方式定义主机清单。这里主要讲解静态的主机清单,静态主机清单是
一个文本文件。

基本语法

[组名] :定义一组主机。
主机名 :每行定义一个主机,主机可以是 IP 或域名。
变量 :可以通过 key=value 的形式为主机或组添加变量。

清单内容可写位置

1. 默认全局清单文件

可以直接写在 Ansible 默认的全局清单文件 /etc/ansible/hosts 里 ,使用时直接执行 Ansible 命令,无需额外指定清单文件路径。不过要注意,直接修改该文件可能影响全局配置,操作前最好备份。

2. 自定义清单文件

后缀名:ini,yaml,yml

创建一个新的文本文件,比如 my_inventory.ini ,将清单内容写入其中。后续使用 Ansible 命令时,通过 -i 参数指定这个文件路径,例如 ansible -i my_inventory.ini server -m ping 。这种方式适合不同项目或环境分开管理清单,方便维护。

3. 清单目录(高级用法)

如果有多个环境(开发、测试、生产等)或更复杂的清单管理需求,可以创建一个清单目录,比如 my_inventory_dir ,在目录内创建不同环境的子目录(如 devprod ) ,把清单文件放在对应的子目录中,使用时指定目录路径,如 ansible -i my_inventory_dir/dev server -m ping 。

配置示例

基本清单
[server]
192.168.72.64
192.168.72.65
[db]
db1.example.com
db2.example.com如果ip是连续的,还可以简写
[server]
192.168.72.[64:65]
[db]
db1.example.com
db2.example.com1. 分组定义
[server] 和 [db] 是两个主机组(Group),用于将功能相似的主机归类。
组名可以自定义,通常根据主机角色(如 web、db)或环境(如 dev、prod)命名。
2. 主机列表
[server] 组:包含两个 IP 地址的主机:
192.168.72.64
192.168.72.65[db] 组:包含两个域名的主机:
db1.example.com
db2.example.com二、Ansible 如何使用这个清单?
当执行 Ansible 命令时,可以通过组名选择目标主机:
# 对 [server] 组中的所有主机执行 ping 模块
ansible server -m ping# 对 [db] 组中的所有主机执行 shell 命令
ansible db -a "df -h"

测试:

[root@ansiblecontroller ~]# ansible -i my_inventory.yml server  -m ping
192.168.153.137 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"
}
192.168.153.136 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"
}
这里使用的是135,136,137的主机-i 指定路径server  根据清单指定主机组   也可以是具体ip,域名
特殊标识符:
all 或 *:表示清单中的所有主机。
多组组合:如 server:db(同时选择 server 和 db 组)。-m  指定模块其他常用参数(可选)
1. -u username
指定 SSH 连接的用户名。
bash
-u root  # 以 root 用户连接2. -k
提示输入 SSH 密码(适用于密码认证,非密钥认证)。
bash
-k  # 执行后会提示输入密码3. -K
提示输入 sudo 密码(用于需要管理员权限的操作)。
bash
-K  # 执行后会提示输入 sudo 密码4. -vvv
开启详细模式(-v 越多,输出越详细),用于调试。
bash
-vvv  # 显示 SSH 连接过程、模块执行细节等5. -a "参数"
传递模块的参数(仅对部分模块需要)。
bash
-m command -a "ls -l"  # 执行 ls -l 命令
-m copy -a "src=file.txt dest=/tmp/"  # 复制文件
主机级变量
[server]
192.168.72.64 ansible_user=root ansible_port=22
192.168.72.65 ansible_user=root
[db]
db1.example.com ansible_host=192.168.72.100
db2.example.com ansible_host=192.168.72.101 ansible_user=postgres

配置好后测试同上

优先级:

如果同一参数在多个地方定义,优先级从高到低为:
命令行参数(如 -u root)。
清单文件中的主机变量(如 192.168.1.1 ansible_user=root)。
清单文件中的组变量(如 [web_servers:vars] ansible_user=deploy)。
ansible.cfg 中的全局配置。
为什么需要这些参数?
场景 1:多用户环境

假设你有:

  • 生产服务器:只能用 root 用户 SSH 登录。
  • 开发服务器:使用 devops 用户 + 密钥认证。
    清单可配置为:
 
[prod_servers]
192.168.1.1 ansible_user=root[dev_servers]
192.168.1.10 ansible_user=devops
场景 2:非标准 SSH 端口

某服务器为安全起见,将 SSH 端口改为 5000:

[secure_servers]
192.168.1.20 ansible_port=5000
场景 3:内网域名与 IP 映射

公司内网有域名 db-prod,但未配置 DNS,实际 IP 为 10.0.0.5

[databases]
db-prod ansible_host=10.0.0.5
主机变量示例:
主机变量是定义一个 host_vars 目录,然后在目录中定义 主机名 .yml ,在这个文件中定义
相关的变量。
示例:

inventory/            # 清单目录
├── hosts             # 主清单文件(INI 或 YAML 格式)
├── group_vars/       # 组变量目录
│   └── web.yml       # 名为 web 的组的变量文件
└── host_vars/        # 主机变量目录├── test1.yml     # 主机 test1 的变量文件└── test2.yml     # 主机 test2 的变量文件变量文件内容示例
1. inventory/hosts(主清单文件)
[web]                  # 定义名为 web 的主机组
test1 ansible_host=192.168.1.10
test2 ansible_host=192.168.1.112. inventory/host_vars/test1.yml(主机 test1 的变量)
http_port: 8080       # test1 的 HTTP 端口为 8080
app_env: development  # test1 的应用环境为开发环境3. inventory/group_vars/web.yml(web 组的公共变量)
http_port: 443        # web 组默认使用 443 端口
ssl_enabled: true     # 启用 SSL变量优先级与覆盖规则
Ansible 变量的优先级(从高到低):
命令行参数(如 -e "http_port=80")
主机变量(host_vars/test1.yml)
组变量(group_vars/web.yml)
角色默认变量(roles/<role>/defaults/main.yml)示例覆盖逻辑:
test1 的 http_port 为 8080(主机变量覆盖组变量)。
test2 的 http_port 为 443(继承组变量)。你可以验证什么?
当你执行命令 ansible web -m ping 时:
验证主机连通性:检查 test1 和 test2 是否可通过 SSH 访问。
验证变量加载:通过 debug 模块查看变量是否正确加载:
ansible web -m debug -a "var=http_port"输出应为:
yaml
test1 | SUCCESS => {"http_port": 8080
}
test2 | SUCCESS => {"http_port": 443
}
组级别变量
官方文档
https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_varia
bles.html
组变量使用 [ 组名 :vars] 定义:
[server]
192.168.72.64
192.168.72.65
[db]
db1.example.com
db2.example.com
[server:vars]
ansible_user=root
ansible_port=22
[db:vars]
ansible_user=postgres

配置好后可尝试用ping模块测试同上

示例:
组变量还可以在 hosts 中定义的组公共变量放到一个专门的文件中这个文件名是以组名定
义,而文件夹名称则为 group_vars。结构如下:
invertory
├─ hosts
├─ main.yml
├─ group_vars
│ └─ server.ymlmain.yml:
---
- name: test variablehosts: server  # 目标主机组(需与清单文件中的组名匹配)gather_facts: no  # 不收集主机信息(加快执行速度)tasks:- name: test varsdebug:msg: "ansible_port = {{ ansible_port }}, ansible_user = {{ ansible_user }}"hosts:
[server]
192.168.72.[136:137]server.yml:
ansible_port: 22
ansible_user: root
ansile_password: '123456'测试:
1.测试playbook
[root@ansiblecontroller ~]# ansible-playbook -i invetory/hosts.yml invetory/main.yml PLAY [test variable] *******************************************************************************************************************************TASK [test vars] ***********************************************************************************************************************************
ok: [192.168.153.136] => {"msg": "ansible_port = 22, ansible_user = root"
}
ok: [192.168.153.137] => {"msg": "ansible_port = 22, ansible_user = root"
}PLAY RECAP *****************************************************************************************************************************************
192.168.153.136            : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.153.137            : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
2.测试连通性
[root@ansiblecontroller ~]# ansible -i invetory/hosts.yml all -m ping
192.168.153.136 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"
}
192.168.153.137 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"
}main.yml
Playbook 分析
yaml
---
- name: test variablehosts: server  # 目标主机组(需与清单文件中的组名匹配)gather_facts: no  # 不收集主机信息(加快执行速度)tasks:- name: test varsdebug:msg: "ansible_port = {{ ansible_port }}, ansible_user = {{ ansible_user }}"这个 Playbook 的作用是:
针对 server 组的所有主机。
打印每个主机的 ansible_port 和 ansible_user 变量值。

相关文章:

运维Linux之Ansible详解学习(更新中)

什么是Ansible Ansible 是一款新出现的自动化运维工具&#xff0c;基于 Python 开发。以下是对它的详细介绍&#xff1a; 功能特点&#xff1a;集合了众多运维工具的优点&#xff0c;能实现批量系统配置、批量程序部署、批量运行命令等功能。它是基于模块工作的&#xff0c;本…...

深入浅出IIC协议 - 从总线原理到FPGA实战开发 -- 第三篇:Verilog实现I2C Master核

第三篇&#xff1a;Verilog实现I2C Master核 副标题 &#xff1a;从零构建工业级I2C控制器——代码逐行解析与仿真实战 1. 架构设计 1.1 模块分层设计 三层架构 &#xff1a; 层级功能描述关键信号PHY层物理信号驱动与采样sda_oe, scl_oe控制层协议状态机与数据流控制state…...

网络世界的“变色龙“:动态IP如何重构你的数据旅程?

在深秋的下午调试代码时&#xff0c;我偶然发现服务器日志中出现异常登录记录——IP地址显示为某个境外数据中心。更有趣的是&#xff0c;当我切换到公司VPN后&#xff0c;这个"可疑IP"竟自动消失在了防火墙监控列表中。这个瞬间让我意识到&#xff1a;现代网络架构中…...

进阶-自定义类型(结构体、位段、枚举、联合)

自定义类型&#xff1a;结构体&#xff0c;枚举&#xff0c;联合 结构体 结构体类型的声明 结构的自引用 结构体变量的定义和初始化 结构体内存对齐 结构体传参 结构体实现位段(位段的填充&可移植性) 枚举 枚举类型的定义 枚举的优点 枚举的使用 联合 联合类型的定义 联…...

5G 网络全场景注册方式深度解析:从信令交互到报文分析

摘要 本文全面梳理 5G 网络包含的初始注册、移动性注册更新、紧急注册、周期性注册更新、服务请求触发注册、切换触发注册、基于策略的注册更新等多种注册方式。详细阐述每种注册方式的触发条件、信令流程、关键报文结构,结合对比分析与实际案例,助力读者深入理解 5G 网络接…...

ARM笔记-嵌入式系统基础

第一章 嵌入式系统基础 1.1嵌入式系统简介 1.1.1嵌入式系统定义 嵌入式系统定义&#xff1a; 嵌入式系统是以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软硬件可剪裁&#xff0c;对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统 ------Any devic…...

一文讲透golang channel 的特点、原理及使用场景

在 Go 语言中&#xff0c;通道&#xff08;Channel&#xff09; 是实现并发编程的核心机制之一&#xff0c;基于 CSP&#xff08;Communicating Sequential Processes&#xff09; 模型设计。它不仅用于协程&#xff08;Goroutine&#xff09;之间的数据传递&#xff0c;还通过…...

upload-labs通关笔记-第19关文件上传之条件竞争

系列目录 upload-labs通关笔记-第1关 文件上传之前端绕过&#xff08;3种渗透方法&#xff09; upload-labs通关笔记-第2关 文件上传之MIME绕过-CSDN博客 upload-labs通关笔记-第3关 文件上传之黑名单绕过-CSDN博客 upload-labs通关笔记-第4关 文件上传之.htacess绕过-CSDN…...

第5章:任务间通信机制(IPC)全解析

💬 在多线程开发中,线程之间如何协作?如何让一个线程产生数据,另一个线程消费数据?本章聚焦 Zephyr 提供的多种任务间通信机制(IPC)及实战使用技巧。 📚 本章导读 你将学到: Zephyr 提供的常用 IPC 接口:FIFO、消息队列、邮箱、信号量 每种机制适用场景和用法对比…...

CAPL自动化-诊断Demo工程

文章目录 前言一、诊断控制面板二、诊断定义三、发送诊断通过类.方法的方式req.SetParameterdiagSetParameter四、SendRequestAndWaitForResponse前言 本文将介绍CANoe的诊断自动化测试,工程可以从CANoe的 Sample Configruration 界面打开,也可以参考下面的路径中打开(以实…...

SVN被锁定解决svn is already locked

今天遇到一个问题&#xff0c;svn 在提交代码的时候出现了svn is already locked&#xff0c;解决方案...

【深度学习】1. 感知器,MLP, 梯度下降,激活函数,反向传播,链式法则

一、感知机 对于分类问题&#xff0c;我们设定一个映射&#xff0c;将x通过函数f(x)映射到y 1. 感知机的基本结构 感知机&#xff08;Perceptron&#xff09;是最早期的神经网络模型&#xff0c;由 Rosenblatt 在 1958 年提出&#xff0c;是现代神经网络和深度学习模型的雏形…...

云原生安全:网络协议TCP详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 &#xff08;注&#xff1a;文末附可视化流程图与专有名词说明表&#xff09; 1. 基础概念 TCP&#xff08;Transmission Control Protocol&#xff09;是…...

使用CentOS部署本地DeekSeek

一、查看服务器的操作系统版本 cat /etc/centos-release二、下载并安装ollama 1、ollama下载地址&#xff1a; Releases ollama/ollama GitHubGet up and running with Llama 3.3, DeepSeek-R1, Phi-4, Gemma 3, Mistral Small 3.1 and other large language models. - Re…...

Spring Boot与Eventuate Tram整合:构建可靠的事件驱动型分布式事务

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、引言 在现代微服务架构中&#xff0c;分布式事务管理一直是复杂系统中的核心挑战之一。传统的两阶段提交&#xff08;2PC&#xff09;方案存在性能瓶颈&…...

Python:从脚本语言到工业级应用的传奇进化

一、Python的诞生:一场喜剧与编程的奇妙相遇 1989年的冬天,荷兰程序员Guido van Rossum在阿姆斯特丹的CWI研究所里,用一段独特的代码开启了编程语言的新纪元。这个被命名为"Python"的项目,灵感并非源自冷血的蟒蛇,而是源于Guido对英国喜剧团体Monty Python的痴…...

【排序算法】典型排序算法 Java实现

以下是典型的排序算法分类及对应的 Java 实现&#xff0c;包含时间复杂度、稳定性说明和核心代码示例&#xff1a; 一、比较类排序&#xff08;通过元素比较&#xff09; 1. 交换排序 ① 冒泡排序 时间复杂度&#xff1a;O(n)&#xff08;优化后最优O(n)&#xff09; 稳定性&…...

node.js如何实现双 Token + Cookie 存储 + 无感刷新机制

node.js如何实现双 Token Cookie 存储 无感刷新机制 为什么要实施双token机制&#xff1f; 优点描述安全性Access Token 短期有效&#xff0c;降低泄露风险&#xff1b;Refresh Token 权限受限&#xff0c;仅用于获取新 Token用户体验用户无需频繁重新登录&#xff0c;Toke…...

[DS]使用 Python 库中自带的数据集来实现上述 50 个数据分析和数据可视化程序的示例代码

使用 Python 库中自带的数据集来实现上述 50 个数据分析和数据可视化程序的示例代码 摘要&#xff1a;由于 sample_data.csv 是一个占位符文件&#xff0c;用于代表任意数据集&#xff0c;我将使用 Python 库中自带的数据集来实现上述 50 个数据分析和数据可视化程序的示例代码…...

探索智能仓颉

探索智能仓颉&#xff1a;Cangjie Magic体验有感 一、引言 在人工智能和智能体开发领域&#xff0c;新的技术和框架不断涌现&#xff0c;推动着行业的快速发展。2025年3月&#xff0c;仓颉社区开源了Cangjie Magic&#xff0c;这是一个基于仓颉编程语言原生构建的LLM Agent开…...

Ubuntu 上开启 SSH 服务、禁用密码登录并仅允许密钥认证

1. 安装 OpenSSH 服务 如果尚未安装 SSH 服务&#xff0c;运行以下命令&#xff1a; sudo apt update sudo apt install openssh-server2. 启动 SSH 服务并设置开机自启 sudo systemctl start ssh sudo systemctl enable ssh3. 生成 SSH 密钥对&#xff08;本地机器&#xf…...

LLMs之Qwen:《Qwen3 Technical Report》翻译与解读

LLMs之Qwen&#xff1a;《Qwen3 Technical Report》翻译与解读 导读&#xff1a;Qwen3是Qwen系列最新的大型语言模型&#xff0c;它通过集成思考和非思考模式、引入思考调度机制、扩展多语言支持以及采用强到弱的知识等创新技术&#xff0c;在性能、效率和多语言能力方面都取得…...

springboot3 configuration

1 多数据库配置 github: https://github.com/baomidou/dynamic-datasource 使用DS()注解来切换数据库 详情介绍&#xff1a;https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611 注意&#xff1a;DS 可以注解在方法上或类上&#xff0c;同时存在就近原则 方法上注…...

从工程实践角度分析H.264与H.265的技术差异

作为音视频从业者&#xff0c;我们时刻关注着视频编解码技术的最新发展。RTMP推流、轻量级RTSP服务、RTMP播放、RTSP播放等模块是大牛直播SDK的核心功能&#xff0c;在这些模块的实现过程中&#xff0c;H.264和H.265两种视频编码格式的应用实践差异是我们技术团队不断深入思考的…...

如何设计一个高性能的短链设计

1.什么是短链 短链接&#xff08;Short URL&#xff09; 是通过算法将长 URL 压缩成简短字符串的技术方案。例如将 https://flowus.cn/veal/share/3306b991-e1e3-4c92-9105-95abf086ae4e 缩短为 https://sourl.cn/aY95qu&#xff0c;用户点击短链时会自动重定向到原始长链接。其…...

提升工作效率的可视化笔记应用程序

StickyNotes桌面便签软件介绍 StickyNotes是一款极为简洁的桌面便签应用程序&#xff0c;让您能够快速记录想法、待办事项或其他重要信息。这款工具操作极其直观&#xff0c;只需输入文字内容&#xff0c;选择合适的字体大小和颜色&#xff0c;然后点击添加按钮即可创建个性化…...

11|省下钱买显卡,如何利用开源模型节约成本?

不知道课程上到这里&#xff0c;你账户里免费的5美元的额度还剩下多少了&#xff1f;如果你尝试着完成我给的几个数据集里的思考题&#xff0c;相信这个额度应该是不太够用的。而ChatCompletion的接口&#xff0c;又需要传入大量的上下文信息&#xff0c;实际消耗的Token数量其…...

GDB调试工具详解

GDB调试工具详解 一、基本概念 调试信息 编译时需添加 -g 选项&#xff08;如 gcc -g -o program program.c&#xff09;&#xff0c;生成包含变量名、函数名、行号等调试信息的可执行文件。断点&#xff08;Breakpoint&#xff09; 程序执行到指定位置&#xff08;函数、行号…...

机器学习圣经PRML作者Bishop20年后新作中文版出版!

机器学习圣经PRML作者Bishop20年后新书《深度学习&#xff1a;基础与概念》出版。作者克里斯托弗M. 毕晓普&#xff08;Christopher M. Bishop&#xff09;微软公司技术研究员、微软研究 院 科学智 能 中 心&#xff08;Microsoft Research AI4Science&#xff09;负责人。剑桥…...

Armadillo C++ 线性代数库介绍与使用

文章目录 Armadillo C 线性代数库介绍与使用主要特点安装Linux (Ubuntu/Debian)macOS (使用 Homebrew)Windows (使用 vcpkg) 基本使用包含头文件矩阵创建与初始化基本运算矩阵分解统计运算保存和加载数据 性能优化建议示例程序与 MATLAB 语法对比 使用Armadillo函数库的稀疏矩阵…...