Rainie999 发表于 2018-7-30 11:19:40

Ansible Variable

  Ansible变量
  系统自动化让重复的工作变得更加容易,但是每个系统还是有一些细微的差别,变量就是如何处理系统之间的不同之处。这里将会列出变量的极大部分使用方法。
  本文假设:你已经知道如何使用Ansible。知道inventory,facts等概念。
  Ansible定义变量的几中方式
  1、在清单(inventory)中定义变量
  2、在playbook中定义变量,使用var,或var_files:
  3、在role中定义变量
  4、自定义facts的变量
  5、Register facts ,使用task返回结果作为变量
  6、从命令行传递变量
  使用变量,除了可用使用自定义的变量,还可以使用facts和其它主机的变量。
  一、合法变量名
  1、必须是字符,数字,下划线组成,变量必须以字符开头。
  2、变量支持字典形式的映射。
  3、有时候引用变量,使用小数点形式的引用方法可能会和Python内置的属性和方法冲突。建议使用[]形式。
  二、开始定义与使用变量
  1、清单(inventory)变量
  1.1定义清单主机变量.在对应的主机后面,提供key=value 形式语句,即可。格式如下
  
172.16.1.10 ansible_ssh_user=root inventory_host_var="Host_vars"
  
172.16.1.20 ansible_ssh_user=root
  1.2定义清单组变量,格式如下。
  
inventory_group_var="Group_vars"
  1.3 可以根据对应的inventory创建文件,写入变量
mkdir /etc/ansible/host_vars   #Ansible会默认读取此目录下对应的主机名文件  
mkdir /etc/ansible/group_vars    #同上
  
vim/etc/ansible/host_vars/all 或者 vim/etc/ansible/host_vars/hostname
  
vim /etc/ansible/group_vars/groupname
  在文件中写入变量即可。格式为ymal格式文件。
  2、在playbook中定义变量
---  
- hosts: hostname or groupname
  
vars:                     #playbook中定义变量的关键字
  
   playbook_var: Playbook_vars
  
vars_files:                  #使用变量文件
  
   - filename.yml
  
tasks:
  
- name: Copy Jinja2 file to remote host
  
    template: src=/home/aheahe/var_tu.j2 dest=/root/var.conf
  3、在role中定义变量
mkdir roles/test/{vars,files,templates,tasks,defaults,handlers} -p#创建role结构vim roles/test/vars/main.yml   #1、编辑task文件  
---
  
role_vars_var: Role_vars_var
vim roles/test/defaults/main.yml   #2、编辑默认变量文件  
---
  
role_defaults_var: Role_default_var
vim roles/test/tasks/main.yml   #3、编辑roles var文件  
---
  
- name: Learn role vars
  
template: src=1.j2 dest=/root/1
vim roles/test/templates/1.j2    #4、编辑模板文件  
{{ role_vars_var }}
  
{{ role_defaults_var }}
vim site.yml                   #5、编辑执行文件  
---
  
- hosts: 172.16.1.10
  
roles:
  
- /home/aheahe/roles/test
ansible-playbook site.yml   #6、执行# cat 1    #7、在被管理节点上查看结果  

  
Role_vars_var
  
Role_default_var
  Tip:在引用role的时候,还可以传递变量给role
- hosts: webservers  
roles:
  
   - common
  
   - {role: test, role_defaults_var: 'var_value'}
  4、自定义Facts变量。
  如果在被管理的主机上存在/etc/ansible/facts.d 目录,其中的以.fact 为文件结尾的JSON格式或者YML格式文件都会当做自定义facts。
# vim /etc/ansible/facts.d/local.fact#编辑自定义facts文件  

  
Aheahe=aihe
  
local="Local facts"
$ansible 172.16.1.10 -m setup -a 'filter=ansible_local'#在ansible控制节点查看自定义facts变量是否生效  
172.16.1.10 | success >> {
  
    "ansible_facts": {
  
      "ansible_local": {
  
            "local": {
  
                "general": {
  
                  "aheahe": "aihe",
  
                  "local": "\"Local facts\""
  
                }
  
            }
  
      }
  
    },
  
    "changed": false
  
}
  可以像fact一样使用,自定义的fact变量。
vim roles/test/templates/1.j2   #使用刚才的角色  
{{ role_vars_var }}
  
