一、ansible变量介绍

1.概念

变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如nginx-1.6.3这个软件包的版本,在其它地方或许会反复使用,那么如果讲此值设置为变量,然后再在其他的playbook中调用,会方便许多。如此一来还方便维护,减少维护的成本。

2.定义变量的方式

1.通过命令行进行变量定义
2.在playbook文件中进行变量定义
3.通过Inventory主机信息文件中进行变量定义
4.通过vars_files的方式定义变量
5.通过host_vars和group_vars定义变量

二、变量的设置

1.在playbook文件中进行变量定义

1)方式一:在模块下面定义变量
- hosts: web_group
tasks:
   - name: ensure a list of packages installed
    yum:
      name: "{{ packages }}"
    vars:
      packages:
       - httpd
       - httpd-tools

   - name: remove server
    yum:
      name: "{{ packages }}"
      state: absent
    vars:
      packages:
       - httpd
       - httpd-tools

#问题:模块下定义变量,变量只在当前动作生效,到其他动作后变量需要重新定义
2)方式二:在hosts下面定义变量
- hosts: web_group
vars:
  packages:
   - httpd
   - httpd-tools
tasks:
   - name: ensure a list of packages installed
    yum:
      name: "{{ packages }}"

   - name:
    yum:
      name: "{{ packages }}"
      state: absent
3)方式三:在hosts下面定义多个变量
- hosts: web_group
vars:
  packages:
     - httpd
     - httpd-tools
  db:
     - mariadb-server
     - MySQL-python

tasks:
   - name: install web server
    yum:
      name: "{{ packages }}"

   - name: install mariadb-server
    yum:
      name: "{{ db }}"
       
#问题:变量卸载hosts下面,可以解决多个动作分别设置变量的问题,但是设置的变量只能在当前的playbook中使用,其他的playbook无法使用

2.使用vars_file定义变量

1)定义变量文件
[root@m01 ~]# vim vars.yml
web:
 - httpd
 - httpd-tools
db: mariadb-server
2)palybook调用变量文件
[root@m01 ~]# vim moudle_vars.yml 
- hosts: web_group
vars_files: /root/vars.yml
tasks:
   - name: install web server
    yum:
      name: "{{ web }}"
      state: absent

   - name: install mariadb-server
    yum:
      name: "{{ db }}"
      state: absent
3)添加变量文件
[root@m01 ~]# vim vars1.yml 
nfs:
 - nfs-utils
 - rpcbind
4)调用多个变量文件
[root@m01 ~]# vim moudle_vars.yml 
- hosts: web_group
vars_files:
   - /root/vars.yml
   - /root/vars1.yml
tasks:
   - name: install web server
    yum:
      name: "{{ web }}"

   - name: install mariadb-server
    yum:
      name: "{{ db }}"

   - name: install nfs server
    yum:
      name: "{{ nfs }}"

3.在Inventory中定义变量

1)主机清单中定义变量
[root@m01 ~]# vim /etc/ansible/hosts 
[web_group]
web01 ansible_ssh_pass='1'
web02 ansible_ssh_pass='1'
web03 ansible_ssh_pass='1'

......

[web_group:vars]
web=httpd
db=mariadb-server
2)调用变量
- hosts: web_group
tasks:
   - name: install web server
    yum:
      name: "{{ web }}"
      state: absent

   - name: install db server
    yum:
      name: "{{ db }}"

#问题:
1.主机清单定义变量,只能给某个组使用,如果所有主机都使用需要定义很多变量
2.主机清单内容很多的时候,配置变量会使文件变得太大
3)复合组定义变量
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_pass='1'
web02 ansible_ssh_pass='1'
web03 ansible_ssh_pass='1'

... ...

[nginx_group:children]
web_group
slb

[web_group:vars]
web=httpd
db=mariadb-server

