1. 变量

Ansible利用变量存储可重复使用的值,可以简化项目的创建和维护,减少错误数量。

1.1 变量名称

由字符串组成,必须以字母开头,并且只能含有字母、数字和下划线,和其它编程语言很类似。

1.2 常见变量

  • 要创建的用户
  • 要安装的软件包
  • 要重新启动的服务
  • 要删除的⽂件
  • 要从互联网检索的存档

1.3 定义变量

在不同位置定义变量具有不同的优先级,优先级规则是:越具体越优先,就近优先(离 task 越近,优先级越高)。

以下是一些常见定义位置的示例(优先级从低到高):

  • 在清单中定义的组变量
[webservers]            # 主机组
web1.example.com        # 主机1
web2.example.com        # 主机2[webservers:vars] # 组变量
nginx_port=8080
package_name=nginx
  • 在清单或 playbook 所在目录的 group_vars 子目录中定义的组变量
  • 在清单中定义的主机变量
# 清单定义的主机变量 http_port
[webservers]
web1.example.com http_port=80
web2.example.com http_port=8080
  • 在清单或 playbook 所在目录的 host_vars 子目录中定义的主机变量
  • 在运行时中发现的主机事实(由 setup 模块自动收集)
  • playbook 中的 play 变量 (vars 关键字和 vars_files 指令)
# var 关键字(内联定义)
---
- hosts: localhostvars:app_name: "my_application"app_port: 8080tasks:- debug:msg: "Deploying {{ app_name }} on port {{ app_port }}"# vars_files 指令 (从外部文件加载)
---
- hosts: localhostvars_files:- vars/settings.yml # 加载外部变量文件tasks:- debug:msg: "Deploying {{ app_name }} on port {{ app_port }}"# vars/settings.yml
---
app_name: "my_application"
app_port: 8080
  • 任务变量
  • 在命令行中定义的额外变量,使用 --extra-vars 或 -e 选项定义(优先级最高)
# 此处仅为示例 xxx.yaml 和 varname=var 需替换为真实的
ansible-navigator run xxx.yaml -e "varname=var"# 示例
# 单个变量
ansible-playbook deploy.yml -e "package_to_install=apache2"
# 列表
ansible-playbook deploy.yml -e '{"packages_to_remove": ["old_app1", "old_app2"]}'
# 变量文件(需创建一个临时变量文件 vars_file.yml)
ansible-playbook deploy.yml -e "@vars_file.yml"

建议选择全局唯一的变量名称。如果不同级别有相同名称的变量,优先级高的变量会覆盖优先级低的。

1.4 清单变量

分类:主机变量(用于特定主机),组变量,前者优先级高。

定义方法:
1)在清单文件中定义。

2)在与 playbook 相同的工作目录中创建 group_vars (存放组变量文件)和 host_vars (存放主机变量文件)两个目录。

推荐使用 group_vars 和 host_vars 目录来管理变量,而不是写在清单文件中。

示例的项目架构:

my_ansible_project/
├── inventory.ini
├── host_vars/
│   └── web1.example.com.yml
├── group_vars/
│   └── webservers.yml
└── site.yml

对应的项目文件:
文件 group_vars/webservers.yml 内容

---
# 适用于所有 webservers 组主机的变量
firewall_package: ufw
common_packages:- vim- git- htop

文件 host_vars/web1.example.com.yml 内容

---
# 仅适用于 web1.example.com 的特定变量
host_specific_setting: "This is only for web1"
nginx_sites_enabled:- host1.example.com- admin.example.com

1.5 使用字典定义变量

Ansible的模块也是采用的字典,有层级关系,更直观。以定义用户信息为例:

# 扁平化变量(难以管理)
# 注意变量名不要重复
user_alice_name: alice
user_alice_uid: 1234
user_alice_groups: developers
user_alice_home: /home/alice
user_bob_name: bob
user_bob_uid: 1235
user_bob_groups: bob
user_bob_home: /home/bob# 使用字典变量(推荐)
users:alice:name: aliceuid: 1234groups: developershome: /home/alicebob:name: bobuid: 1235groups: bobhome: /home/bob

