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_vars
和 host_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_port | SSH 端口号 |
ansible_user | SSH 用户名 |
ansible_ssh_pass | SSH 密码(建议使用保管库) |
ansible_ssh_private_key_file | SSH 私钥路径 |
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