Ansible使用的变量包括两种,內建变量和自定义变量。在我的上一篇博客中已经针对Ansible的內建变量作了简单说明,同时,在Ansible中变量引用的主要方式相同,而自定义变量的定义方式有以下四种:

  1. 1,通过命令行定义变量
  2. 2,在playbook中定义变量
  3. 3,在主机清单文件中定义变量
  4. 4,通过roles角色定义变量

本文将主要针对Ansible中定义变量的四种方式进行简单介绍。

1 通过命令行定义变量

由于变量通常用在palybook文件中,与之配套我们需要在命令ansible-playbook中使用-e选项定义变量及赋值,格式如下:

  1. ansile-playbook -e "var_name=value" playbook

现在定义远程节点node1的ip为192.168.25.80,示例如下:

  1. [root@Centos7T Ansible]#cat playbook.yml
  2. - hosts: node1
  3. remote_user: root
  4. tasks:
  5. - name: Dispaly Welcome Infromation
  6. shell: echo {{ var }}
  7. [root@Centos7T Ansible]#ansible-playbook -e "var='Welcome to Ansible'" playbook.yml
  8. PLAY [node1] *************************************************************************
  9. TASK [Gathering Facts] ***************************************************************
  10. ok: [192.168.25.80]
  11. TASK [Dispaly Welcome Infromation] ***************************************************
  12. changed: [192.168.25.80]
  13. PLAY RECAP ***************************************************************************
  14. 192.168.25.80 : ok=2 changed=1 unreachable=0 failed=0

当然,我们也可以直接在命令行中定义及使用变量:

  1. [root@Centos7T Ansible]#ansible node1 -e "var1='Welcome to Ansible'" -m shell -a "echo {{ var1 }}"
  2. 192.168.25.80 | SUCCESS | rc=0 >>
  3. Welcome to Ansible

2 在playbook中定义变量

在playbook中定义变量需要用到Ansiblevars模块,我们可以再将所有需要用到的变量同一在vars模块下定义,定义格式需要遵循YAML语言格式:

  1. vars:
  2. - var1: value1
  3. - var2: value2
  4. - var3: value3
  5. …… ……

示例如下:

  1. [root@Centos7T Ansible]#cat playbook.yml
  2. - hosts: node1
  3. remote_user: root
  4. vars:
  5. - dir1: /root/Ansible
  6. - dir2: /root/Ansible/test1
  7. - dir3: /root/Ansible/test2
  8. tasks:
  9. - name: Create New Folder
  10. file: name={{ dir1 }} state=directory
  11. - name: Create New Folder
  12. file: name={{ dir2 }} state=directory
  13. - name: Create New Folder
  14. file: name={{ dir3 }} state=directory
  15. [root@Centos7T Ansible]#ansible-playbook playbook.yml
  16. PLAY [node1] *************************************************************************
  17. TASK [Gathering Facts] ***************************************************************
  18. ok: [192.168.25.80]
  19. TASK [Create New Folder] *************************************************************
  20. changed: [192.168.25.80]
  21. TASK [Create New Folder] *************************************************************
  22. changed: [192.168.25.80]
  23. TASK [Create New Folder] *************************************************************
  24. changed: [192.168.25.80]
  25. PLAY RECAP ***************************************************************************
  26. 192.168.25.80 : ok=4 changed=3 unreachable=0 failed=0

node1上的执行结果如下:

  1. [root@node1 ~]#tree Ansible/
  2. Ansible/
  3. ├── test1
  4. └── test2
  5. 2 directories, 0 files

3 在主机清单文件中定义变量

变量同样可以直接定义在主机清单文件/etc/ansible/hosts中,表明该变量只对对应的主机或者组有效,对其余的主机和组无效,格式如下:

  1. (i) 向不同的主机传递不同的变量;
  2. IP/HOSTNAME var1=value1 var2=value2
  3. (ii) 向组中的主机传递相同的变量;
  4. [groupname:vars]
  5. var1=value1
  6. var2=value2