使用方法

对于上一示例,想要访问 alice 的 uid可采用以下两种方式:

# 等价的
users.alice.uid
users['alice']['uid']        # Python语法

尽管两种都有效,但是建议Ansible项目的所有文件采用一致的一种语法。

1.6 变量使用

将变量名称放在双花括号 {{ 变量名称 }} 中,任务执行时,Ansible 会将其替换为对应的值。

注意:变量名称和双花括号之间有空格

强烈建议使用引号,如"{{ 变量名称 }}",防止 Ansible 当作YAML字典处理。

1.7 捕获命令输出

使用 register 关键字将一个任务的输出捕获到一个变量中。这个变量是一个复杂的字典,包含了命令执行的结果、标准输出、标准错误和返回码等。

- name: register_testhosts: localhosttasks:- name: check fileansible.builtin.command: ls /etc/hostnameregister: file_check

2. Vault

对于配置远程服务器需要访问的密码或 API 密钥等敏感数据,如果以纯文本形式存储在变量清单或其它 Ansible 文件中,安全风险极高。推荐使用随 Ansible 提供的 Ansible Vault ,它可以加密和解密任何由Ansible使用的结构化数据文件,通过 ansible-vault 命令行工具创建、编辑、加密、解密和查看文件。

可类比 K8s 的 ConfigMap(存放非机密信息)和 Secret(存放机密信息)。

Vault 使用 AES256 对称加密算法来保护文件,加密和解密都使用同一个密码(Vault密码)作为密钥。

2.1 使用方法

2.1.1 创建加密文件

默认使用编辑器 vi 打开文件

ansible-vault create filename.yml

2.1.2 查看加密文件

ansible-vault view filename.yml

2.1.3 编辑加密文件

ansible-vault edit filename.yml

2.1.4 加密现有文件

使用 --output=OUTPUT_FILE 选项,可将加密文件保存为新的名称。

ansible-vault encrypt filename.yml

2.1.5 解密现有文件

解密单个文件时,可使用 --output 选项以其他名称保存解密的文件。

ansible-vault decrypt filename.yml

2.1.6 更改加密文件密码

使用 ansible-vault rekey filename 命令更改加密文件的密码。执行后,它会先要求输入当前密码,然后提示输入新密码,也可以使用 --new-vault-password-file 选项直接指定包含新密码的文件。

ansible-vault rekey filename.ymlansible-vault rekey --new-vault-password-file=new_password.txt filename.yml

2.2 运行 Vault 加密的文件的 playbook

需要向 ansible-playbook 命令提供其加密密码,有以下三种方式:

1)交互方式,根据提示输入密码(需要禁用 artifact 工件,具体原因后期介绍工件时解释)

ansible-navigator run -m stdout \
--playbook-artifact-enable false filename.yml \
--vault-id @prompt

2)指定 Vault 密码文件(最安全)

密码必须在该文件中存储为一行字符串。

ansible-navigator run -m stdout filename.yml \
--vault-password-file=vault-pw-file

建议:设置密码文件的权限为 600,确保只有所有者可读;

           将密码文件存储在安全的位置,不要纳入版本控制系统。

3)使用 $ANSIBLE_VAULT_PASSWORD_FILE 环境变量

# 设置环境变量
export ANSIBLE_VAULT_PASSWORD_FILE=~/path/to/vault-password-file# 运行 playbook(无需额外指定密码文件参数)
ansible-navigator run -m stdout filename.yml

补充:可以通过 ansible-navigator 使用多个 Ansible Vault 密码,将多个 --vault id 或 --vault-password-file 选项传递给 ansible-navigator 命令。

3. Facts(事实)