{{ role_defaults_var }}
  
{{ ansible_local.local.general.local }}
ansible-playbook site.yml   #执行刚才的site.yml# cat /root/1    #被管理节点查看结果,显示正确  
Role_vars_var
  
Role_default_var
  
"Local facts"
  4.1这里还可以在控制节点上面传递自定义变量到被管理节点,编辑如下ymal格式文件。
- hosts: webservers  
tasks:
  
    - name: create directory for ansible custom facts
  
      file: state=directory recurse=yes path=/etc/ansible/facts.d
  
    - name: install custom impi fact
  
      copy: src=ipmi.fact dest=/etc/ansible/facts.d
  
    - name: re-readfacts after adding custom fact
  
      setup: filter=ansible_local
  5、定义Register变量,
  Register变量是将task的结果信息当做变量使用。在任务的执行结果后面加上register 关键字即可定义变量
vim study.yml  
---
  
- hosts: 172.16.1.10
  
vars:
  
   playbook_var: Playbook_vars
  
tasks:
  
- name: Learn Register
  
    shell: ifconfig
  
    register: command_result
  

  
- name: Test register
  
    shell: date
  
    when: command_result.rc == 0
ansible-playbook study.yml -v   #执行的时候加上-v 选项。查看输出信息  
  6、从命令行传递变量.
  相信这点对大家来说已经不成问题了,便不再细说
ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"#传递key=value形式变量  
--extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}'#传递JSON格式变量
  
--extra-vars "@some_file.json"    #传递JSON格式文件变量
  三、使用变量
  上面在举例子的时候,已经说明如何使用了。下面介绍如何使用fact变量和一台主机使用另外一台主机的变量。
  使用实现定义好的变量,在变量两边加上大括号,格式为` var_name `
  1、在Jinja2文件里面使用变量
vim var.j2  
{{ ansible_hostname}}   #这里是使用fact变量,两个主机的结果不一样
  
{{ hostvars['172.16.1.10']['ansible_hostname'] }}#这里两台主机的结果一样,node2>使用node1的变量
vim test.yml   #提供剧本  
---
  
- hosts: webserver
  
tasks:
  
- name: Use fact and other host vars
  
    template: src=/home/aheahe/playbook/var.j2 dest=/root/var.conf
ansible-playbook test.yml#执行# cat /root/var.conf   #这里可以看到node2使用node1的变量。  
node1   #这里是使用fact变量,两个主机的结果不一样
  
node1#这里两台主机的结果一样,node2使用node1的变量
  2、在task里面使用变量。
tasks:  
- name: create a virtual host file for{{ vhost }}   #假设已经定义vhost变量
  
    template: src=somefile.j2dest=/etc/httpd/conf.d/{{ vhost }}
  四、变量范围
  Ansible主要活动在三个范围(Scope)


[*]  全局变量(Global): 通过配置文件,环境变量和命令行设置
[*]  剧本变量(Play): 每个play包含的使用vars,include_vars,定义的变量和role的defaults和vars目录下的变量
[*]  主机变量(Host): 直接分配给主机的变量,像inventory,facts或register task输出。
  五、变量的优先级。处理同一个变量名多处定义的问题。
  3.1、在1.x版本里面,越靠下优先级越高,可以覆盖上面的
  1、role defaults 中定义的变量,优先级最低
  2、从被管理系统中收集的facts信息
  3、inventory中定义的变量
  4、在playbook中的vars: 或者 roles 中的vars
  5、一些连接变量,例如ansible_user 。
  6、命令行的变量ansible-playbook -e 选项的变量, 优先级别最高。
  3.2 ,在2.x系列的版本中调整变量优先级的顺序为如下。优先级由低到高

[*]  role defaults
[*]  inventory vars
[*]  inventory group_vars
[*]  inventory host_vars
[*]  playbook group_vars
[*]  playbook host_vars
[*]  host facts
[*]  registered vars
[*]  set_facts
[*]  play vars
[*]  play vars_prompt
[*]  play vars_files
[*]  role and include vars
[*]  block vars (only for tasks in block)
[*]  task vars (only for the task)
[*]  extra vars
  参考:
  http://docs.ansible.com/ansible/playbooks_variables.html
页: [1]
查看完整版本: Ansible Variable