[nginx_group:vars]
web=nginx
rsync=rsync
4)调用变量
[root@m01 ~]# vim mkdir.yml 
- hosts: nginx_group
tasks:
   - name: Mkdir dir
    file:
      path: /tmp/{{web}}
      state: directory

   - name: Mkdir dir
    file:
      path: /tmp/{{rsync}}
      state: directory
       
#执行结果
[root@m01 ~]# ansible-playbook mkdir.yml

[root@web01 ~]# ll /tmp/
total 0
drwxr-xr-x 2 root root 6 Sep 23 17:52 httpd
drwxr-xr-x 2 root root 6 Sep 23 17:52 rsync

[root@lb01 ~]# ll /tmp/
total 0
drwxr-xr-x 2 root root 6 Sep 23 17:52 nginx
drwxr-xr-x 2 root root 6 Sep 23 17:52 rsync

#结论:主机清单定义变量时,复合组定义的变量优先级低于主机组定义的

4.使用内置变量

1)直接使用内置变量
[root@m01 ~]# vim mkdir.yml 
- hosts: nginx_group
tasks:
   - name: Mkdir dir
    file:
      path: /backup/{{ansible_fqdn}}_{{ansible_eth1.ipv4.address}}_{{ansible_date_time.date}}
      state: directory
2)内置变量设置变量
[root@m01 ~]# vim mkdir.yml 
- hosts: nginx_group
vars:
   - remote_ip: "{{ansible_eth1.ipv4.address}}"
   - host: "{{ansible_fqdn}}"
   - date: "{{ansible_date_time.date}}"
tasks:
   - name: Mkdir dir
    file:
      path: /backup/{{remote_ip}}_{{host}}_{{date}}
      state: directory
3)内置变量常用方式
#编写配置文件
[root@m01 ~]# vim /root/conf/redis.conf
bind {{ansible_eth1.ipv4.address}}

#编写playbook
[root@m01 ~]# vim redis.yml
- hosts: web_group
tasks:
   - name: Install Redis Server
    yum:
      name: redis

   - name: Config Redis Server
    template:
      src: /root/conf/redis.conf
      dest: /etc/
       
#执行
[root@m01 ~]# ansible-playbook redis.yml

#查看结果
[root@web01 ~]# grep "^bind" /etc/redis.conf
bind "172.16.1.7"
[root@web02 ~]# grep "^bind" /etc/redis.conf
bind "172.16.1.8"
[root@web03 ~]# grep "^bind" /etc/redis.conf
bind "172.16.1.9"

5.通过host_vars和group_vars定义变量

之前的几种变量定义都不是很好用,比较好用的是在Ansible项目目录下创建两个变量目录:
host_vars
group_vars
切记,目录名字一定要一致,不能做任何修改。
1)主机组定义变量
1.创建主机组变量目录(名字一定是group_vars)
[root@m01 ~]# mkdir group_vars

2.主机组目录下创建变量文件(文件名字一定是主机清单中主机组的名字)
[root@m01 ~]# vim group_vars/web_group
web: httpd

3.调用变量
[root@m01 ~]# vim mkdir.yml
- hosts: web_group
tasks:
   - name: Mkdir dir
    file:
      path: /tmp/{{web}}
      state: directory
2)主机定义变量
1.创建主机变量目录(名字一定是host_vars)
[root@m01 ~]# mkdir host_vars

2.主机目录下创建变量文件(文件名字一定是主机清单中主机的名字)
[root@m01 ~]# vim host_vars/web01
web: web01_host_vars

3.调用变量
[root@m01 ~]# vim mkdir.yml
- hosts: web_group
tasks:
   - name: Mkdir dir
    file:
      path: /tmp/{{web}}
      state: directory
       
4.执行
[root@m01 ~]# ansible-playbook mkdir.yml

5.查看结果
[root@web01 ~]# ll /tmp
total 0
drwxr-xr-x 2 root root 6 Sep 23 18:57 web01_host_vars
[root@web02 ~]# ll /tmp
total 0
drwxr-xr-x 2 root root 6 Sep 23 18:57 httpd
[root@web03 ~]# ll /tmp
total 0
drwxr-xr-x 2 root root 6 Sep 23 18:57 httpd
3)测试
#1.配置主机清单
[root@m01 ~]# cat /etc/ansible/hosts
[web_group]
web01 ansible_ssh_pass='1'
web02 ansible_ssh_pass='1'
web03 ansible_ssh_pass='1'

