Ansible Playbook中也支持变量。
变量名:仅能由字母、数字和下划线组成,且只能以字母开头。
变量定义
variable=value
variable: value
范例
http_port=80
http_port: 80
变量调用方式
{{ variable_name }}
有时候需要加双引号生效
"{{ variable_name }}"
变量来源
1.ansible的setup facts远程主机的所有变量都可直接调用。
2.命令行指定变量(优先级最高)
ansible-playbook -e varname=value test.yml
3.在playbook文件中定义
vars:
var1: value1
var2: value2
4.在独立的变量YAML文件中定义
- host: webservers
vars_file:
- vars.yml
5.在主机清单文件中定义
6.在项目中针对主机和主机组定义
在项目目录中创建host_vars和group_vars目录
7.在role中定义
定义变量的优先级从高到低
命令行-e选项定义的 > playbook中vars_file > playbook中vars变量 > 项目目录/host_vars/主机名文件 > 主机清单中的主机变量 > 项目目录/group_vars/主机组名文件 > group_vars/all文件 > 主机清单中的组变量
setup 模块变量
本模块自动在playbook调用,不要用ansible命令调用,生成系统状态信息,,并存放在facts变量中。
facts 包括的信息很多,如: 主机名、IP、CPU、内存、网卡等。
范例
在/tmp下创建名为主机名的log文件
---
- hosts: webservers
tasks:
- name: Create Log File
file: path='/tmp/{{ ansible_nodename }}.log' state=touch owner=root mode=600
显示 eth0 网卡的IP地址
- hosts: webservers
tasks:
- name: Show Eth0 Ip Address
debug:
msg:
- IP Address: "{{ ansible_eth0.ipv4.address }}"
- Eth0 is active: "{{ ansible_eth0.active }}"
命令行变量
-e 选项指定变量
范例
安装指定的包
---
#创建文件var3.yml
- hosts: webservers
tasks:
- name: Install {{ pkname }}
yum: name={{ pkname }} state=present
ansible-playbook -e pkname=sl,cowsay var3.yml
也可以把变量放在当前目录的vars文件,再用 -e 选项调用
---
#创建文件var4.yml
- hosts: webservers
tasks:
- name: Install {{ pkname }}
yum: name={{ pkname }} state=present
ansible-playbook -e '@vars' var4.yml
Playbook文件中变量
范例
创建nginx组和用户
---
- hosts: webservers
vars:
groupname: nginx
username: nginx
tasks:
- name: Create group {{ groupname }}
group: name={{ groupname }} state=present system=yes
- name: Create user {{ username }}
user: name={{ username }} state=present system=yes group={{ groupname }} create_home=no shell=/sbin/nologin
变量的相互调用
---
- hosts: webservers
vars:
var1: "/tmp/{{ ansible_default_ipv4.address }}"
tasks:
- name: Create Directory
file: name={{ var1 }} state=directory
安装多个包,多种写法
---
- hosts: webservers
tasks:
- name: Install
yum:
name:
- nginx
- redis
state: present
---
- hosts: webservers
vars:
web: nginx
db: redis
tasks:
- name: Install {{ web }} {{ db }}
yum:
name:
- "{{ web }}"
- "{{ db }}"
state: present
---
- hosts: webservers
tasks:
- name: Install {{ pk }}
vars:
pk:
- nginx
- redis
yum:
name: "{{ pk }}"
state: present
Playbook引用变量文件
可以在一个独立的playbook文件中定义变量,在另一个playbook文件中引用变量文件中的变量,比playbook中直接定义的变量优先级高。
范例
变量文件vars.yml和调用它的playbook文件需要在同一个目录
创建变量文件 vars.yml
---
#vars.yml
web: nginx
db: redis
在playbook文件中调用
---
#yum3.yml
- hosts: webservers
vars_files:
- vars.yml
tasks:
- name: install {{ web }} {{ db }}
yum:
name:
- "{{ web }}"
- "{{ db }}"
state: present
主机清单变量
在inventory 主机清单文件中为指定的主机定义变量以便于在playbook中使用
主机清单默认路径:/etc/ansible/hosts
范例
[webservers]
10.0.0.1 hname=www1 domain=frogvps.com
10.0.0.2 hname=www2
#webservers组的公共变量
[webservers:vars]
http_port=80
#所有组的公共变量
[all:vars]
CONTAINER_RUNTIME="docker"
CLUSTER_NETWORK="calico"
PROXY_MODE="ipvs"
SERVICE_CIDR="192.168.0.0/16"
CLUSTER_CIDR="172.16.0.0/16"
NODE_PORT_RANGE="20000-60000"
CLUSTER_DNS_DOMAIN="frogvps.local."
bin_dir="/usr/bin"
ca_dir="/etc/kubernetes/ssl"
base_dir="/etc/ansible"
项目文件变量
生产建议在项目目录中创建额外的两个变量目录,分别是host_vars和group_vars
host_vars下面的文件名和主机清单主机名一致,针对单个主机进行变量定义,格式: host_vars/hostname
group_vars下面的文件名和主机清单中组名一致,针对单个组进行变量定义,格式: gorup_vars/groupname
group_vars/all文件内定义的变量对所有组都有效
范例
这是实验用的hosts文件,一台腾讯云,一台dmit
[webservers]
175.24.227.179
[dmit]
154.17.22.52
首先,在/data文件夹新建一个项目
mkdir -p /data/ansible
然后,创建变量目录
cd /data/ansible
mkdir host_vars
mkdir group_vars
在目录下设置不同的变量
[root@VM-4-13-ubuntu /data/ansible]#cat host_vars/175.24.227.179
vps: txyun
[root@VM-4-13-ubuntu /data/ansible]#cat host_vars/154.17.22.52
vps: dmit
[root@VM-4-13-ubuntu /data/ansible]#cat group_vars/webservers
name: web1
[root@VM-4-13-ubuntu /data/ansible]#cat group_vars/dmit
name: web2
[root@VM-4-13-ubuntu /data/ansible]#cat group_vars/all
domain: frogvps.com
目录结构
[root@VM-4-13-ubuntu /data/ansible]#tree /data/ansible/
/data/ansible/
├── group_vars
│ ├── all
│ ├── dmit
│ └── webservers
├── host_vars
│ ├── 154.17.22.52
│ └── 175.24.227.179
└── test.yml
在playbook中调用变量,test.yml、host_vars、group_vars在相同目录下
---
#test.yml
- hosts: all
tasks:
- name: Print Variable
debug:
msg: "{{ vps }}{{ name }}.{{domain}}"
运行结果
[root@VM-4-13-ubuntu /data/ansible]#ansible-playbook test.yml
PLAY [all] ************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************
ok: [175.24.227.179]
ok: [154.17.22.52]
TASK [Print Variable] *************************************************************************************************
ok: [175.24.227.179] => {
"msg": "txyunweb.frogvps.com"
}
ok: [154.17.22.52] => {
"msg": "dmitweb2.frogvps.com"
}
PLAY RECAP ************************************************************************************************************
154.17.22.52 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
175.24.227.179 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
register 注册变量
在playbook中可以使用register将捕获命令的输出保存在临时变量中,然后使用debug模块进行显示输出。
范例
利用debug 模块输出变量
---
- hosts: all
tasks:
- name: Get variable
shell: hostname
register: name
- name: Print variable
debug:
msg:
- "{{ name }}"
控制命令的输出结果
---
- hosts: all
tasks:
- name: Get variable
shell: hostname
register: name
- name: Print variable
debug:
msg:
- "{{ name.stdout}}"
- "{{ name.cmd }}"
- "{{ name.stdout_lines }}"
使用 register 注册变量创建文件
---
- hosts: webservers
tasks:
- name: Get variable
shell: hostname
register: name
- name: Create file
file: path=/tmp/{{ name.stdout }}.log state=touch
debug自定义输出变量代替msg
---
- hosts: webservers
tasks:
- name: Print hello
shell: echo hello
register: hi
- name: Print user
shell: "awk -F: 'NR==1{print $1}' /etc/passwd"
register: user
- debug:
var=hi.stdout
- debug:
var=user.stdout