6.ansible变量
ansible定义变量定义变量在主机清单中定义变量剧本中使用变量使用自定义变量来创建和删除用户剧本中的提示变量定义变量在主机清单中定义变量node1 myvar="hello" myvar2="test"node2 yourname="omaidb"剧本中使用变量---- name: copy模块示例1hosts: node1tasks:- name: 将变量中的内容添加到文件中copy:cont
ansible变量
变量规则
ansible的变量规则和python差不多:
- 不能以数字和特殊符号开头,可以以字母,下划线开头
- 不能含有空格和特殊字符,可以含有下线线
变量优先级
!!! 变量的优先级: https://www.jianshu.com/p/db7f3dece8d1
cmd > playbook > inventoy
-
- 命令行值(eg “-u user”)
-
- plabook
-
- inventoy
定义变量

使用变量
使用变量时需要使用{{ 变量名 }},括号内的变量名要有前后一个空格.
如果使用debug的msg使用变量时,要以""(双引号)将msg的字符串引起来.
使用debug模块中的var调用变量时,直接输入变量名.
---
- name: debug模块演示
hosts: serverc.lab.example.com
tasks:
- name: msg演示
debug:
msg: "主机名是:{{ ansible_hostname }}"
- name: var演示
debug:
var: ansible_hostname
指定客户端的python路径
# 编辑主机清单,指定对应组的python路径
[all:vars]
ansible_python_interpreter=/usr/bin/python3
命令行指定变量值—优先级是最高的
ansible
命令行指定变量值的优先级是最高的
# -e 指定变量
ansible-playbook vartest.yml -e user="李老师"

在主机清单中定义和使用变量
[internetweb]
serverb.lab.example.com user=tgb
[intranetweb]
servera.lab.example.com user=lxs
serverc.lab.example.com user=hzz
serverd.lab.example.com user=hfq

示例:plabook中使用主机清单的变量
---
- name: var变量测试
hosts: all
tasks:
- name: debug模块演示
debug:
msg: "{{ user }}你好"
执行结果
在playbook中使用变量
示例1
---
- name: var变量测试
hosts: all
# playbook中定义变量
vars:
user: 庚老师
tasks:
- name: debug模块演示
debug:
# 打印变量
msg: "{{ user }}你好"
执行结果
示例2
---
# Play 1: 在 node1 上收集系统信息并写入文件,同时演示 inventory 变量
- name: 在 node1 上处理系统事实与清单变量
hosts: node1
gather_facts: yes # 确保收集 ansible_hostname、ansible_bios_version 等 facts
tasks:
- name: 将系统事实信息写入 /tmp/facts.txt
copy:
# ansible_hostname和ansible_bios_version 是 Ansible 自动收集的 facts 变量
content: |
主机名是: {{ ansible_hostname }}
BIOS 版本是: {{ ansible_bios_version }}
dest: /tmp/facts.txt
mode: "0644"
# 说明:ansible_* 是 Ansible 自动收集的 facts 变量
- name: 打印来自 inventory 的自定义变量 (myvar, myvar2)
# 前提:在 inventory 文件中已为 node1 定义了 myvar 和 myvar2 这2个变量
# 示例 inventory:
# node1 myvar=webserver myvar2=prod
debug:
msg: "Inventory 变量: myvar='{{ myvar }}', myvar2='{{ myvar2 }}'"
# Play 2: 在 node2 上使用 inventory 变量写入文件
- name: 在 node2 上使用清单变量写入文件
hosts: node2
tasks:
- name: 将 inventory 中的 yourname 变量写入 /tmp/facts.txt
# 前提:在 inventory 中为 node2 定义了 yourname
# 示例: node2 yourname="Alice"
copy:
content: "{{ yourname }}\n"
dest: /tmp/facts.txt
mode: "0644"
# Play 3: 演示 register 注册变量(命令输出捕获)
- name: 在 node1 上演示 register 注册变量
hosts: node1
tasks:
- name: 执行 shell 命令并将输出注册到变量 mycmd_result
# 注册变量 mycmd_result,接收 hostnamce 命令的输出
# 相当于 mycmd_result=$(hostname)
shell: hostname
register: mycmd_result
# 注意:register 创建的是一个字典对象,包含 stdout/stderr/rc 等字段
- name: 打印完整的注册变量内容(用于调试)
debug:
var: mycmd_result
# 使用 `var` 而非 `msg` 可以结构化输出整个变量
- name: 仅打印命令的标准输出(stdout)
debug:
# 打印变量的 stdout
msg: "运行的节点是 {{ mycmd_result.stdout }}"
矩阵变量的定义和调用

矩阵变量文件定义
users:
tgb:
name: tangguobin
money: 1
home: none
hzz:
name: hanzhuangzhuang
money: 10
home: hanjiacun

plabook导入矩阵变量文件
导入矩阵变量文件需要使用vars_files:
矩阵文件前要加-
可以导入多个矩阵变量文件

