Ansible中自定义变量的使用,ansible自定义变量


Ansible中自定义变量的使用

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

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

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

1 通过命令行定义变量

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

ansile-playbook -e "var_name=value" playbook

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

[root@Centos7T Ansible]#cat playbook.yml
- hosts: node1
  remote_user: root
  tasks:
    - name: Dispaly Welcome Infromation
      shell: echo {{ var }}

[root@Centos7T Ansible]#ansible-playbook -e "var='Welcome to Ansible'" playbook.yml
PLAY [node1] *************************************************************************

TASK [Gathering Facts] ***************************************************************
ok: [192.168.25.80]

TASK [Dispaly Welcome Infromation] ***************************************************
changed: [192.168.25.80]

PLAY RECAP ***************************************************************************
192.168.25.80              : ok=2    changed=1    unreachable=0    failed=0

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

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

2 在playbook中定义变量

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

vars:
  - var1: value1
  - var2: value2
  - var3: value3
…… ……

示例如下:

[root@Centos7T Ansible]#cat playbook.yml
- hosts: node1
  remote_user: root
  vars:
    - dir1: /root/Ansible
    - dir2: /root/Ansible/test1
    - dir3: /root/Ansible/test2
  tasks:
    - name: Create New Folder
      file: name={{ dir1 }} state=directory
    - name: Create New Folder
      file: name={{ dir2 }} state=directory
    - name: Create New Folder
      file: name={{ dir3 }} state=directory

[root@Centos7T Ansible]#ansible-playbook playbook.yml    

PLAY [node1] *************************************************************************

TASK [Gathering Facts] ***************************************************************
ok: [192.168.25.80]

TASK [Create New Folder] *************************************************************
changed: [192.168.25.80]

TASK [Create New Folder] *************************************************************
changed: [192.168.25.80]

TASK [Create New Folder] *************************************************************
changed: [192.168.25.80]

PLAY RECAP ***************************************************************************
192.168.25.80              : ok=4    changed=3    unreachable=0    failed=0  

node1上的执行结果如下:

[root@node1 ~]#tree Ansible/   
Ansible/
├── test1
└── test2

2 directories, 0 files

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

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

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

示例如下:

[root@Centos7T Ansible]#tail -n 10 /etc/ansible/hosts

[websvr]
192.168.25.51 dir=/root/node2
192.168.25.80 dir=/root/node1

[node1]
192.168.25.80

[websvr:vars]
file=hostname.txt

[root@Centos7T Ansible]#cat playbook.yml
- hosts: websvr
  remote_user: root
  tasks:
    - name: Create New Folder
      file: name={{ dir }} state=directory
    - name: Create New Folder
      shell: echo `hostname` > {{dir}}/{{ file }}

[root@Centos7T Ansible]#ansible-playbook playbook.yml    

PLAY [websvr] ************************************************************************

TASK [Gathering Facts] ***************************************************************
ok: [192.168.25.80]
ok: [192.168.25.51]

TASK [Create New Folder] *************************************************************
changed: [192.168.25.51]
changed: [192.168.25.80]

TASK [Create New Folder] *************************************************************
changed: [192.168.25.51]
changed: [192.168.25.80]

PLAY RECAP ***************************************************************************
192.168.25.51              : ok=3    changed=2    unreachable=0    failed=0   
192.168.25.80              : ok=3    changed=2    unreachable=0    failed=0   

执行结果如下:

节点1:
[root@node1 ~]#
[root@node1 ~]#ls node1/hostname.txt
node1/hostname.txt
[root@node1 ~]#cat node1/hostname.txt
node1.test.com

节点2:
[root@node2 ~]#ls node2/hostname.txt
node2/hostname.txt
[root@node2 ~]#cat node2/hostname.txt
node2.test.com

4 通过roles角色定义变量

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

var1: value1
var2: value2
var3: value3

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

[root@Centos7T roles]#tree test/                      #Roles文件组织结构
test/
├── files
├── handlers
├── playbook.retry
├── playbook.yml
├── tasks
│   └── main.yml
├── templates
└── vars
    └── main.yml

5 directories, 4 files
[root@Centos7T roles]#cat test/tasks/main.yml         #任务文件
- name: Get IP Address
  shell: echo `{{ cmd }}` >> {{ dir }}/{{ file }}

[root@Centos7T roles]#cat test/vars/main.yml          #定义变量cmd
cmd: hostname -I
[root@Centos7T roles]#cat test/playbook.yml
- hosts: websvr
  remote_user: root
  roles:
    - test

[root@Centos7T test]#ansible-playbook playbook.yml    #playbook文件调用Roles

PLAY [websvr] ************************************************************************

TASK [Gathering Facts] ***************************************************************
ok: [192.168.25.80]
ok: [192.168.25.51]

TASK [test : Get IP Address] *********************************************************
changed: [192.168.25.51]
changed: [192.168.25.80]

PLAY RECAP ***************************************************************************
192.168.25.51              : ok=2    changed=1    unreachable=0    failed=0   
192.168.25.80              : ok=2    changed=1    unreachable=0    failed=0   

测试结果如下:

节点1:
[root@node1 ~]#cat node1/hostname.txt
node1.test.com
172.18.42.80 192.168.25.80 192.168.122.1
节点2:
[root@node2 ~]#cat node2/hostname.txt
node2.test.com
192.168.25.51 172.18.42.51

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

相关内容

    暂无相关文章