[slb]
lb01 ansible_ssh_pass='1'

[nginx_group:children]
web_group
slb

#2.配置变量
[root@m01 ~]# cat group_vars/nginx_group
web: nginx_group
[root@m01 ~]# cat group_vars/web_group
web: web_group
[root@m01 ~]# cat host_vars/web01
web: web01_host_vars

#3.调用变量
[root@m01 ~]# vim mkdir.yml
- hosts: nginx_group
tasks:
   - name: Mkdir dir
    file:
      path: /tmp/{{web}}
      state: directory
       
#4.执行
[root@m01 ~]# ansible-playbook mkdir.yml

#5.查看结果
[root@lb01 ~]# ll /tmp/
drwxr-xr-x 2 root root 6 Sep 23 19:02 nginx_group
[root@web01 ~]# ll /tmp
total 0
drwxr-xr-x 2 root root 6 Sep 23 19:02 web01_host_vars
[root@web02 ~]# ll /tmp
total 0
drwxr-xr-x 2 root root 6 Sep 23 19:02 web_group
[root@web03 ~]# ll /tmp
total 0
drwxr-xr-x 2 root root 6 Sep 23 19:02 web_group

#6.结论:
主机定义的优先级高于主机组,主机组定义的变量优先级高于复合组

6.通过命令行进行变量定义

通过命令行覆盖变量,Inventory的变量会被playbook文件中覆盖,这两种方式的变量都会被命令行直接指定变量所覆盖,使用--extra-vars或者-e设置变量
1)使用命令行定义单个变量
[root@m01 ~]# ansible-playbook mkdir.yml -e "web=commend"
2)使用命令行定义多个变量
[root@m01 ~]# ansible-playbook mkdir.yml -e "web=commend" -e "db=mysql"

#注意:指定的变量会根据命令行执行,没有指定的变量继续按照变量的设置执行

7.变量调用的优先级测试

#1.定义vars_file变量
[root@m01 ~]# vim vars.yml
web: vars_file

#2.主机清单定义变量
[root@m01 ~]# vim /etc/ansible/hosts
[nginx_group:vars]
web=host_vars

#3.主机组定义变量
[root@m01 ~]# vim group_vars/nginx_group
web: group_vars

#4.主机定义变量
[root@m01 ~]# vim host_vars/web01
web: host_vars

#5.playbook定义变量
[root@m01 ~]# vim mkdir.yml
- hosts: nginx_group
vars:
  web: playbook_vars
vars_files: /root/vars.yml
tasks:
   - name: Mkdir dir
    file:
      path: /tmp/{{web}}
      state: directory
       
#6.命令行执行定义变量
[root@m01 ~]# ansible-playbook mkdir.yml -e "web=command"

#7.依次执行,得到结论
优先级排序:从上到下以此降低
1.命令行
2.vars_files
3.playbook中配置变量
4.主机定义变量
5.主机组定义变量
6.主机清单定义变量

8.层级定义变量

#编辑变量文件
[root@m01 ~]# vim vars_file.yml
lamp:
framework:
  web_package: httpd
  db_package: mariadb-server
  php_package: php

lnmp:
framework:
  web_package: nginx
  db_package: mysql
  php_package: php

lnmt:
framework:
  web_package: nginx
  db_package: mysql
  java_package: tomcat

#编辑playbook文件
[root@m01 ~]# vim test.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
   - name: Install LAMP httpd
    yum:
      name: "{{ lamp.framework.web_package }}"

   - name: Install LAMP mariadb-server
    yum:
      name: "{{ lamp.framework.db_package }}"

   - name: Install LAMP php
    yum:
      name: "{{ lamp.framework.php_package }}"
       
