Ansible(三)如何使用变量

使用变量可以简化操作,除此之外,ansible还提供了变量可以用来获取被控主机上的信息

普通变量

变量名称要求

变量名称中不能有空格,也不能有下划线(_)以外的其他字符

如何引用变量

tasks中引用变量,需要使用{{}}将变量括起来,注意在变量名称前后都有空格
当变量名称在行首出现时,还需要使用双引号""将整行括起来
在某些特殊情况下,也可不使用{{}},例如在when条件中,或者在debug模块的var选项中

vars: 
 user: joe
tasks:
 - name: use variables 
   user:
   name: "{{ user }}"
 - name: use variables in debug
   debug:
     var: user

变量的作用范围

当同一个变量名在不同级别都出现时,使用优先级最高的变量值

  • 全局变量
    一般在命令行中进行定义,对命令中的所有play生效,优先级最高
    ansible -e "user=root" -e "passwd=123"

  • play级别的变量
    play中进行定义,只对指定的play生效,优先级低于全局变量,高于主机级别的变量
---
- name: a play
  vars:
    - user: root
  • 主机级别的变量
    inventory文件或者指定的变量文件中定义,对相关的主机/主机组生效。优先级最低。

    • inventory文件中进行定义

      # 主机级别的变量 直接将变量写在主机的后面
      servera user=root
      # 主机组级别的变量,使用[group:vars]进行定义
      [servers]
      servera
      serverb
      [servers:vars]
      user=root
    • 在变量文件中进行定义
      ansible会自动在当前目录下寻找变量文件,主机变量文件在hostvars目录中,主机组变量文件在groups_vars中。
      在指定目录中创建与inventory中定义的主机/主机组同名的文件,文件中的变量会应用于对应的主机/主机组

变量矩阵

如果一个变量的值是一个列表,列表中的值还是一个列表,那么就称之为变量矩阵,类似python中的字典嵌套字典

定义方式

users:
  bjones:
    first_name: Bob
    last_name: Jones
  acook:
    first_name: Anne
    last_name: Cook

调用方式

可以使用类似于python中字典的方式调用
users['bjones']['first_name']
也可以用以下方式调用
users.bjones.first_name
建议使用第一种方式,当变量名称中包含关键字时,第二种方式可能会出现错误

几种特殊的变量

register变量

可以在playbook运行的过程中,将task的运行结果赋予给某个变量,在后续的task中进行输出,或者根据结果执行不同的操作

# 示例,输出MySQL从库的同步状态
 - name: get slave status
   mysql_replication:
    login_user: root
    login_password: "{{ mysql_root_password }}"
    login_unix_socket: "{{ mysql_datadir }}/mysql.sock"
    login_port: "{{ mysql_port }}"
    mode: getslave
   register: slave_status

 - name: print slave status
   debug:
    msg: "Slave_IO: {{ slave_status.Slave_IO_Running }},Slave_SQL: {{ slave_status.Slave_SQL_Running }}"

facts变量

ansible在执行playbook时,默认会收集被控主机的信息,这些信息保存在facts变量中,以便根据被控主机信息的不同来执行不同的操作。

关闭playbook中的变量收集

---
- hosts: all
  gather_facts: no

使用adhoc收集facts变量

ansible all -m setup

facts变量内容

facts变量是以json格式保存的被控主机的信息,默认包括IP、主机名、磁盘、挂载、CPU、内存等信息
要查询所有facts变量内容,可以使用ansible node1 -m setup > setup.json将变量保存到文件中进行查看

常用facts变量

  • IPV4地址 ansible_default_ipv4['address']
  • 主机名 ansible_hostname
  • 内存 ansible_memtotal_mb
  • 磁盘信息 ansible_devices
  • 挂载信息 ansible_mounts

    自定义facts变量

    默认情况下,setup模块会从被控节点主机上的/etc/ansible/facts.d文件夹中获取用户定义变量。文件或者脚本以.fact结尾

# 自定义fact文件
# cat custom.fact 
[general]
package = httpd
service = httpd
state = started
enabled = true
# 调用自定义fact变量
# cat playbook.yml 
---
- name: Install Apache and starts the service
  hosts: webserver
  tasks:
    - name: Install the required package
      yum:
        name: "{{ ansible_facts['ansible_local']['custom']['general']['package'] }}"
        state: latest
    - name: Start the service
      service:
        name: "{{ ansible_facts['ansible_local']['custom']['general']['service'] }}"
        state: "{{ ansible_facts['ansible_local']['custom']['general']['state'] }}"
        enabled: "{{ ansible_facts['ansible_local']['custom']['general']['enabled'] }}"

magic变量

magic变量是本机的内容,包括inventory文件中的内容

---
- hosts: localhost
  tasks:
   - name: print magic variables
     debug:
       var: hostvars['localhost']

猜你喜欢

转载自blog.51cto.com/13540167/2607068