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)、在命令行对变量赋值

  1. 我们写一段实例:
  2. vim /app/ansible/playbook/var_test.yml
  3. ---
  4. - hosts: mysql
  5. remote_user: root
  6. tasks:
  7. - name: install package
  8. yum: name={{pkg_name}} state=present
  9.  
  10. 现在调用这段剧本
  11. [root@ansible playbook]# ansible-playbook -C -e "pkg_name=mariadb-server" var_test.yml
  12.  
  13. PLAY [mysql] ********************************************************************************
  14.  
  15. TASK [Gathering Facts] **********************************************************************
  16. ok: [172.18.30.3]
  17.  
  18. TASK [install package] **********************************************************************
  19. changed: [172.18.30.3]
  20.  
  21. PLAY RECAP **********************************************************************************
  22. 172.18.30.3 : ok=2 changed=1 unreachable=0 failed=0
  23.  
  24. 在上面命令的 -e选项是用来定义变量的,我们直接定义了pkg_name这个变量,这是变量的一种赋值方法。

可以看出这种方式并不适合我们批量操作,下面我们在playbook中直接定义这个变量,我们还用这个剧本来实现。

2)在playbook中定义变量值

vim /app/ansible/playbook/var_test.yml" class="reference-link">
  1. 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

现在我们调用这段脚本

[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中使用多个变量

  1. 写一段新的playbook
  2. vim /app/ansible/playbook/vars2_test.yml
  3. ---
  4. - hosts: webserver
  5. remote_user: root
  6. vars:
  7. - user: dd
  8. - group: ff
  9. tasks:
  10. - name: create user
  11. user: name={{user}} state=present
  12. - name: Add a new group
  13. group: name={{group}} state=present
  14.  
  15. 调用playbook
  16.  
  17. [root@ansible playbook]# ansible-playbook -C vars2_test.yml
  18.  
  19. PLAY [webserver] ***************************************************************
  20.  
  21. TASK [Gathering Facts] *********************************************************
  22. ok: [172.18.30.1]
  23. ok: [172.18.30.2]
  24.  
  25. TASK [create user] *************************************************************
  26. changed: [172.18.30.1]
  27. changed: [172.18.30.2]
  28.  
  29. TASK [Add a new group] *********************************************************
  30. changed: [172.18.30.2]
  31. changed: [172.18.30.1]
  32.  
  33. PLAY RECAP *********************************************************************
  34. 172.18.30.1 : ok=3 changed=2 unreachable=0 failed=0
  35. 172.18.30.2 : ok=3 changed=2 unreachable=0 failed=0
  36.  
  37. 可以成功执行

4)在 inventory中定义变量

  1. vim /etc/ansible/hosts
  2. [webserver]
  3. 172.18.30.[1:2] software=nginx
  4.  
  5. [loadbalance]
  6. 172.18.30.2 software=lvs
  7.  
  8. [mysql]
  9. 172.18.30.3 software=mariadb-server
  10.  
  11. [middle]
  12. 172.18.30.4 software=tomcat
  13.  
  14. 在连接主机后面直接对变量复制,通过" "隔开。
  15.  
  16. 现在我们写一个安装软件的playbook
  17. vim /app/ansible/playbook/vars_install_test.yml
  18. ---
  19. - hosts: all
  20. remote_user: root
  21. tasks:
  22. - name: Install default packege
  23. yum: name={{software}} state=present
  24.  
  25. [root@ansible playbook]# ansible-playbook -C vars_install_test.yml
  26.  
  27. PLAY [all] ****************************************************************************
  28.  
  29. TASK [Gathering Facts] ****************************************************************
  30. ok: [172.18.30.2]
  31. ok: [172.18.30.1]
  32. ok: [172.18.30.4]
  33. ok: [172.18.30.3]
  34.  
  35. TASK [Install default packege] ********************************************************
  36. 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"]}
  37. 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"]}
  38. changed: [172.18.30.4]
  39. changed: [172.18.30.3]
  40. to retry, use: --limit @/app/ansible/playbook/vars_install_test.retry
  41.  
  42. PLAY RECAP ****************************************************************************
  43. 172.18.30.1 : ok=1 changed=0 unreachable=0 failed=1
  44. 172.18.30.2 : ok=1 changed=0 unreachable=0 failed=1
  45. 172.18.30.3 : ok=2 changed=1 unreachable=0 failed=0
  46. 172.18.30.4 : ok=2 changed=1 unreachable=0 failed=0
  47.  
  48. 有两个是失败的,这只是个测试,因为我没有配置epel源,所以它没有找到安装包,这并没有关系,语法是对的。

5)组变量

组变量是指赋予给指定组内所有主机上的在playbook中可用的变量

例:

  1. vim /etc/ansible/hosts
  2. [webserver]
  3. 172.18.30.[1:2]
  4.  
  5. [loadbalance]
  6. 172.18.30.2
  7.  
  8. [mysql]
  9. 172.18.30.3
  10.  
  11. [middle]
  12. 172.18.30.4
  13.  
  14. [webserver:vars]
  15. software=nginx
  16.  
  17. 上一个实例我们对每一个主机进行了变量赋值,如果要对一组主机进行变量赋值则需要使用"[host_group:vars]"这种写作方式来进行赋值

现在我们修改一下上一个playbook

vim /app/ansible/playbook/vars_install_test.yml" class="reference-link">
  1. vim /app/ansible/playbook/vars_install_test.yml

  • hosts: webserver
    remote_user: root
    tasks:
    • name: Install default packege
      yum: name={{software}} state=present

调用这个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的用法。

 

文档更新时间: 2018-12-20 15:39   作者:张尚