Ansible 事实是 Ansible 从受管节点自动探查到的变量,由 ansible.builtin.setup 模块调取,其中包含的信息存储到可重复使用的变量中。

以下仅列举部分(使用 Python 语法表述字典),根据变量名称也可大致知道表述的内容。

事实描述变量
短主机名称ansible_facts['hostname']
完全限定的域名ansible_facts['fqdn']
主要 IPv4 地址(基于路由)ansible_facts['default_ipv4']['address']
所有网络接口的名称列表ansible_facts['interfaces']
特定网络接口的详细信息(eth0)ansible_facts['interfaces']['eth0']
网络接口的 IP 地址配置ansible_facts['interfaces']['eth0']['ipv4']['address']
磁盘分区的大小(/dev/vda1)ansible_facts['devices']['vda']['partitions']['vda1']['size']
DNS 服务器列表ansible_facts['dns']['nameservers']
当前运行的内核版本ansible_facts['kernel']
操作系统版本ansible_facts['distribution_version']
总内存大小(MB)ansible_facts['memtotal_mb']
可用内存大小(MB)ansible_facts['memfree_mb']
【提问】Linux 中使用什么命令查看磁盘的使用情况?

答:df命令

对于大型的集群系统,在执行play,task之前,需要先知道受管节点的配置情况(收集事实),软硬件环境和配置情况会通过变量引用成为代码的一部分。

3.1 查看事实

运行一个收集事实并使用ansible.builtin.debug 模块显示,以下示例会显示事实的全部内容。只需要特定信息时,只选择特定变量即可。

# fact_test.yml
---
- name: Fact dumphosts: all# gather_facts: true             # 默认为truetasks:- name: Print all factsansible.builtin.debug:var: ansible_facts 
# 运行该playbook
ansible-navigator run -m stdout fact_test.yml
# 内容会很多

3.2 关闭事实

为 play 禁用事实收集,将gather_facts 关键字设置为 no。可以加快 playbook 的运行速度,或者在受控节点不支持 setup 模块时使用。

即使在 play 设置 gather_facts 为 no 的情况下,任务仍可以通过设置 ansible.builtin.setup 模块手动收集事实。

---
- name: Play with manual fact gatheringhosts: allgather_facts: no                    # 关闭自动收集tasks:- name: Manually collect only disk factsansible.builtin.setup:          # 设置 ansible.builtin.setup 模块gather_subset:- network 

3.3 事实子集

模块默认收集全部事实,但可以通过配置仅收集事实的子集。子集的具体内容可以参考 Ansible 官方文档或使用 ansible-doc setup 命令查看。

---
- name: Various fact gathering exampleshosts: alltasks:- name: Collect all facts (default behavior)ansible.builtin.setup:gather_subset:- all- name: Collect network-related factsansible.builtin.setup:gather_subset:- network- name: Collect hardware and network factsansible.builtin.setup:gather_subset:- hardware- network- name: Collect all facts except networkansible.builtin.setup:gather_subset:- "!network"- name: Collect minimal fact setansible.builtin.setup:gather_subset:- min

3.3 自定义事实

管理员可以使用自定义事实定义受管主机的特定值。自定义事实存储在受管节点的本地文件中。

自定义事实可以在 INI 或 JSON 格式(效率高,语法麻烦)的文件中静态定义,也可以通过可执行脚本在运行时动态生成

ansible.builtin.setup 模块会自动从受管节点的 /etc/ansible/facts.d 目录中收集自定义事实,文件的扩展名必须为 .fact

注意: 自定义事实不支持 YAML 格式。

4. 魔法变量

有些变量不由 ansible.builtin.setup 模块收集,但有用,此时就需要魔法变量,它是一种特殊的变量,可以获取与特定受管主机相关的信息。

使用场景:在一个任务中需要访问其他受管主机的信息。

常用魔法变量

