设为首页 收藏本站
查看: 1572|回复: 0

[经验分享] Ansible Variable

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-20 10:21:25 | 显示全部楼层 |阅读模式
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 形式语句,即可。格式如下
1
2
3
[webserver]
172.16.1.10 ansible_ssh_user=root inventory_host_var="Host_vars"
172.16.1.20 ansible_ssh_user=root



1.2定义清单组变量,格式如下。
1
2
[webserver:vars]
inventory_group_var="Group_vars"



1.3 可以根据对应的inventory创建文件,写入变量
1
2
3
4
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中定义变量
1
2
3
4
5
6
7
8
9
---
- 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中定义变量
1
mkdir roles/test/{vars,files,templates,tasks,defaults,handlers} -p  #创建role结构



1
2
3
vim roles/test/vars/main.yml     #1、编辑task文件
---
role_vars_var: Role_vars_var



1
2
3
vim roles/test/defaults/main.yml   #2、编辑默认变量文件
---
role_defaults_var: Role_default_var



1
2
3
4
vim roles/test/tasks/main.yml     #3、编辑roles var文件
---
- name: Learn role vars
  template: src=1.j2 dest=/root/1



1
2
3
vim roles/test/templates/1.j2    #4、编辑模板文件
{{ role_vars_var }}
{{ role_defaults_var }}



1
2
3
4
5
vim site.yml                   #5、编辑执行文件
---
- hosts: 172.16.1.10
  roles:
  - /home/aheahe/roles/test



1
ansible-playbook site.yml   #6、执行



1
2
3
4
[172.16.1.10~]# cat 1    #7、在被管理节点上查看结果
  
Role_vars_var
Role_default_var



Tip:在引用role的时候,还可以传递变量给role
1
2
3
4
- hosts: webservers
  roles:
   - common
   - {  role: test, role_defaults_var: 'var_value'  }





4、自定义Facts变量。
如果在被管理的主机上存在/etc/ansible/facts.d 目录,其中的以.fact 为文件结尾的JSON格式或者YML格式文件都会当做自定义facts。
1
2
3
4
[172.16.1.10]# vim /etc/ansible/facts.d/local.fact  #编辑自定义facts文件
[general]
Aheahe=aihe
local="Local facts"



1
2
3
4
5
6
7
8
9
10
11
12
13
14
[ansible ~]$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变量。
1
2
3
4
vim roles/test/templates/1.j2   #使用刚才的角色
{{ role_vars_var }}
{{ role_defaults_var }}
{{ ansible_local.local.general.local }}



1
ansible-playbook site.yml   #执行刚才的site.yml



1
2
3
4
[172.16.1.10 -]# cat /root/1    #被管理节点查看结果,显示正确
Role_vars_var
Role_default_var
"Local facts"



4.1这里还可以在控制节点上面传递自定义变量到被管理节点,编辑如下ymal格式文件。
1
2
3
4
5
6
7
8
- 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 关键字即可定义变量
1
2
3
4
5
6
7
8
9
10
11
12
13
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



1
ansible-playbook study.yml -v   #执行的时候加上-v 选项。查看输出信息






6、从命令行传递变量.
相信这点对大家来说已经不成问题了,便不再细说
1
2
3
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文件里面使用变量

1
2
3
vim var.j2
{{ ansible_hostname  }}   #这里是使用fact变量,两个主机的结果不一样
{{ hostvars['172.16.1.10']['ansible_hostname'] }}  #这里两台主机的结果一样,node2>使用node1的变量



1
2
3
4
5
6
vim test.yml   #提供剧本
---
- hosts: webserver
  tasks:
  - name: Use fact and other host vars
    template: src=/home/aheahe/playbook/var.j2 dest=/root/var.conf



1
ansible-playbook test.yml  #执行



1
2
3
[iyunv@node1]# cat /root/var.conf     #这里可以看到node2使用node1的变量。
node1   #这里是使用fact变量,两个主机的结果不一样
node1  #这里两台主机的结果一样,node2使用node1的变量



2、在task里面使用变量。
1
2
3
tasks:
  - name: create a virtual host file for{{ vhost }}     #假设已经定义vhost变量
    template: src=somefile.j2dest=/etc/httpd/conf.d/{{ vhost }}






四、变量的优先级。处理同一个变量名多处定义的问题。
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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-141429-1-1.html 上篇帖子: Ansible之简单使用 下篇帖子: Ansible-PlayBook的roles和Include
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表