目录
[1. 在Play中定义变量](#1. 在Play中定义变量)
[2. 在文件中定义变量](#2. 在文件中定义变量)
[3. 在主机清单中定义变量](#3. 在主机清单中定义变量)
[4. 官方推荐方式:host_vars 和 group_vars](#4. 官方推荐方式:host_vars 和 group_vars)
[二、Ansible 内置变量(Facts)](#二、Ansible 内置变量(Facts))
[查看所有 Facts](#查看所有 Facts)
一、变量定义方法
1. 在Play中定义变量
方式一:列表方式(一个名称对应一个值)
- hosts: web01
vars:
- p1: wget
- p2: lrzsz
tasks:
- name: yum test
yum:
name:
- "{{ p1 }}"
- "{{ p2 }}"
state: present
方式二:一个名称包含多个值
- hosts: web01
vars:
pack:
- wget
- lrzsz
tasks:
- name: yum test
yum:
name: "{{ pack }}"
state: present
注意:
-
如果变量单独存在需要加双引号,如
"{``{ p1 }}" -
如果带路径的变量则不需要加双引号
- hosts: web01
vars:
- ip: 10.0.0.7
- ho: web01
tasks:
- name: create directory
file:
path: /root/{{ ho }}_{{ ip }} # 路径中的变量无需引号
state: directory
2. 在文件中定义变量
单个文件定义
# v1.yml
p1: lrzsz
p2: wget
p3: tree
# test.yml
- hosts: web01
vars_files: ./v1.yml
tasks:
- name: yum test
yum:
name:
- "{{ p1 }}"
- "{{ p2 }}"
- "{{ p3 }}"
state: present
多个文件定义
# v1.yml
p1: tree
# v2.yml
pack:
- lrzsz
# test.yml
- hosts: web01
vars_files:
- v1.yml
- v2.yml
tasks:
- name: yum test
yum:
name: "{{ pack }}"
state: absent
3. 在主机清单中定义变量
# /etc/ansible/hosts
nfs ansible_ssh_host=10.0.0.31
[webs]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8
[webs:vars]
p1=wget
p2=lrzsz
# test.yml
- hosts: web01
tasks:
- name: yum test
yum:
name:
- "{{ p1 }}"
- "{{ p2 }}"
state: present
4. 官方推荐方式:host_vars 和 group_vars
创建目录结构:
mkdir host_vars group_vars
主机变量定义
# host_vars/web01
p1: wget
p2: lrzsz
# test.yml
- hosts: web01
tasks:
- name: yum test
yum:
name:
- "{{ p1 }}"
- "{{ p2 }}"
state: absent
组变量定义
# group_vars/webs
p1: tree
p2: lrzsz
# test.yml
- hosts: webs
tasks:
- name: yum test
yum:
name:
- "{{ p1 }}"
- "{{ p2 }}"
state: present
所有组通用变量
# group_vars/all
p1: wget
p2: lrzsz
二、Ansible 内置变量(Facts)
查看所有 Facts
ansible web01 -m setup
ansible web01 -m setup -a 'filter=ansible_hostname'
ansible web01 -m setup | grep ansible_hostname -A 5
使用内置变量示例
传统方式(不推荐):
- hosts: web01
tasks:
- name: create directory
file:
path: /root/web01_10.0.0.7
state: directory
- hosts: web02
tasks:
- name: create directory
file:
path: /root/web02_10.0.0.8
state: directory
使用内置变量(推荐):
- hosts: webs
tasks:
- name: create directory with facts
file:
path: /root/{{ ansible_hostname }}_{{ ansible_default_ipv4.address }}
state: directory
常用内置变量
| 变量名 | 说明 |
|---|---|
ansible_hostname |
主机名 |
ansible_default_ipv4.address |
默认IPv4地址 |
ansible_os_family |
操作系统家族 |
ansible_distribution |
发行版名称 |
ansible_distribution_version |
发行版版本 |
ansible_processor_cores |
CPU核心数 |
ansible_memtotal_mb |
内存大小(MB) |
ansible_devices |
磁盘设备信息 |
三、变量注册(Register)
为什么需要变量注册?
在执行某些命令时,Ansible不会直接返回执行结果,需要通过变量注册来捕获输出。
基础用法
- hosts: web01
tasks:
- name: check nginx config
command: 'nginx -t'
register: result_nginx
- name: print result
debug:
msg: "{{ result_nginx }}"
查看具体参数
- hosts: web01
tasks:
- name: check nginx config
command: 'nginx -t'
register: result_nginx
- name: print stderr lines
debug:
msg: "{{ result_nginx.stderr_lines }}"
- name: print return code
debug:
msg: "{{ result_nginx.rc }}"
实际应用:列出文件信息
- hosts: web01
tasks:
- name: list root directory
command: 'ls -l /root/'
register: list_dir
- name: print directory listing
debug:
msg: "{{ list_dir.stdout_lines }}"
注册变量的常用属性
| 属性 | 说明 |
|---|---|
rc |
返回码(0表示成功) |
stdout |
标准输出(字符串) |
stdout_lines |
标准输出(列表形式) |
stderr |
错误输出(字符串) |
stderr_lines |
错误输出(列表形式) |
changed |
是否发生变更 |
条件判断结合注册变量
- hosts: web01
tasks:
- name: check nginx config
command: 'nginx -t'
register: result
ignore_errors: yes
- name: restart nginx if config is valid
systemd:
name: nginx
state: restarted
when: result.rc == 0
四、变量优先级(从低到高)
-
group_vars/all -
group_vars/组名 -
host_vars/主机名 -
主机清单中定义的变量
-
Playbook中定义的
vars -
vars_files引入的变量 -
命令行传递的变量
-e
# 命令行传递变量(最高优先级)
ansible-playbook test.yml -e "p1=git p2=python3"
五、综合应用示例
案例:部署Nginx并配置
- hosts: webs
vars:
nginx_port: 80
nginx_user: www
tasks:
- name: install nginx
yum:
name: nginx
state: present
- name: create nginx user
user:
name: "{{ nginx_user }}"
uid: 666
group: "{{ nginx_user }}"
shell: /sbin/nologin
create_home: no
- name: copy nginx config
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
register: config_result
- name: test nginx config
command: nginx -t
register: test_result
changed_when: false
- name: restart nginx
systemd:
name: nginx
state: restarted
enabled: yes
when: config_result.changed and test_result.rc == 0
- name: display nginx info
debug:
msg:
- "Server: {{ ansible_hostname }} ({{ ansible_default_ipv4.address }})"
- "Nginx port: {{ nginx_port }}"
- "Config status: {{ 'Valid' if test_result.rc == 0 else 'Invalid' }}"
六、变量使用技巧总结
-
命名规范 :使用小写字母和下划线,如
nginx_port -
默认值 :可以使用
{``{ variable | default('default_value') }} -
变量合并 :
{``{ variable1 ~ '_' ~ variable2 }} -
类型转换 :
{``{ string_var | int }}、{``{ int_var | string }} -
条件判断 :
when: variable is defined
变量默认值示例
- hosts: webs
tasks:
- name: use default if variable not defined
debug:
msg: "{{ custom_port | default(80) }}"
通过合理使用Ansible变量,可以大大提高Playbook的灵活性和可复用性。建议在实际项目中优先使用 group_vars 和 host_vars 的目录结构来管理变量。