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

Orange的运维学习日记--43.Ansible进阶之变量与加密

# Orange的运维学习日记–43.Ansible进阶之变量与加密

文章目录

  • # Orange的运维学习日记--43.Ansible进阶之变量与加密
    • 实验环境配置
    • 管理变量(Variables)
      • 变量简介
      • 变量命名规则
      • 变量范围与优先级
    • Global Scope 示例
    • Play Scope 示例
      • 使用 `vars` 声明变量
      • 使用 `vars_files` 引入变量文件
      • 变量引用方式
    • Host Scope 示例
      • 在主机清单中定义变量
      • 使用目录结构定义变量
      • 多层主机组变量示例
      • 主机连接特殊变量
    • 数组变量使用
    • register 语句
    • Magic 变量

实验环境配置

在项目目录 web 中创建配置文件和主机清单:

mkdir web && cd webcat > ansible.cfg <<'EOF'
[defaults]
remote_user = your_user
inventory = ./inventory[privilege_escalation]
become = True
become_user = root
become_method = sudo
become_ask_pass = False
EOFcat > inventory <<'EOF'
controller
node1
node2
node3
node4
EOF

管理变量(Variables)

变量简介

Ansible 使用变量来存储数据,便于在项目中重复引用
变量可用于定义用户、软件包、服务、文件路径等,有助于简化项目维护并降低错误率

在这里插入图片描述

