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 形式语句,即可。格式如下

[webserver]
172.16.1.10 ansible_ssh_user=root inventory_host_var="Host_vars"
172.16.1.20 ansible_ssh_user=root

1.2定义清单组变量,格式如下。

[webserver:vars]
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
  var_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、执行
[172.16.1.10~]# 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。

[172.16.1.10]# vim /etc/ansible/facts.d/local.fact  #编辑自定义facts文件
[general]
Aheahe=aihe
local="Local facts"
[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变量。

vim roles/test/templates/1.j2   #使用刚才的角色
{{ role_vars_var }}
{{ role_defaults_var }}
{{ ansible_local.local.general.local }}
ansible-playbook site.yml   #执行刚才的site.yml
[172.16.1.10 -]# 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 }}

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  #执行
[root@node1]# cat /root/var.conf     #这里可以看到node2使用node1的变量。
node1   #这里是使用fact变量,两个主机的结果不一样
node1  #这里两台主机的结果一样,node2使用node1的变量

四、变量的优先级。处理同一个变量名多处定义的问题。

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系列的版本中调整变量优先级的顺序为如下。优先级由低到高

  1. role defaults 

  2. inventory vars 

  3. inventory group_vars

  4. inventory host_vars

  5. playbook group_vars

  6. playbook host_vars

  7. host facts

  8. registered vars

  9. set_facts

  10. play vars

  11. play vars_prompt

  12. play vars_files

  13. role and include vars

  14. block vars (only for tasks in block)

  15. task vars (only for the task)

  16. extra vars


参考:

http://docs.ansible.com/ansible/playbooks_variables.html

原创文章,作者:艾贺,如若转载,请注明出处:http://www.178linux.com/9431

(0)
艾贺艾贺
上一篇 2015-11-26 16:41
下一篇 2015-11-26 17:26

相关推荐

  • Linux学习 Grep详则。

    grep 功能说明:查找文件里符合条件的字符串。 语  法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][–help][范本样式][文件或目录&…

    Linux干货 2017-07-24
  • 第三周课堂练习

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@myserver ~]# whoami  root  [root@myserver ~]# who | cut -d' ' -…

    Linux干货 2016-09-19
  • LAMP的编译安装

    一、编译安装amp: (1)系统环境:centos6,7 httpd依赖于apr和apr-util appache protable runtime (2)开发环境: Development Tools,Server Platform Development (3)各程序的版本: httpd:2.2,2.4 php:5.x mysql:5.1,5.5,5.6…

    Linux干货 2016-10-17
  • 文本处理三剑客之一的sed

    处理文本的工具sed Stream EDitor, 行编辑器 sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Se…

    Linux干货 2017-04-27
  • 马哥教育-第二周作业

    问题一:文件管理类命令 常规命令:mkdir、rmdir、stat、touch、copy、mv、rm (1).mkdir  创建目录: 注意:路径基名方为命令的作用对象;基名之前的路径必须得存在; -p:自动按需创建父目录; -v:显示创建过程; -m 参数:直接给定所需权限; 例子:问题:创建 /tmp/x ; /tmp/x/y1 ; /tmp/…

    Linux干货 2016-12-11
  • 高级文件系统的管理

    一、迁移分区 分区 /dev/sda6 注意同步问题  创建分区,把原先家目录下的文件拷贝到新挂载的文件中 mkfs.ext4 /dev/sda6  mkdir /mnt/home mount /dev/sda6 /mnt/home cp -a /home/*  /mnt/home   init 1 切换单用户模式,把…

    Linux干货 2016-11-27