在Ansible中,可以定义及使用各种类型的变量,下面依次进行介绍。
Ansible自动收集的系统变量
在运行任何一个Ansible命令/playbook的时候,Ansible都会先运行setup模块,搜集被控制主机的信息,并将这些信息保存到系统变量中。因此在playbook中可以直接使用这些变量。
Inventory变量
首先可以在inventory中定义变量:
text
[dev]
150.230.127.2 var1="test inventory variable"
接下来就可以在playbook中使用变量:
yaml
---
- hosts: dev
tasks:
- name: load content from variable
shell: echo "{{ var1 }}" > /tmp/testvar.txt
读取系统变量
yaml
---
- hosts: dev
tasks:
- name: save system info to file
shell: echo "RAM {{ansible_memtotal_mb}} MB" > /tmp/sysinfo.txt
通过命令行传递变量给ansible-playbook
bash
ansible-playbook xxx.yml -e uname="lcoding" upass="testpass"
使用register将某个命令的执行结果保存到变量中
yaml
---
- hosts: dev
tasks:
- name: save info to variable
shell: whoami
register: var1
- name: print username
debug:
msg: "{{var1}}"
如果上面的变量 var1 中还有其他的属性,可以通过 “.” 来进行访问。比如:var1.stdout。
在playbook中定义变量
yaml
---
- hosts: dev
vars:
uname: lcoding
upass: 'testpass' # 密码必须以字符串方式定义
tasks:
- name: Pass variables to user module
user:
name: "{{uname}}"
password: "{{upass | password_hash('sha512')}}"
通过命令行交互获取用户名及密码
yaml
---
- hosts: dev
vars_prompt:
- name: uname
prompt: "Enter your username"
private: no
- name: upass
prompt: "Enter your password"
private: yes
tasks:
- name: Pass variables to user module and create a user
user:
name: "{{uname}}"
password: "{{upass | password_hash('sha512')}}"
通过专门的文件定义变量
创建文件:credentials.yml
yaml
---
uname: lcoding
upass: 'testpass'
然后就可以在playbook中引用它:
yaml
---
- hosts: dev
var_files: credentials.yml
tasks:
# ......