博客
关于我
Ansible 剧本变量 -01
阅读量:556 次
发布时间:2019-03-09

本文共 3287 字,大约阅读时间需要 10 分钟。

Ansible 剧本变量

一、变量的介绍

1. 概述

在Ansible的-playbook中,变量为管理动态值提供了便捷的方式。例如,若在多处反复使用nginx-1.6.3这样的软件包版本,可以将其设置为变量,在其他playbook中调用,便于维护且减少维护成本。

2. 定义变量的方式

定义变量可通过以下方式进行:

  • 命令行定义

    使用-e选项在命令行指定变量值。

  • 在-playbook文件中定义

    在任务模块下或在vars块中定义变量,例如:

    vars:  packages:    - tree

    备注:模块下的变量仅适用于该模块的任务。

  • 通过Inventory主机清单定义

    在主机清单的组或整合组中定义变量,如[db_server:vars]web=httpd,只能在该组使用该变量。

  • 通过vars_file定义

    在vars_file中定义变量,便于多个playbook共享。例如:

    vars_files:  - ./vars.yml
  • 通过host_vars和group_vars定义

    创建host_vars和group_vars目录,分别在主机名称和主机组名称下存放变量文件。例如:

    mkdir host_vars group_vars

    确保文件名与主机清单中的主机名或组名一致。

  • 3. 变量的优先级

    在不同定义方式中若变量冲突,其优先级顺序为:

    1. 命令行定义 > 2. playbook文件定义 > 3. Inventory主机清单定义 > 4. vars_file定义 > 5. host_vars和group_vars定义

    变量命名规则:变量名以字母开头,允许字母、数字和下划线。

    二、变量的定义

    1. 在-playbook文件中定义变量

    可以在任务模块下或在vars块中定义变量。

    方式一:在模块下定义变量

    tasks:  - name: install tree server    yum:      name: "{packages}"    vars:      packages:        - tree

    方式二:在hosts下定义变量

    hosts: nfs_groupvars:  packages:    - treetasks:  - name: install tree server    yum:      name: "{packages}"    vars:      packages:        - tree

    注意事项:

  • 模块下定义变量仅在该模块使用。
  • hosts下定义变量只对该主机组生效。
  • 2. 通过vars_file定义变量

    在多个playbook中共享变量,例如:

    vars_files:  - ./vars.yml

    变量文件示例:

    web: httpddb: tree

    通过vars_file调用的示例:

    hosts: nfs_groupvars_files:  - /root/vars.ymltasks:  - name: Installed http Server    yum: name: "{web}"

    三、通过Inventory主机清单定义变量

    主机清单中定义变量优先级高于整合组。

    配置主机清单:

    vim /etc/ansible/hosts[db_server]db01 ansible_ssh_pass='123'[db_server:vars]web=httpd

    调用示例:

    hosts: db_servertasks:  - name: Touch File    file: path: /tmp/{web} state: touch

    注意事项:

  • 主机清单中的变量仅对该主机组有效。
  • 主机定义的变量优先级高于主机组定义的变量。
  • 四、通过hosts_vars和group_vars定义变量

    在Ansible项目目录下创建host_vars和group_vars目录:

    mkdir host_vars group_vars

    主机组定义变量:

    vim group_vars/web_grouppackages: []file: group_vars

    主机定义变量:

    vim host_vars/web01file: host_vars

    调用示例:

    hosts: web_groupvars_files: group_varstasks:  - name: Touch File    file: path: /tmp/{file} state: directory

    五、命令行定义变量

    通过-e选项在命令行指定变量:

    ansible-playbook test.yml -e "file=minglinghang"

    指定多个变量:

    ansible-playbook test.yml -e "file=command" -e "file2=command2"

    六、直接使用内置变量

    查看内置变量:

    ansible 'web_group' -m setup

    示例:创建时间备份目录:

    - hosts: nfs_group  tasks:    - name: Touch File      file: path: /backup/{ansible_fqdn}_{ansible_eth1.ipv4.address}_{ansible_date_time.date} state: directory

    七、内置变量常用方式

    配置文件生成:

    vim /etc/redis.confbind {ansible_eth1.ipv4.address}

    playbook示例:

    hosts: web_grouptasks:  - name: install redis server    yum: name: redis  - name: config redis    template: src: /root/mm/redis.conf dest: /etc/

    八、变量注册

    使用ad-hoc模式获取返回结果:

    ansible web01 -m shell -a 'df -h' web01 | success | rc=0 >> output.log

    注册变量示例:

    - name: Touch File  shell: "df -h"  register: get_dir_list- name: Get Register  debug: msg: "{get_dir_list}"

    九、变量注册的常见场景

    例如,检查PHP安装状态并自动安装:

    - name: Tar php Package  unarchive: src: /root/package/php.tar.gz dest: /tmp/- name: Check php Install Status  shell: "rpm -qa | grep php | wc -l" register: get_php_instll_status- name: Install php Server  shell: "yum localinstall -y /tmp/*.rpm" when: get_php_instll_status.stdout_lines == 0

    十、facts缓存

    获取主机信息并生成配置文件:

    vim /etc/redis.confbind {ansible_eth1.ipv4.address}

    关闭facts缓存(仅使用内置变量时关闭):

    - hosts: web_group  gather_facts: no  tasks:    - name: redis server install      yum: name: redis state: present

    广泛应用场景:

  • 根据主机CPU和内存生成Nginx配置文件。
  • 根据主机名生成Redis配置文件。
  • 根据物理机内存生成MySQL配置文件。
  • 转载地址:http://hausz.baihongyu.com/

    你可能感兴趣的文章
    python:从列表中创建元组列表
    查看>>
    Python:从嵌套列表中删除重复项
    查看>>
    Python:从间隔映射到值
    查看>>
    Python:使用 shell=False 的子进程调用不起作用
    查看>>
    Python:修改 PATH 环境变量的平台无关方式
    查看>>
    Python:假与 0
    查看>>
    Python:函数使用
    查看>>
    Python:函数进阶
    查看>>
    Python:在整数的二进制表示中查找最长的二进制间隙
    查看>>
    Python:如何从二进制转换为 base 64 并返回?
    查看>>
    Python:如何以非阻塞方式读取子进程的标准输出
    查看>>
    Python:如何使用 plotly 制作阴影区域或交替背景颜色?
    查看>>
    Python:如何根据日期时间获取值的计数
    查看>>
    python:如何检测串行 COM 上的设备名称/ID
    查看>>
    Python:如何模拟 datetime.utcnow()?
    查看>>
    Python:如果DataFrames之间的其他值匹配,则对DataFrame中的值求和
    查看>>
    Python:字典思维
    查看>>
    Python:将 HEX 字符串转换为字节
    查看>>
    Python:将列表与范围列表合并
    查看>>
    Python:将列表列表初始化为一定大小,
    查看>>