Ansible#全局变量、剧本变量、资产变量、Facts变量

一、Ansible变量介绍

我们在PlayBook一节中,将PlayBook类比成了Linux中的shell。那么它作为一门Ansible特殊的语言,肯定要涉及到变量定义、控制结构的使用等特性。在这一节中主要讨论变量的定义和使用

二、变量命名规则

变量的名字由字母、下划线和数字组成,必须以字母开头
  保留关键字不能作为变量名称

三、变量类型:全局变量、剧本变量、资产变量

1、全局变量

手动通过 -e 参数传递给Ansible 的全局变量
  全局变量,是我们使用ansible 或使用ansible-playbook 时,手动通过 -e 参数传递给Ansible 的变量。通过ansible 或 ansible-playbook 的 help 帮助, 可以获取具体格式使用方式
  ansible --help | grep var
  ansible-playbook --help | grep var
  ansible 10.11.67.19 -i hosts -m debug -a “msg=‘i love {{var}}’” -e “var=chenzhiqing”

-e 全局变量写在文件里面,用 -e 传递文件
  传递一个YAML/JSON 的形式(注意不管是YAML还是JSON,它们的最终格式一定要是一个字典)
  json必须双引号
  playbook中的变量用双引号

# cat a.json
  {“user”:" qfedu",“type”:" school"}
  ansible all -i localhost, -m debug -a “msg=‘user is {{ name }}, type is {{ type }}’” -e @a.json
 
  # cat a.yml
  —
  name: qfedu
  type: school
  …
  # ansible all -i localhost, -m debug -a “msg=‘name is {{ name }}, type is {{ type }}’” -e @a.yml

2、剧本变量

playbook属性vars定义剧本变量
  —
  - name: test play vars
  hosts: all
  vars:
  user: lilei
  home: /home/lilei
  tasks:
  - name: create the user {{ user }}
  user:
  name: “{{ user }}”
  home: “{{ home }}”

playbook属性vars_files定义剧本变量
  当通过vars属性定义的变量很多时,这个Play就会感觉特别臃肿。此时我们可以将变量单独从Play中抽离出来,形成单独的YAML 文件
  —
  - name: create new user
  hosts: web_server
  remote_user: root
  vars_files:
  - /home/kakaops/ansible/vars/users.yaml
  tasks:
  - name: create “{{ user }}”
  user:
  name: “{{ user }}”
  home: “{{ home }}”

剧本变量的使用 “{{ vars }}” 格式
  PlayBook 是YAML 的文件格式, 当Ansible 分析YAML 文件时,变量如果不加上引号,有可能会误解为name: {{ user }} 是一个字典的开始。因此加针对变量的使用,加上了双引号,避免Ansible错误解析。msg中的变量不用引号直接{{ vars }}即可

3、资产变量

在第二章中我们学习了资产。资产共分为静态资产和动态资产。这一节中学习的资产变量,就是和资产紧密相关的一种变量。
  资产变量分为主机变量、组变量、父变量,分别针对资产中的单个主机和组

主机变量
  以下资产中,定义了一个主机变量 lilei ,此变量只针对 172.18.0.3 这台服务器有效
  [web_servers]
  172.18.0.3 user=lilei
  172.18.0.4

主机组变量

以下资产中,定义了一个组变量home ,此变量将针对web_servers 这个主机组中的所有服务器有效
  [web_servers]
  172.18.0.3 user=lilei
  172.18.0.4

[web_servers:vars]
  home="/home/lilei"

主机变量 VS 组变量
  主机变量 > 组变量

变量的继承
  在资产继承的同时,对应的变量也发生了继承
  [web_servers]
  10.11.67.19

[db_servers]
  10.11.67.85

[all_servers]
  [all_servers:children]
  web_servers

[all_servers:vars]
  user=sunlizhen
 
  主机变量>组变量>父组变量
  
  Inventory 内置变量的说明
  在/etc/ansible/hosts里面定义内置变量
  内置变量几乎都是以 ansible_ 为前缀
  ansible_ssh_host:将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置
  ansible_ssh_port:ssh端口号.如果不是默认的端口号,通过此变量设置
  ansible_ssh_user:默认的 ssh 用户名,远程被管理资源的用户
  ansible_ssh_pass:ssh 密码(这种方式并不安全,官方强烈建议使用 --ask-pass 或 SSH 密钥)
  ansible_sudo_pass:sudo 密码(这种方式并不安全,官方强烈建议使用 --ask-sudo-pass)
  ansible_sudo_exe (new in version 1.8):sudo 命令路径(适用于1.8及以上版本)
  ansible_ssh_private_key_file:ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
  ansible_python_interpreter:目标主机的 python 路径.适用于的情况:
  系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 /usr/local/bin/python3

4、Facts变量

Facts变量不包含在前文中介绍的全局变量、剧本变量及资产变量之内
  Facts变量不需要我们人为去声明变量名及赋值
  它的声明和赋值完全由Ansible 中的Facts模块帮我们完成
  类似于资产变量中的主机变量,它收集了有关被管理服务器的
  操作系统的版本、服务器的IP地址、主机名,磁盘的使用情况、CPU个数、内存大小
  等等有关被管理服务器的私有信息
  在每次PlayBook运行的时候都会发现在PlayBook执行前都会有一个Gathering Facts的过程
  这个过程就是收集被管理服务器的Facts信息过程

手动收集本机Facts变量(-c指定连接类型)
  ansible all -i localhost, -c local -m setup

过滤Facts变量
  通过刚刚的手动收集Facts,我们发现facts 信息量很大
  能不能有针对性的显示我们想要的信息呢?  
  可以通过使用Facts 模块中的filter参数去过滤我们想要的信息

仅获取服务器的内存情况信息(memory
  ansible 10.11.67.19 -i hosts -m setup -a “filter=memory
  仅获取服务器的磁盘挂载情况
  ansible 10.11.67.19 -i hosts -m setup -a “filter=mount

Playbook中使用Facts变量
  默认情况下,在执行PlayBook的时候,它会去自动的获取每台被管理服务器的facts信息,可以像使用其他变量一样,去使用facts 变量
  —
  - name: print facts variable
  hosts: all
  tasks:
  - name: print facts variable
  debug:
  msg: “The default IPV4 address is {{ ansible_default_ipv4.address }}”

在PlayBook中去关闭Facts 变量的获取
  gather_facts: no
  若在整个PlayBook 的执行过程中,完全未使用过Facts 变量,此时我们可以将其关闭,以加快PlayBook的执行速度
  —
  - name: a play example
  hosts: all
  # 关闭 facts 变量收集功能
  gather_facts: no
  remote_user: root
  tasks:

5、注册变量

注册变量往往用于保存一个task任务的执行结果, 以便于debug时使用
  或者将此次task任务的结果作为条件,去判断是否去执行其他task任务
  注册变量在PlayBook中通过register关键字去实现。
  —
  - name: install a package and print the result
  hosts: all
  remote_user: root
   tasks:
  - name: install nginx package
  yum: name=nginx state=present
  register: install_result
  - name: print result
   debug: var=install_result

6、变量的优先级

当一个变量同时在全局变量、剧本变量和资产变量中定义时,优先级最高的是全局变量;其次是剧本变量;最后才是资产变量。

全局>剧本>资产(主机>组>父组)

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值