layout: post
title: Ansible-playbook的变量使用
date: 2018-01-15
tags: [“Ansible”,”自动化运维工具”]
一、变量的应用场景
在企业中,由于服务器很多,而且很可能有很多服务器安装了同一服务或工程,但其配置文件却可能并不相同,这是用我们使用playbook的基础应用去对配置文件直接进行复制显然是行不通的。这时候就需要用到”变量”,由变量的值,来代替配置文件中特定的文本的值。
二、变量的使用方法
Ansible 的变量名称可以以 字母、数字和下划线
命名,变量开头要以 字母开头,使用变量实际上是在调用ansible的template模块,而template就是使用的jinjia2的语法格式。
1、ansible hosts -m setup 下的变量都可以直接引用
2、可以在hosts中定义变量’
3、可以通过命令行来指定变量,优先级最高
4、在playbook中直接定义
5、直接定在在一个变量文件中,在playbook中使用它”vars_file:” 来调用
6、在role中定义(下一节将role,这一节只讲变量)
7、在playbook中通过 {{变量名}} 的方式来调用变量
下面引用实例,说明变量的用法:
1)、在命令行对变量赋值
- 我们写一段实例:
- vim /app/ansible/playbook/var_test.yml
- ---
- - hosts: mysql
- remote_user: root
- tasks:
- - name: install package
- yum: name={{pkg_name}} state=present
- 现在调用这段剧本
- [root@ansible playbook]# ansible-playbook -C -e "pkg_name=mariadb-server" var_test.yml
- PLAY [mysql] ********************************************************************************
- TASK [Gathering Facts] **********************************************************************
- ok: [172.18.30.3]
- TASK [install package] **********************************************************************
- changed: [172.18.30.3]
- PLAY RECAP **********************************************************************************
- 172.18.30.3 : ok=2 changed=1 unreachable=0 failed=0
- 在上面命令的 -e选项是用来定义变量的,我们直接定义了pkg_name这个变量,这是变量的一种赋值方法。
可以看出这种方式并不适合我们批量操作,下面我们在playbook中直接定义这个变量,我们还用这个剧本来实现。
2)在playbook中定义变量值
vim /app/ansible/playbook/var_test.yml" class="reference-link">- vim /app/ansible/playbook/var_test.yml
- vim /app/ansible/playbook/var_test.yml
- hosts: mysql
remote_user: root
vars:- pkg_name: mariadb-server
tasks: - name: install package
yum: name={{pkg_name}} state=present
- pkg_name: mariadb-server
现在我们调用这段脚本
[root@ansible playbook]# ansible-playbook -C var_test.yml
PLAY [mysql] **
TASK [Gathering Facts] **
ok: [172.18.30.3]
TASK [install package] **
changed: [172.18.30.3]
PLAY RECAP **
172.18.30.3 : ok=2 changed=1 unreachable=0 failed=0
以后可以直接通过修改playbook中的变量值来更改变量。
3)在playbook中使用多个变量
- 写一段新的playbook
- vim /app/ansible/playbook/vars2_test.yml
- ---
- - hosts: webserver
- remote_user: root
- vars:
- - user: dd
- - group: ff
- tasks:
- - name: create user
- user: name={{user}} state=present
- - name: Add a new group
- group: name={{group}} state=present
- 调用playbook
- [root@ansible playbook]# ansible-playbook -C vars2_test.yml
- PLAY [webserver] ***************************************************************
- TASK [Gathering Facts] *********************************************************
- ok: [172.18.30.1]
- ok: [172.18.30.2]
- TASK [create user] *************************************************************
- changed: [172.18.30.1]
- changed: [172.18.30.2]
- TASK [Add a new group] *********************************************************
- changed: [172.18.30.2]
- changed: [172.18.30.1]
- PLAY RECAP *********************************************************************
- 172.18.30.1 : ok=3 changed=2 unreachable=0 failed=0
- 172.18.30.2 : ok=3 changed=2 unreachable=0 failed=0
- 可以成功执行
4)在 inventory中定义变量
- vim /etc/ansible/hosts
- [webserver]
- 172.18.30.[1:2] software=nginx
- [loadbalance]
- 172.18.30.2 software=lvs
- [mysql]
- 172.18.30.3 software=mariadb-server
- [middle]
- 172.18.30.4 software=tomcat
- 在连接主机后面直接对变量复制,通过" "隔开。
- 现在我们写一个安装软件的playbook
- vim /app/ansible/playbook/vars_install_test.yml
- ---
- - hosts: all
- remote_user: root
- tasks:
- - name: Install default packege
- yum: name={{software}} state=present
- [root@ansible playbook]# ansible-playbook -C vars_install_test.yml
- PLAY [all] ****************************************************************************
- TASK [Gathering Facts] ****************************************************************
- ok: [172.18.30.2]
- ok: [172.18.30.1]
- ok: [172.18.30.4]
- ok: [172.18.30.3]
- TASK [Install default packege] ********************************************************
- fatal: [172.18.30.2]: FAILED! => {"changed": false, "msg": "No package matching 'lvs' found available, installed or updated", "rc": 126, "results": ["No package matching 'lvs' found available, installed or updated"]}
- fatal: [172.18.30.1]: FAILED! => {"changed": false, "msg": "No package matching 'nginx' found available, installed or updated", "rc": 126, "results": ["No package matching 'nginx' found available, installed or updated"]}
- changed: [172.18.30.4]
- changed: [172.18.30.3]
- to retry, use: --limit @/app/ansible/playbook/vars_install_test.retry
- PLAY RECAP ****************************************************************************
- 172.18.30.1 : ok=1 changed=0 unreachable=0 failed=1
- 172.18.30.2 : ok=1 changed=0 unreachable=0 failed=1
- 172.18.30.3 : ok=2 changed=1 unreachable=0 failed=0
- 172.18.30.4 : ok=2 changed=1 unreachable=0 failed=0
- 有两个是失败的,这只是个测试,因为我没有配置epel源,所以它没有找到安装包,这并没有关系,语法是对的。
5)组变量
组变量是指赋予给指定组内所有主机上的在playbook中可用的变量
例:
- vim /etc/ansible/hosts
- [webserver]
- 172.18.30.[1:2]
- [loadbalance]
- 172.18.30.2
- [mysql]
- 172.18.30.3
- [middle]
- 172.18.30.4
- [webserver:vars]
- software=nginx
- 上一个实例我们对每一个主机进行了变量赋值,如果要对一组主机进行变量赋值则需要使用"[host_group:vars]"这种写作方式来进行赋值
现在我们修改一下上一个playbook
vim /app/ansible/playbook/vars_install_test.yml" class="reference-link">- vim /app/ansible/playbook/vars_install_test.yml
- vim /app/ansible/playbook/vars_install_test.yml
- hosts: webserver
remote_user: root
tasks:- name: Install default packege
yum: name={{software}} state=present
- name: Install default packege
调用这个playbook
[root@ansible playbook]# ansible-playbook -C vars_install_test.yml
PLAY [webserver] **
TASK [Gathering Facts] **
ok: [172.18.30.2]
ok: [172.18.30.1]
TASK [Install default packege] **
fatal: [172.18.30.2]: FAILED! => {“changed”: false, “msg”: “No package matching ‘nginx’ found available, installed or updated”, “rc”: 126, “results”: [“No package matching ‘nginx’ found available, installed or updated”]}
fatal: [172.18.30.1]: FAILED! => {“changed”: false, “msg”: “No package matching ‘nginx’ found available, installed or updated”, “rc”: 126, “results”: [“No package matching ‘nginx’ found available, installed or updated”]}
to retry, use: —limit @/app/ansible/playbook/vars_install_test.retry
PLAY RECAP **
172.18.30.1 : ok=1 changed=0 unreachable=0 failed=1
172.18.30.2 : ok=1 changed=0 unreachable=0 failed=1
还是上一个实例的错误,因为我没有配置epel,所以没有nginx这个包。但是语法是没有问题的。
这一节就写到这里,下一节会写templete的用法。