#官方推荐写法
[root@m01 ~]# vim test.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
   - name: Install LAMP httpd
    yum:
      name: "{{ lamp['framework']['web_package'] }}"

   - name: Install LAMP mariadb-server
    yum:
      name: "{{ lamp['framework']['db_package'] }}"

   - name: Install LAMP php
    yum:
      name: "{{ lamp['framework']['php_package'] }}"

#执行playbook
[root@m01 ~]# ansible-playbook test.yml

三、变量注册

当absible的模块在运行之后,其实都会返回一些result结果,就像是执行脚本,我们有的时候需要脚本给我们一些return返回值,我们才知道,上一步是否可以执行成功,但是...默认情况下,ansible的result并不会显示出来,所以,我们可以把这些返回值'存储'到变量中,这样我们就能通过'调用'对应的变量名,从而获取到这些result,这种将模块的返回值,写入到变量中的方法被称为变量注册

1.变量注册配置

1)配置
[root@m01 ~]# vim list.yml 
- hosts: web01
tasks:
   - name: list dir
    shell: ls -l /root
    register: list_dir
2)输出调用的变量
[root@m01 ~]# vim list.yml 
- hosts: web01
tasks:
   - name: list dir
    shell: ls -l /root
    register: list_dir
     
   - name: get list_dir
    debug:
      msg: "{{ list_dir }}"
3)输出我们想要的部分
[root@m01 ~]# vim list.yml 
- hosts: web01
tasks:
   - name: list dir
    shell: ls -l /root
    register: list_dir
     
   - name: get list_dir
    debug:
      msg: "{{ list_dir.stdout_lines }}"

2.变量注册使用场景

1)编写剧本
#一般使用变量注册进行判断
[root@m01 ~]# cat install.yml
- hosts: nfs
tasks:
   - name: decide nfs status
    shell: systemctl is-active nfs
    ignore_errors: yes
    register: nfs_status

   - name: Start nfs
    systemd:
      name: nfs
      state: started
    when: nfs_status.rc != 0

   - name: Restart nfs
    systemd:
      name: nfs
      state: restarted
    when: nfs_status.rc == 0

四、facts缓存

1.概述

Ansible facts是在被管理主机上通过Ansible自动采集发现的变量。facts包含每台特定的主机信息。比如:被控端的主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等。

setup模块实际上就是facts缓存得到的

2.使用场景

1.通过facts缓存检查CPU,来生成对应的nginx配置文件
2.通过facts缓存检查主机名,生成不同的zabbix配置文件
3.通过facts缓存检索物理机的内存大小来生成不通的mysql配置文件

综上所述的Ansible facts类似于saltstack中的grains对于做自动化的小伙伴是非常有用滴。

3.基本用法

#编辑
[root@m01 ~]# vim facts.yml
- hosts: web_group
tasks:
   - name: Get Host Info
    debug:
      msg: Hostname "{{ ansible_fqdn }}" and IP "{{ ansible_default_ipv4.address }}"

4.关闭facts缓存

[root@m01 ~]# vim facts.yml
- hosts: web_group
gather_facts: no #关闭信息采集
tasks:

