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
在主机清单中定义和使用变量
[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
指定客户端的python路径
# 编辑主机清单,指定对应组的python路径
[all:vars]
ansible_python_interpreter=/usr/bin/python3
示例:主机清单中定义user变量
命令行指定变量值—优先级是最高的
ansible命令行指定变量值的优先级是最高的
[student@workstation deploy-review]$ ansible-playbook vartest.yml -e user="李老师"
PLAY [var变量测试] *********************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************
ok: [serverc.lab.example.com]
ok: [servera.lab.example.com]
ok: [serverb.lab.example.com]
ok: [serverd.lab.example.com]
TASK [debug模块演示] *******************************************************************************************************
ok: [serverb.lab.example.com] => {
"msg": "李老师你好"
}
ok: [servera.lab.example.com] => {
"msg": "李老师你好"
}
ok: [serverc.lab.example.com] => {
"msg": "李老师你好"
}
ok: [serverd.lab.example.com] => {
"msg": "李老师你好"
}
示例:plabook中使用主机清单的变量
---
- name: var变量测试
hosts: all
tasks:
- name: debug模块演示
debug:
msg: "{{ user }}你好"
执行结果
在playbook中使用变量
示例1
---
- name: var变量测试
hosts: all
vars:
user: 庚老师
tasks:
- name: debug模块演示
debug:
msg: "{{ user }}你好"
执行结果
示例2
---
- name: copy模块示例1
hosts: node1
tasks:
- name: 将变量中的内容添加到文件中
copy:
content: "主机名是:{{ ansible_hostname }}\nbios版本是:{{ ansible_bios_version }}\n"
dest: /tmp/facts.txt
- name: 打印myvar变量和myvar2变量
hosts: node1
tasks:
- name: 打印node1主机清单中的变量
debug:
msg: "{{ myvar }},{{ myvar2 }}"
- name: copy模块示例2
hosts: node2
tasks:
- name: 将变量中的内容添加到node2的文本中
copy:
content: "{{ yourname }}\n"
dest: /tmp/facts.txt
- name: playbook中定义变量示例
hosts: node1
tasks:
- name: playbook中定义变量
shell: hostname
# register表示将shell输出的信息存到myvar变量中
register: myvar
- name: 打印上面定义的myvar变量(也就是hostname的信息)
debug:
msg: "{{ myvar }}"
- name: 显示myvar的指定key的数据(子变量)
debug:
msg: "运行的节点是{{ myvar.stdout }}"
矩阵变量的定义和调用
矩阵变量文件定义
[student@workstation deploy-review]$ cat vars_file1.yml
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调用该变量文件
- 变量文件
---
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
变量作用域
剧本中定义变量
剧本中定义变量来创建和删除用户
---
- 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
- 执行结果
ansible管理变量基础练习
---
- 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
总结:
一个tasks下不能有多个-name,否则会提示警告: 发现重复的 dict 键(任务)。 仅使用最后定义的值。
且只运行最后一个任务.