变量名称描述
hostvars包含所有受管主机的非事实变量
hostvars[inventory_hostname]当前主机的所有变量(包括事实和自定义变量)
group_names列出当前受管主机所属的所有组
groups列出 inventory 中所有组和对应的主机
inventory_hostname在 inventory 中定义的主机名(可能与事实主机名不同)

如有问题或建议,欢迎在评论区中留言~

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

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

相关文章

ROS2下YOLO+Moveit+PCL机械臂自主避障抓取方案

整体运行架构 1.运行相机取像节点 . ./install/setup.bash ros2 launch orbbec_camera gemini_330_series.launch.py depth_registration:true 2.运行根据图像x,y获取z的service 基本操作记录: 创建python包,在src目录下 ros2 pkg create test_python_topic --bu…

快速入门Vue3——初体验

目录 前言 一、搭建环境 1.1、安装Node.js 1.2、安装Vite 二、项目创建 三、运行项目 四、集成Pinia 4.1、Pinia介绍 4.2、Pinia安装 五、集成VueUse 5.1、vueuse简介 5.2、vueuse安装 六、集成Vant 6.1、Vant简介 6.2、Vant安装 前言 本专栏主要介绍如何使用…

深入理解Kubernetes核心:标签与标签选择器实战解析

在管理 Kubernetes 集群时,随着 Pods、Services 等资源数量的增长,如何有效地组织和筛选它们,成为了一个核心问题。Kubernetes 为此提供了一个简单却极其强大的机制:标签(Labels)和标签选择器(L…

哈希和字符串哈希

哈希(Hash) Hash 表 Hash 表又称为散列表,一般由 Hash 函数(散列函数)与链表结构共同实现。与离散化思想类似,当我们要对若干复杂信息进行统计时,可以用 Hash 函数把这些复杂信息映射到一个容…

【Docker基础】Docker-Compose核心配置文件深度解析:从YAML语法到高级配置

目录 前言 1 YAML基础语法解析 1.1 YAML格式简介 1.2 Docker-compose中的YAML语法规则 1.3 YAML数据类型在Compose中的应用 2 docker-compose.yml文件结构剖析 2.1 基本文件结构 2.2 版本声明详解 3 services配置深度解析 3.1 服务定义基础 3.2 镜像与构建配置 3.3…

如何判断是否应该为了一个小功能而引入一个大体积的库

在软件开发中,判断是否应该为了一个看似微小的功能,而引入一个大体积的第三方库,是一项极其重要的、需要进行审慎的“投入产出比”分析的技术决策。这个决策,绝不能,仅仅基于“实现功能的便利性”,而必须&a…

相机定屏问题分析五:【跳帧异常】照片模式1x以上的焦段拍照之后定屏

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 相机定屏问题分析五:【跳帧异常】照片模式1x以上的焦段拍照之后定屏9573412 目录 一、问题背景 二…

Non-stationary Diffusion For Probabilistic Time Series Forecasting论文阅读笔记

Non-stationary Diffusion For Probabilistic Time Series Forecasting 摘要 时间序列数据受到潜在的物理动力学和外部影响,其不确定性通常随时间而变化。现有的去噪扩散概率模型(DDPMs)受到加性噪声模型(ANM)的恒定方…

解决Docker 无法连接到官方镜像仓库

这个错误: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)表示 Docker 无法连接到官方镜像仓库 registry-1.docker…

解决RAGFlow启动时Elasticsearch容器权限错误的技术指南

文章目录 问题现象 根本原因分析 解决方案步骤 1. 定位宿主机数据目录 2. 修复目录权限 3. 验证权限状态 4. 重启服务 5. 检查启动状态 永久解决方案:优化Docker Compose配置 高级故障排除 技术原理 问题现象 在启动RAGFlow项目时,执行 docker logs ragflow-es-01 发现Elast…

【C++高阶六】哈希与哈希表