---
- name: 矩阵变量示例
hosts: serverd.lab.example.com
vars_files:
- vars_file1.yml
tasks:
- name: debug模块打印矩阵变量
debug:
var: users.tgb.name
- debug:
var: users.tgb.money
- debug:
var: users.tgb.home
- debug:
var: users.hzz.name
- debug:
var: users.hzz.money
- debug:
var: users.hzz.name

矩阵变量示例2
单独定义个变量文件,在playbook中用vars_files调用该变量文件
- 变量文件
variables.yaml
---
iname: cloud
ipass: '123456'
- palybook中导入变量文件

---
- name: 在剧本中导入变量文件
hosts: all
vars_files: variables.yml
tasks:
- name: 创建用户
user:
name: "{{ iname }}"
password: "{{ ipass | password_hash('sha512') }}"
-
执行结果

-
引用变量文件删除刚才创建的用户
---
- name: 引用变量文件删除用户
hosts: all
vars_files: variables.yml
tasks:
- name: 删除用户
user:
name: "{{ iname }}"
state: absent
remove: yes

register接收变量的作用
register能将tasks的运行过程状态以json格式记录下来,tasks运行可能会产生error,我们在运行playbook的时候,可以根据json中的值来判断是否产生错误.
例如我们可以根据json中的rc(return code)值来判断运行结果.
-
rc值为0,表示运行结果正确,
-
rc值为非0,表示运行失败
打印接收的register接收变量的值
---
- name: register接收变量演示
hosts: all
tasks:
- name: shell执行hostname,并将hostname结果保存到变量名myvar
shell: hostname
register: myvar
- name: 打印接收的myvar变量
debug:
msg: "{{ myvar }}"
- 执行结果

只打印register接收变量的子变量值
---
- name: register接收变量演示
hosts: all
tasks:
- name: shell执行hostname,并将hostname结果保存到变量名myvar
shell: hostname
register: myvar
- name: 打印接收的myvar变量
debug:
msg: "{{ myvar.stdout }}"
- 执行结果

变量作用域
剧本中定义变量
剧本中定义变量来创建和删除用户
---
- name: 剧本文件中定义变量来创建和删除用户
hosts: all
vars:
iname: omaidb
ipass: '123456'
tasks:
- name: 使用剧本中定义的变量来创建用户
user:
name: "{{ iname }}"
password: "{{ ipass | password_hash('sha512') }}"
tasks:
- name: 使用剧本中定义的变量来删除用户
user:
name: "{{ iname }}"
state: absent
remove: yes
剧本中定义提示变量创建用户
---
- name: 剧本中的提示变量
hosts: all
vars_prompt: # 定义提示变量
- name: iname # 定义iname空变量
prompt: "请输入用户名" # 提示输入用户名
private: no # 是否隐私信息,no将回显输入内容
- name: ipass # 定义ipass空变量
prompt: "请输入密码" # 提示输入密码
private: yes # 是否隐私信息,yes将不显示输入内容
tasks:
- name: 从提示变量中创建用户
user:
name: "{{ iname }}"
password: "{{ ipass | password_hash('sha512')}}"
执行ansible-playbook命令时使用-e参数定义变量
- 编写剧本
---
- name: 演示ansible-playbook命令执行时-e参数定义变量
hosts: all
tasks:
- name: 创建用户
user:
name: "{{ iname }}"
password: "{{ ipass | password_hash('sha512') }}"
- 执行ansible-play变量
# 执行剧本
[rhel8 root ~/ansible/play]# ansible-playbook -C var_local.yml -e iname="omaidb" -e ipass="123456"
# 查看node1执行结果
[node1 root ~]# id omaidb
uid=1000(omaidb) gid=1000(omaidb) 组=1000(omaidb)
# 查看node2执行结果
[node2 root ~]# id omaidb
uid=1000(omaidb) gid=1000(omaidb) 组=1000(omaidb)
- 演示自定义变量删除用户
---
- name: 演示ansible-playbook命令执行时-e参数定义变量
hosts: all
tasks:
- name: 删除用户
user:
name: "{{ iname }}"
state: absent
remove: yes
- 执行结果

总结:
一个tasks下不能有多个-name,否则会提示警告: 发现重复的 dict 键(任务)。 仅使用最后定义的值。
且只运行最后一个任务.
课后练习题
---
- name: test use var
hosts: webserver
vars:
web_pkg: httpd
firewall_pkg: firewalld
python_pkg: python3-PyMySQL
web_service: httpd
firewall_servcie: firewalld
rule: http
tasks:
- name: install pkg
yum:
name:
- "{{ web_pkg }}"
- "{{ firewall_pkg }}"
- "{{ python_pkg }}"
- name: service
service:
name: "{{ firewall_servcie }}"
enabled: true
state: started
- name: service
service:
name: "{{ web_service }}"
enabled: true
state: started
- copy:
content: "test"
dest: /var/www/html/index.html
- firewalld:
service: "{{ rule }}"
immediate: yes
permanent: yes
state: enabled
- name: check_web
hosts: localhost
tasks:
- name: check_web_page_status_code
uri:
url: http://servera.lab.example.com
status_code: 200
更多推荐

所有评论(0)