ansible 变量简明入门

ansible 为什么需要变量?

ansible 是用 python 语言编写的,如果连变量都不支持,要它何用?

ansible 的变量用在什么地方?

我们在安装 ansible 后,最常使用它的方式就是 ansible 和 ansible-playbook。在这两种方式,都可以使用变量。

ansible 的变量从哪里来?

例如:
1. 用户自定义的变量,在playbook 里定义的 vars 关键字,或者在其他文件定义的变量。
2. 无需用户自定义,而是来自远程主机收集到的 facts 变量。
3. template 文件可以直接使用以上两种变量。
4. 从 tasks 执行后返回的结果,可以注册成为一个变量,留待以后继续使用。
5. playbook 在执行时,支持临时从外部提供变量。

ansible 变量的使用举例

1. 用户自定义变量
[[email protected]_7 roles]# cat a.yml
---
    - hosts: test
      gather_facts: False
      vars:
        var1: haha
        var2: your name is
      tasks:
        - debug: msg="{{var2}} {{var1}}"

说明:在 playbook 层的vars 字段后,定义了用户的变量,那么在后面所有地方都能使用这些变量了,除非,在后面有同名的变量,则会覆盖。

执行结果:
[[email protected]_7 roles]# ansible-playbook a.yml 

TASK [debug] ****************************************************************************************************************
ok: [192.168.188.109] => {
    "msg": "your name is haha"
}

变量覆盖的情况:

[[email protected]_7 roles]# cat a.yml
---
    - hosts: test
      gather_facts: False
      vars:
        var1: haha
        var2: your name is
      tasks:
        - debug: msg="{{var2}} {{var1}}"
          vars:
            - var1: hehe

说明:在tasks 层里的 var1 变量会覆盖playbook 层声明的 var1 变量。

所以,执行的结果变成:

TASK [debug] ****************************************************************************************************************
ok: [192.168.188.109] => {
    "msg": "your name is hehe"
}
1.1 从playbook 外部文件传入变量

只要将上面的例子进行一点小修改,就可以了

[[email protected]_7 roles]# cat a.yml
---
- hosts : test
  gather_facts: False
  vars_files:
    - var_file1.yml
  tasks:
    - debug: msg="{{var1}}"

说明: 在playbook 里需要使用变量文件,可以通过 vars_files 字段声明,直接声明文件名(相对路径,相对当前执行的playbook 文件),也可以用绝对路径声明变量文件的路径。

var_file1.yml 里的内容:
var1:  hello Han×××

执行结果:
TASK [debug] ****************************************************************************************************************
ok: [192.168.188.109] => {
    "msg": "hello Han×××"
}
2. 远程主机收集的 facts 变量
playbook 执行时,默认会运行 setup 模块,收集远程主机的信息。setup 模块收集到的信息,是 jason 格式。
运行 ansible  test  -m   setup , 可以看到返回的远程主机信息(节选部分的信息而已):
192.168.188.109 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.188.109"
        ],
        "ansible_all_ipv6_addresses": [
            "fe80::20c:29ff:fe8e:cf65"
        ],
        "ansible_apparmor": {
            "status": "disabled"
        },
        "ansible_architecture": "x86_64",
        "ansible_bios_date": "05/19/2017",
        "ansible_bios_version": "6.00", 

这些 facts 变量,playbook 都是可以直接使用的,如何使用?

例如,有 playbook 文件:
[[email protected]_7 roles]# cat a.yml
---
    - hosts: test
      tasks:
        - debug: msg="{{ansible_all_ipv4_addresses}} {{ansible_os_family}}"

执行结果:
TASK [debug] ****************************************************************************************************************
ok: [192.168.188.109] => {
    "msg": "[u‘192.168.188.109‘] RedHat"
}

特别说明一点:
facts数据的顶级key为ansible_facts,在引用时应该将其包含在变量表达式中。但自动收集的facts比较特殊,它以ansible_facts作为key,ansible每次收集后会自动将其注册为变量,所以facts中的数据都可以直接通过变量引用,甚至连顶级key ansible_facts都要省略。
3. template 使用变量

template module在Ansible中很常用,而它在使用的时候又没有显式的指定template文件中的值,有时候用户会对template文件中使用的变量感到困惑,所以在这里再次强调下。

在playbook中定义的变量,可以直接在template中使用,同时facts变量也可以直接在template中使用,当然也包含在inventory里面定义的host和group变量。只要是在playbook中可以访问的变量,都可以在template文件中使用。