第二十七章 ansible变量介绍的更多相关文章

  1. 《Linux命令行与shell脚本编程大全》 第二十七章 学习笔记

    第二十七章:shell脚本编程进阶 监测系统统计数据 系统快照报告 1.运行时间 uptime命令会提供以下基本信息: 当前时间 系统运行的天数,小时数,分钟数 当前登录到系统的用户数 1分钟,5分钟 ...

  2. Gradle 1.12用户指南翻译——第二十七章. Ear 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  3. “全栈2019”Java多线程第二十七章:Lock获取lock/释放unlock锁

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. “全栈2019”Java第二十七章:流程控制语句中循环语句for

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. [dart学习]第二篇:dart变量介绍 (一)

    前言 本文的所有内容均是官方文档的简单翻译和理解,需要查看原文,请登录  https://www.dartlang.org/guides/language/language-tour  阅读, 让我们 ...

  6. SpringBoot | 第二十七章:监控管理之Actuator使用

    前言 随着我们服务越来越多,部署的环境也越来越繁多时,由于各服务都部署在不同的机器上,每当出现问题或者异常时,想快速进行问题的定位就变的麻烦了.所以,本章节开始,开始讲解SpringBoot的监控相关 ...

  7. 【WPF学习】第二十七章 Application类的任务

    上一章介绍了有关WPF应用程序中使用Application对象的方式,接下来看一下如何使用Application对象来处理一些更普通的情况,接下俩介绍如何初始化界面.如何处理命名行参数.如何处理支付窗 ...

  8. 第二十七章 Linux系统管理之定时任务

    一.定时任务概述 1.含义:设定某个日期或时间周期性执行指令. 2.crond # 守护进程 分钟级别 rond是Linux系统中用来定期执行命令或脚本的一种服务软件,一般情况下,我们安装完CentO ...

  9. python3 第二十七章 - 内置函数之str相关

    Python 的字符串常用内建函数如下: 序号 方法及描述 实例 1 capitalize()将字符串的第一个字符转换为大写   2 center(width, fillchar) 返回一个指定的宽度 ...

随机推荐

  1. 使用singleflight防止缓存击穿(Java)

    缓存击穿 在使用缓存时,我们往往是先根据key从缓存中取数据,如果拿不到就去数据源加载数据,写入缓存.但是在某些高并发的情况下,可能会出现缓存击穿的问题,比如一个存在的key,在缓存过期的一刻,同时有 ...

  2. day55:django:cookie&session

    目录 1.Cookie 1.Cookie前戏 2.Cookie的引入 3.django中操作cookie 2.Session 1.cookie的局限性 2.session技术 3.django操作se ...

  3. PowerJob 从 0 到 1.9k star 的经历

    本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri 本文就是<讲解 PowerJob>系列的最后一篇文章了,纯粹是写点经历写点心路历程啥的,和大家道个别. ...

  4. JVM性能调优(2) —— 垃圾回收器和回收策略

    一.垃圾回收机制 1.为什么需要垃圾回收 Java 程序在虚拟机中运行,是会占用内存资源的,比如创建的对象.加载的类型数据等,而且内存资源都是有限的.当创建的对象不再被引用时,就需要被回收掉,释放内存 ...

  5. 腾讯云Elasticsearch集群规划及性能优化实践

    ​一.引言 随着腾讯云 Elasticsearch 云产品功能越来越丰富,ES 用户越来越多,云上的集群规模也越来越大.我们在日常运维工作中也经常会遇到一些由于前期集群规划不到位,导致后期业务增长集群 ...

  6. 分享一些比较好用的(免费)网站及推荐理由 SMARK

    分享一些比较好用的(免费)网站及推荐理由 --By SMARK 资源类 这里面是一些有供下载的资源的网站等 视频 片库 内容怎么样有待考证 蓝光网 看着还行, 打赏收入 预告片世界 还行, 收入有待考 ...

  7. 047 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 09 嵌套while循环应用

    047 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 09 嵌套while循环应用 本文知识点:嵌套while循环应用 什么是循环嵌套? 什么是循环嵌套? ...

  8. 【学习笔记/题解】树上启发式合并/CF600E Lomsat gelral

    题目戳我 \(\text{Solution:}\) 树上启发式合并,是对普通暴力的一种优化. 考虑本题,最暴力的做法显然是暴力统计每一次的子树,为了避免其他子树影响,每次统计完子树都需要清空其信息. ...

  9. Tensorflow学习笔记No.0

    这里更新一些学习Tensorflow过程中可能用到的实用工具. Jupyter Notebook Jupyter Notebook 是一个非常方便的python编程工具,支持可视化,对于学习pytho ...

  10. 15.深入k8s:Event事件处理及其源码分析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 概述 k8s的Event事件是一种资源对象,用于展示集群内发生的情况 ...