【C高阶六】哈希与哈希表1.什么是哈希?2.unordered系列容器3.哈希表3.1将key与存储位置建立映射关系3.1.1直接定址法3.1.2除留余数法(产生哈希冲突)3.2解决哈希冲突的方法3.2.1闭散列(开放定址法)3.3.2开散列&#xff…

Vue 3 +Ant Design Vue 父容器样式不影响子级,隔离

公共样式文件 common.scss.zz-ant-status-bar {div {font-size: 12px;padding: 0 8px;} }页面代码<div class"zz-ant-status-bar"><a-row><a-col :span"6" ><a-progress :percent"progress.percent" size"small"…

k8s 简介及部署方法以及各方面应用

Kubernetes 简介及部署方法Kubernetes&#xff08;简称 K8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化容器化应用的部署、扩展、管理和运维。它由 Google 基于内部的 Borg 系统经验开发&#xff0c;2014 年开源后由云原生计算基金会&#xff08;CNCF&#xf…

Class A 包含字段 x Class B 也包含字段 x,如果判断List<A> lista 和 List<B> listb 有相同的 x?

要判断两个不同类型的对象列表 List<A> 和 List<B> 是否包含相同的 x字段值&#xff08;即两个列表中至少有一个 x是相同的&#xff09;&#xff0c;你可以使用 Java 8 的 Stream API 来实现。import java.util.List; import java.util.Set; import java.util.stre…

SpringBoot整合Camunda工作流

什么是工作流&#xff1f;概述 工作流是将一组任务组织起来以完成某个经营过程&#xff1a;定义了任务的触发顺序和触发条件&#xff0c;每个任务可以由一个或多个软件系统完成&#xff0c;也可以由一个或一组人完成&#xff0c;还可以由一个或多个人与软件系统协作完成&#x…

2025年09月计算机二级Java选择题每日一练——第四期

计算机二级中选择题是非常重要的&#xff0c;所以开始写一个每日一题的专栏。 答案及解析将在末尾公布&#xff01; 今日主题&#xff1a;面向对象特性 1、有两个类 A 和 B 的定义如下&#xff1a; class A{final int x10;public void show(){System.out.print(x " &quo…

《Nature》新文解读:电化学辅助核聚变的实验验证与机制分析

前言一篇于2025年8月发表在《Nature》期刊上的重磅研究&#xff0c;由加拿大不列颠哥伦比亚大学&#xff08;UBC&#xff09;Curtis P. Berlinguette教授领导的跨学科团队完成&#xff0c;首次在实验上证实&#xff1a;通过电化学方法向钯金属靶中加载氘&#xff0c;可显著提升…

【基础-判断】用户在长视频、短视频、直播、通话、会议、拍摄类应用等场景下,可以采用悬停适配在折叠屏半折态时,上屏进行浏览下屏进行交互操作

用户在长视频、短视频、直播、通话、会议、拍摄类应用等场景下,可以采用悬停适配在折叠屏半折态时,上屏进行浏览下屏进行交互操作。 解释如下: ✅ 1. 悬停态适配机制的核心设计 HarmonyOS 针对折叠屏半折态(悬停态)提供了分屏交互框架,其核心逻辑是: 上屏(Upper Scre…

nodejs安装后 使用npm 只能在cmd 里使用 ,但是不能在poowershell使用,只能用npm.cmd

nodejs安装后 使用npm 只能在cmd 里使用 &#xff0c;但是不能在poowershell使用&#xff0c;只能用npm.cmdnodejs版本&#xff1a;22.18.0 刚安装好nodejs&#xff0c;在 PowerShell 中无法执行 npm&#xff0c;但能执行npm.cmd&#xff0c;这通常是因为 PowerShell 的执行策略…

【链表 - LeetCode】2. 两数相加

谁都逃不掉 LeetCode &#xff01;&#xff01;哈哈哈~~~ 开刷&#xff1a;&#xff09; 2025年08月22日 题目&#xff1a;2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 知识点&#xff1a;链表 /*** Definition for singly-linked list.* struct ListNode {* in…