Ansible模版文件使用变量的语法是Python的template语言Jinja2。

在下面的例子template index.html.j2中,直接使用了以下变量:

系统变量 ** {{ ansible_hostname }} **, ** {{ ansible_default_ipv4.address }} **

用户自定义的变量 ** {{ defined_name }} **

index.html.j2文件:

<html>
<title>Demo</title>
<body>
<div class="block" style="height: 99%;">
    <div class="centered">
        <h1>#46 Demo \{\{ defined_name \}\}</h1>
        <p>Served by \{\{ ansible_hostname \}\} (\{\{ ansible_default_ipv4.address \}\}).</p>
    </div>
</div>
</body>
</html>
4. 从tasks 返回的结果,需要注册成为变量才能使用
[[email protected]_7 roles]# cat a.yml
---
- hosts : test
  gather_facts: False
  tasks:
    - shell : echo hello world
      register: var
    - debug: msg="{{var}}"

说明:
执行shell 模块后,返回信息是 jason 格式的。再通过 register 注册到 var 变量。
然后,通过 debug 模块,输出 var 变量。

执行结果(截取部分):
TASK [debug] ****************************************************************************************************************
ok: [192.168.188.109] => {
    "msg": {
        "changed": true,
        "cmd": "echo hello world",
        "delta": "0:00:00.001890",
        "end": "2018-01-18 17:12:00.178123",
        "failed": false,
        "rc": 0,
        "start": "2018-01-18 17:12:00.176233",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "hello world",
        "stdout_lines": [
            "hello world"
        ]
    }
}
4.1 如何对jason 变量引用?

既然在这里已经说到 jason 变量了,那就顺便说说关于这类变量的引用。
通常可以用 "." 或者 index 引用。
例如,上一个例子中,我们想输出 stdout_lines ,则引用可以有:
var.stdout
或者, var[‘stdout‘] 。 这两种方式都是可以的。

所以,对 playbook 脚本进行一点修改:

[[email protected]_7 roles]# cat a.yml
---
- hosts : test
  gather_facts: False
  tasks:
    - shell : echo hello world
      register: var
    - debug: msg="{{var.stdout}}"

执行结果:
TASK [debug] ****************************************************************************************************************
ok: [192.168.188.109] => {
    "msg": "hello world"
}

如果我们要引用的变量是一个列表,例如上一个例子里的 stdout_lines 字段,就是一个列表,我们如何输出呢?可以使用 index 下标引用:

[[email protected]_7 roles]# cat a.yml
---
- hosts : test
  gather_facts: False
  tasks:
    - shell : echo hello world
      register: var
    - debug: msg="{{var[‘stdout_lines‘][0]}}"

执行结果:
TASK [debug] ****************************************************************************************************************
ok: [192.168.188.109] => {
    "msg": "hello world"
}

所以,在看到这里,应该能明白,ansible 的 setup 模块收集的 facts 变量,正确的引用方式了吧。

5. 执行playbook 时在外部传入变量

例子:

[[email protected]_7 roles]# cat a.yml
---
- hosts : test
  gather_facts: False
  tasks:

    - debug: msg="{{var1}}"

执行:
[[email protected]_7 roles]# ansible-playbook a.yml -e ‘var1="hello LiZimei"‘

结果:
[[email protected]_7 roles]# ansible-playbook a.yml -e ‘var1="hello LiZimei"‘
5.1 在运行 playbook 时,也可以通过外部文件传入变量

使用命令的方式:
ansible-playbook a.yml -e ‘@var_file1.yml‘
用“@”符号引用文件

总结

上面的内容是 ansible 变量继续深入学习的最基础知识了。

原文地址:http://blog.51cto.com/hellocjq/2062559

时间: 2024-08-01 11:16:23

ansible 变量简明入门的相关文章

ansible变量

    ansible变量的使用方法 1.主机变量:直接在/etc/ansible/hosts文件中,主机的后边设置key=value的格式 注:inventory_hostname是ansible自带的变量,代表组中的每个主机 #在配置文件中定义主机变量 [[email protected] playbook]# cat /etc/ansible/hosts [webservers] 192.168.2.101 key=101 192.168.2.111 key=111 #写playbook,

有趣的机器学习:最简明入门指南