变量命名规则

  • 变量名只能包含字母、数字和下划线
  • 必须以字母开头
  • 不允许包含空格、点号或特殊符号(如 $

变量范围与优先级

Ansible 支持在多个层级定义变量,主要包括:

  • Global scope:命令行或配置文件中定义的变量
  • Play scope:在 playbook 中定义的变量
  • Host scope:主机或主机组中定义的变量,包括 facts 和注册变量

变量优先级从高到低为:

Global > Play > Host

当多个范围定义了同名变量时,优先级高的变量会覆盖低优先级的值


Global Scope 示例

通过 -e 参数在命令行传递变量:

ansible node1 -m debug -a "msg={{ package }}" -e "package=httpd"
ansible node1 -m yum -a "name={{ package }} state=present" -e "package=httpd"

Play Scope 示例

使用 vars 声明变量

---
- name: test vars statement in playhosts: node1vars:user: joehome: /home/joetasks:- name: add user {{ user }}user:name: "{{ user }}"home: "{{ home }}"state: present- name: debug userdebug:msg: |username is {{ user }}home is {{ home }}

注意:Ansible 2.18 版本已移除列表格式变量声明方式

使用 vars_files 引入变量文件

适用于变量较多的场景,可将变量分类存放于外部文件中:

---
- name: test vars statement in playhosts: node1vars_files:- vars/user1.yamltasks:- name: add user {{ user }}user:name: "{{ user }}"home: "{{ home }}"state: present- name: debug userdebug:msg: >username is {{ user }}home is {{ home }}

变量文件内容示例:

# vars/user1.yaml
user: user1
home: /home/user1

变量引用方式

变量需使用双花括号 {{ }} 包裹进行引用
当变量位于值的开头时,必须使用引号包裹整个表达式,否则会导致语法错误

错误示例:

name: {{ user }}

正确示例:

name: "{{ user }}"

Host Scope 示例

在主机清单中定义变量

[servers]
node1 user=your_user
node2[servers:vars]
user=default_user

执行验证:

ansible servers -m debug -a 'var=user'

不推荐在清单中混合定义变量,建议使用分层目录结构

使用目录结构定义变量

推荐使用 group_varshost_vars 目录进行变量管理:

group_vars/servers.yaml
host_vars/node1.yaml

示例内容:

# group_vars/servers.yaml
user: default_user# host_vars/node1.yaml
user: your_user

验证结果:

ansible servers -m debug -a 'var=user'

多层主机组变量示例

tree
.
├── ansible.cfg
├── group_vars
│   ├── dc
│   ├── dc1
│   └── dc2
├── host_vars
│   └── node1.yaml
├── inventory
└── playbook.yaml

清单内容:

[dc1]
node1
node2[dc2]
node3
node4[dc:children]
dc1
dc2

变量定义:

# group_vars/dc:package: httpd
# group_vars/dc1:package: httpd
# group_vars/dc2:package: apache
# host_vars/node1.yaml:package: mariadb-server

执行验证:

ansible all -m debug -a 'var=package'

主机连接特殊变量

以下变量用于控制主机连接行为:

变量名说明
ansible_connection连接类型(smart、ssh、paramiko)
ansible_host要连接的主机名
ansible_portSSH 端口号
ansible_userSSH 用户名
ansible_ssh_passSSH 密码(建议使用保管库)
ansible_ssh_private_key_fileSSH 私钥路径
ansible_ssh_common_args附加到所有 SSH 命令的参数
ansible_sftp_extra_args附加到 SFTP 命令的参数
ansible_scp_extra_args附加到 SCP 命令的参数
ansible_ssh_extra_args附加到 SSH 命令的参数
ansible_become是否启用提权
ansible_become_method提权方式
ansible_become_user提权后的用户
ansible_become_pass提权密码(建议使用保管库)

详细说明参考 官方文档


数组变量使用

将多个相关值组合为数组变量,便于统一管理:

users:bjones:first_name: Boblast_name: Joneshome_dir: /users/bjonesacook:first_name: Annelast_name: Cookhome_dir: /users/acook

引用方式:

users.bjones.first_name
users['acook']['home_dir']

推荐统一使用 [''] 方式以避免关键字冲突

示例:

---
- name: test vars statement in playhosts: node1vars: users:user1:user_name: user1home_path: /home/user1user2:user_name: user2home_path: /home/user2tasks:- name: add user {{ users.user1.user_name }}user:name: '{{ users.user1.user_name }}'home: "{{ users.user1.home_path }}"- name: debug user2debug: msg: >username is {{ users['user2']['user_name'] }}home_path is {{ users['user2']['home_path'] }}

数组列表形式:

users:- user_name: userAhome_path: /home/userA- user_name: userBhome_path: /home/userB

引用方式:

users.0.user_name
users[1].user_name

register 语句

register 用于捕获任务输出并存入变量,便于后续引用或调试:

---
- name: Installs a package and prints the resulthosts: node1tasks:- name: Install the packageyum:name: httpdstate: installedregister: install_result- debug: var: install_result

Magic 变量

Magic 变量由 Ansible 自动设置,用于获取主机相关信息

清单示例:

controller[webs]
node1
node2[dbs]
node3
node4

常用 Magic 变量:

变量名说明
inventory_hostname当前主机在清单中的名称
group_names当前主机所属的所有主机组
groups清单中所有主机组及其成员
hostvars所有主机的变量集合,可跨主机引用

示例:

ansible node1 -m debug -a 'var
e2[dbs]
node3
node4

常用 Magic 变量:

变量名说明
inventory_hostname当前主机在清单中的名称
group_names当前主机所属的所有主机组
groups清单中所有主机组及其成员
hostvars所有主机的变量集合,可跨主机引用

示例:

ansible node1 -m debug -a 'var
http://www.dtcms.com/a/329226.html

相关文章:

  • SQL详细语法教程(二)--DML(数据操作语言)和DQL(数据查询语言)
  • 健永科技工业自动化RFID解决方案
  • Linux:线程
  • LeetCode215~ 234题解
  • 《算法导论》第 23 章 - 最小生成树
  • 中高级餐饮服务食品安全员考试核心知识点汇总
  • 亚马逊精准词失灵:广告效能瓶颈的系统破解与矩阵重构
  • RK3588——DMABUF+CMA的完美组合
  • YOLO-v2-tiny 20种物体检测模型
  • 基于C语言基础对C++的进一步学习_C和C++编程范式、C与C++对比的一些补充知识、C++中的命名空间、文件分层
  • Java Redis基础入门:快速上手指南
  • 广东省省考备考(第七十五天8.13)——判断推理(图形推理题型总结)
  • flex布局之设置主轴上的子元素排列方式一
  • 机器学习之词向量转换
  • 【H5】禁止IOS、安卓端长按的一些默认操作
  • ios添加ic卡如何操作?
  • 8.12 数据分析(1)
  • mac 安卓模拟器 blueStacks
  • windows10的vs2019编译openssl静态库备忘
  • 随想记-excel报表美化
  • unity_MCP
  • 类和对象(中下)
  • 《Linux基础知识-4》
  • Kubernetes-03:Service
  • LeetCode——456. 132 模式
  • 6 .循环-for
  • 高级项目——基于FPGA的串行FIR滤波器
  • Rust面试题及详细答案120道(01-10)-- 基础语法与数据类型
  • 日志数据链路的 “搬运工”:Flume 分布式采集的组件分工与原理
  • React常见的Hooks