示例如下:

  1. [root@Centos7T Ansible]#tail -n 10 /etc/ansible/hosts
  2. [websvr]
  3. 192.168.25.51 dir=/root/node2
  4. 192.168.25.80 dir=/root/node1
  5. [node1]
  6. 192.168.25.80
  7. [websvr:vars]
  8. file=hostname.txt
  9. [root@Centos7T Ansible]#cat playbook.yml
  10. - hosts: websvr
  11. remote_user: root
  12. tasks:
  13. - name: Create New Folder
  14. file: name={{ dir }} state=directory
  15. - name: Create New Folder
  16. shell: echo `hostname` > {{dir}}/{{ file }}
  17. [root@Centos7T Ansible]#ansible-playbook playbook.yml
  18. PLAY [websvr] ************************************************************************
  19. TASK [Gathering Facts] ***************************************************************
  20. ok: [192.168.25.80]
  21. ok: [192.168.25.51]
  22. TASK [Create New Folder] *************************************************************
  23. changed: [192.168.25.51]
  24. changed: [192.168.25.80]
  25. TASK [Create New Folder] *************************************************************
  26. changed: [192.168.25.51]
  27. changed: [192.168.25.80]
  28. PLAY RECAP ***************************************************************************
  29. 192.168.25.51 : ok=3 changed=2 unreachable=0 failed=0
  30. 192.168.25.80 : ok=3 changed=2 unreachable=0 failed=0

执行结果如下:

  1. 节点1
  2. [root@node1 ~]#
  3. [root@node1 ~]#ls node1/hostname.txt
  4. node1/hostname.txt
  5. [root@node1 ~]#cat node1/hostname.txt
  6. node1.test.com
  7. 节点2
  8. [root@node2 ~]#ls node2/hostname.txt
  9. node2/hostname.txt
  10. [root@node2 ~]#cat node2/hostname.txt
  11. node2.test.com

4 通过roles角色定义变量

AnsibleRoles中定义变量,需要将变量及值的键值对形式写到rolesvars目录下的main.yml文件中,同样适用YAML语言格式,格式如下:

  1. var1: value1
  2. var2: value2
  3. var3: value3

通过Roles定义的变量只适用于当前 Roles,示例如下:

  1. [root@Centos7T roles]#tree test/ #Roles文件组织结构
  2. test/
  3. ├── files
  4. ├── handlers
  5. ├── playbook.retry
  6. ├── playbook.yml
  7. ├── tasks
  8. └── main.yml
  9. ├── templates
  10. └── vars
  11. └── main.yml
  12. 5 directories, 4 files
  13. [root@Centos7T roles]#cat test/tasks/main.yml #任务文件
  14. - name: Get IP Address
  15. shell: echo `{{ cmd }}` >> {{ dir }}/{{ file }}
  16. [root@Centos7T roles]#cat test/vars/main.yml #定义变量cmd
  17. cmd: hostname -I
  18. [root@Centos7T roles]#cat test/playbook.yml
  19. - hosts: websvr
  20. remote_user: root
  21. roles:
  22. - test
  23. [root@Centos7T test]#ansible-playbook playbook.yml #playbook文件调用Roles
  24. PLAY [websvr] ************************************************************************
  25. TASK [Gathering Facts] ***************************************************************
  26. ok: [192.168.25.80]
  27. ok: [192.168.25.51]
  28. TASK [test : Get IP Address] *********************************************************
  29. changed: [192.168.25.51]
  30. changed: [192.168.25.80]
  31. PLAY RECAP ***************************************************************************
  32. 192.168.25.51 : ok=2 changed=1 unreachable=0 failed=0
  33. 192.168.25.80 : ok=2 changed=1 unreachable=0 failed=0

测试结果如下:

  1. 节点1
  2. [root@node1 ~]#cat node1/hostname.txt
  3. node1.test.com
  4. 172.18.42.80 192.168.25.80 192.168.122.1
  5. 节点2
  6. [root@node2 ~]#cat node2/hostname.txt
  7. node2.test.com
  8. 192.168.25.51 172.18.42.51

至此,Ansible的自定义变量接简单介绍到这里。