有趣的机器学习:最简明入门指南 首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他技术 - 导航条 - 首页 最新文章 IT 职场 前端 - JavaScript - HTML5 - CSS 后端 - Python - Java - C/C++ - PHP - .NET - Ruby - Go 移动端 - Android - iOS 数据库 运维 - Linux - UNIX 其他技术 - Git - 机器学习 - 算法 - 测试 - 信息安全 - Vim 伯乐在线 > 首页 >

DDD简明入门之道 - 开篇

DDD简明入门之道 - 开篇 犹豫了很久才写下此文,一怕自己对DDD的理解和实践方式有偏差,二怕误人子弟被贻笑大方,所以纰漏之处还望各位谅解.不啰嗦,马上进入正题,如果你觉得此文不错就点个赞吧. 概述 "Domain-Driven Design领域驱动设计"简称DDD,是一套综合软件系统分析和设计的面向对象建模方法.关于DDD的学习资料园子里面有很多,大家可以自行参考,这里不过多介绍. 核心 DDD的核心是领域对象的建模,说白了就是怎么样从业务需求中抽象出我们需要的数据结构,通过这些数

OsharpNS轻量级.net core快速开发框架简明入门教程-Osharp.Hangfire使用

OsharpNS轻量级.net core快速开发框架简明入门教程 教程目录 从零开始启动Osharp 1.1. 使用OsharpNS项目模板创建项目 1.2. 配置数据库连接串并启动项目 1.3. OsharpNS.Swagger使用实例(登录和授权) 1.4. Angular6的前端项目启动 Osharp代码生成器的使用 2.1 生成器的使用 2.2 生成代码详解(如何自己实现业务功能) Osharp部分模块使用 3.1 Osharp.Redis使用 3.2 Osharp.Hangfire使用

shell变量快速入门

临时变量开启新的sh,临时变量不存在 在shell脚本运行时,会先查找系统环境变量ENV该变量指定了环境文件(加载顺序通常是/etc/profile ~/.bash_profile ~/.bashrc /etc/bashrc) 实现变量局部生效 编辑用户变量文件立即生效命令开启新的sh,变量存在 切换普通用户,变量不存在实现/mnt下脚本直接执行编辑用户变量文件显示PATH环境变量实现变量全局生效编辑系统变量文件 立即生效命令切换普通用户,变量存在. 双引号:所见非所得,它会先把变量解析之后,再

三:Ansible变量

三:Ansible变量 一:变量概述 ? 变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如nginx-1.6.3这个软件包的版本,在其它地方或许会反复使用,那么如果讲此值设置为变量,然后再在其他的playbook中调用,会方便许多.如此一来还方便维护,减少维护的成本. 1. 定义变量的方式 1.1 通过命令行进行变量定义 [[email protected] ~]# vim test.yml - hosts: web_group tasks: - name:

Ruby语言简明入门与提高

rails请参考我写的简明Ruby系列:rails简明实用入门指南 本书其他版本: github版本 简书版本 作者:chenge 联系方式: * 邮件:chenge3k at qq.com * chenge微博谈 第一章 简介 内容简介 目标读者: 初次编程者 初次学习Ruby的程序员 Ruby是适合于初学者的,即使是从未写过程序的人来学,我相信初级部分一天就能学完. 为了帮助你学习更轻松些,我尽量选择了简单的内容. 通过浏览目录,就知道我选择了一些什么内容.初级我选择了三组共四个概念,本书定

Ansible介绍/安装/入门

Ansible是一个IT自动化工具. 它可以配置系统,部署软件,并编排更先进的IT任务,如持续部署或零停机滚动更新. Ansible的主要目标是简单易用. 它还强调了安全性和可靠性,具有最少的移动部件,用OpenSSH来传输(使用加速socket模式和pull模式作为替代方案) 是一种针对人们的可审计性设计的语言 - 甚至这些人都不熟悉项目. 我们认为简单性与各种规模的环境相关,因此我们为所有类型的繁忙用户设计:开发人员,系统管理员,发布工程师,IT经理以及两者之间的所有人员. 可适用于管理所有

Jenkins简明入门(一) -- 安装

如今Jenkins官网的Guide里使用了Docker,网上很多Jenkins入门教程都已过时了,所以写这一篇入门教程. 官网的Guide Link是:https://jenkins.io/doc/pipeline/tour/getting-started/ 我写的Jenkins入门是基于官网Guide,但是有所不同:除了汉语翻译外,官网的Guide中启动Jenkins时也用了docker,然后在Jenkins里跑pipline的时候,build stage和test stage也用了docke