Ansible之变量

这篇具有很好参考价值的文章主要介绍了Ansible之变量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一)Ansible变量介绍

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

二)变量命名规则

变量的名字由字母、下划线和数字组成,必须以字母开头。
如下变量命名为正确格式:

good_a
ok_b

如下是错误的变量名:

_aaa
2_bb

保留关键字不可以作为变量名称:

add, append, as_integer_ratio, bit_length,
capitalize, center, clear,
conjugate, copy, count, decode, denominator,
difference,
difference_update, discard, encode, endswith,
expandtabs,
extend, find, format, fromhex, fromkeys, get,
has_key,
hex, imag, index, insert, isalnum, intersection,
intersection_update, isalpha, isdecimal, isdigit,
isdisjoint, is_integer, islower,
isnumeric, isspace, issubset, issuperset, istitle,
isupper,
items, iteritems, iterkeys, itervalues, join, keys,
ljust, lower,
 lstrip, numerator, partition, pop, popitem, real,
remove,
 replace, reverse, rfind, rindex, rjust, rpartition,
rsplit, rstrip,
 setdefault, sort, split, splitlines, startswith,
strip, swapcase,
symmetric_difference, symmetric_difference_update,
title,
translate, union, update, upper, values, viewitems,
viewkeys,
viewvalues, zfill

三)变量类型

根据变量的作用范围大体的将变量分为:

  • 全局变量
  • 剧本变量
  • 资产变量

但这是一种较为粗糙的划分,不足以囊括Ansible中的所有变量。

1.全局变量

全局变量,是我们使⽤ansible 或使⽤ansible-playbook 时,⼿动
通过 -e 参数传递给Ansible 的变量。
通过ansible 或 ansible-playbook 的 help 帮助, 可以获取具体格
式使⽤⽅式:

# ansible-playbook -h | grep var
  -e EXTRA_VARS, --extra-vars EXTRA_VARS
                        set additional variables as key=value or YAML/JSON, if

# ansible -h |grep var
                        path for many features including roles/ group_vars/
  -e EXTRA_VARS, --extra-vars EXTRA_VARS
                        set additional variables as key=value or YAML/JSON, if
例子

传递普通的key=value 的形式

ansible all -i localhost, -m debug -a "msg='my key is {{ key }}'" -e "key=value"

Ansible之变量,Ansible,ansible,java,开发语言
传递⼀个YAML/JSON 的形式(注意不管是YAML还是JSON,它们的最终格式⼀定要是⼀个字典)
Json格式----
Ansible之变量,Ansible,ansible,java,开发语言

 ansible all -i localhost, -m debug -a "msg='name is {{ name }}, type is {{ type }}'" -e @a.json

Ansible之变量,Ansible,ansible,java,开发语言
Yml格式–
Ansible之变量,Ansible,ansible,java,开发语言

ansible all -i localhost, -m debug -a "msg='name is {{ name }}, type is {{ type }}'" -e @a.yml

Ansible之变量,Ansible,ansible,java,开发语言

2.剧本变量

在这只介绍两种最常用的定义方式:

a.通过PLAY属性vars定义
---
- name: test play vars
 hosts: all
 vars:
 user: yu
 home: /home/yu
b.通过PLAY属性var_files定义

当通过vars属性定义的变量很多时,这个Play就会感觉特别臃肿。
此时我们可以将变量单独从Play中抽离出来,形成单独的YAML ⽂件。

---
- name: test play vars
  hosts: all
  vars_files:
  - vars/users.yml

Ansible之变量,Ansible,ansible,java,开发语言

c.在Playbook中使用变量的注意点
---
# 这⾥我们将上⾯的Playbook中引⽤变量的部分进⾏修改,去掉了双
引号。
- name: test play vars
  hosts: all
  vars:
  user: lilei
  home: /home/lilei
  tasks:
  - name: create the user {{ user }}
    user:
 # 注意这⾥将 "{{ user }}" 改成了 {{ user }}
      name: {{ user }}
      home: "{{ home }}”

执行以上的Playbook时,就会出现以下的错误:
Ansible之变量,Ansible,ansible,java,开发语言
这样错误的主要原因是PlayBook 是YAML 的⽂件格式, 当Ansible 分析YAML ⽂件时,有可能会误认为字典。name: {{ user }} 是⼀个字典的开始。因此加针对变量的使⽤,加上了双引号,避免Ansible错误解析。

3.资产变量

资产变量分为主机变量和主机组变量,分别针对资产中的单个主机
和主机组。

3.1主机变量

下面给大家一个实例,在以下资产中,定义了一个主机变量lilei,此变量只针对192.168.244.130这台服务器有效。
Ansible之变量,Ansible,ansible,java,开发语言
接下来掩饰验证
先获取定义的变量值

ansible 192.168.244.131 -i hostsandhostvars -m debug -a "msg='{{user}} {{port}}'"

Ansible之变量,Ansible,ansible,java,开发语言
可以看见运行结果
那么未获取到定义的变量值,因为user这个变量针对192.168.244.130主机无效

ansible 192.168.244.130 -i hostsandhostvars -m debug -a "var=user"

Ansible之变量,Ansible,ansible,java,开发语言

3.2主机组变量

以下资产中,定义了⼀个组变量home ,此变量将针对webservers 这个主机组中的所有服务器有效。
Ansible之变量,Ansible,ansible,java,开发语言
验证
home是web_servers的组变量,会针对这个组内的所有服务器生效。

ansible webservers -i hostsandgroupvars -m debug -a "var=home"

Ansible之变量,Ansible,ansible,java,开发语言

3.3主机变量vs主机组变量

接下来讨论一个问题,如果主机变量和组变量在同一资产中重名,会发生什么呢?
Ansible之变量,Ansible,ansible,java,开发语言
我们在资产中定义主机变量和组变量user,那么此时我们可以发现192.168.244.130这台机器的主机变量user的优先级更高。

ansible webservers -i hosts_2 -m debug -a "var=user"

Ansible之变量,Ansible,ansible,java,开发语言

3.4变量的继承

资产可以继承,那么变量当然也可以继承。
Ansible之变量,Ansible,ansible,java,开发语言
在资产继承的同时,对应的变量也会发生继承。

ansible allservers -i hosts_3 -m debug -a "var=user"

Ansible之变量,Ansible,ansible,java,开发语言

ansible dbservers -i hosts_3 -m debug -a "var=user"

Ansible之变量,Ansible,ansible,java,开发语言

ansible webservers -i hosts_3 -m debug -a "var=user"

Ansible之变量,Ansible,ansible,java,开发语言

3.5 Inventory内置变量的说明

内置变量一般都会以ansible_为前缀

ansible_ssh_host
#将要连接的远程主机名与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port
#ssh端⼝号.如果不是默认的端⼝号,通过此变量设置.
ansible_ssh_user
#默认的 ssh ⽤户名
ansible_ssh_pass
#ssh 密码(这种⽅式并不安全,官⽅强烈建议使⽤ --askpass 或 SSH 密钥)
ansible_sudo_pass
#sudo 密码(这种⽅式并不安全,官⽅强烈建议使⽤ --asksudo-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 中的 setup 模块帮我们完成。
它收集了有关被管理服务器的操作系统版本、服务器IP地址、主机名,磁盘的使⽤情况、CPU个数、内存⼤⼩等等有关被管理服务器的私有信息。
在每次PlayBook运⾏的时候都会发现在PlayBook执⾏前都会有⼀个Gathering Facts的过程。这个过程就是收集被管理服务器的Facts信息过程。

4.1手动收集Facts变量
ansible all -i localhost, -c local -m setup

Ansible之变量,Ansible,ansible,java,开发语言
运行结果有很多,我就不全部截取了

4.2过滤Facts

通过刚刚的⼿动收集Facts,我们发现facts 信息量很⼤。 能不能有针对性的显示我们想要的信息呢?
可以通过使⽤Facts 模块中的filter参数去过滤我们想要的信息。
仅获取服务器的内存情况信息

ansible all -i localhost, -m setup -a "filter=*memory*" -c local

Ansible之变量,Ansible,ansible,java,开发语言
仅获取服务器的磁盘挂载情况

ansible all -i localhost, -m setup -a "filter=*mount*" -c local

Ansible之变量,Ansible,ansible,java,开发语言

4.3在Playbook中去使用Facts变量

默认情况下,在执⾏PlayBook的时候,它会去⾃动的获取每台被管理服务器的facts信息。

---
- name: a play example
 hosts: all
 remote_user: root
 tasks:
 - name: install nginx package
 yum: name=nginx state=present
 - name: copy nginx.conf to remote server
 copy: src=nginx.conf
dest=/etc/nginx/nginx.conf
 - name: start nginx server
 service:
 name: nginx
 enabled: true
 state: started

将这段playbook命名为test_1.yml并且执行

ansible-playbook test_1.yml

Ansible之变量,Ansible,ansible,java,开发语言
可以像使用其他变量一样,去使用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变量的获取
若在整个playbook的执行过程中,完全未使用过Facts变量,此时我们可以将其关闭,以加快playbook的执行速度。

---
- name: a play example
  hosts: webservers
  # 关闭 facts 变量收集功能
  gather_facts: no
  remote_user: root
  tasks:
  - name: install nginx package
    yum: name=nginx state=present
  - name: copy nginx.conf to remote server
    copy: src=nginx.conf
          dest=/etc/nginx/nginx.conf
  - name: start nginx server
    service:
      name: nginx
      enabled: true
      state: started

将其命名为test_2.yml并且执行

ansible-playbook -i hosts test_2.yml

Ansible之变量,Ansible,ansible,java,开发语言

5.注册变量

往往⽤于保存⼀个task任务的执⾏结果, 以便于debug时使⽤。
或者将此次task任务的结果作为条件,去判断是否去执⾏其他task任务。
注册变量在PlayBook中通过register关键字去实现。

---
- name: install a package and print the result
  hosts: webservers
  remote_user: root
  tasks:
  - name: install nginx package
    yum: name=nginx state=present
    register: install_result
  - name: print result
    debug: var=install_result

将以上代码命名为test_3.yml并执行

ansible-playbook test_3.yml

Ansible之变量,Ansible,ansible,java,开发语言

6.变量优先级

⽬前介绍了全局变量、剧本变量、资产变量、Facts变量及注册变量。
其中Facts变量不需要⼈为去声明、赋值;注册变量只需通过关键字register去声明,⽽不需要赋值。
⽽全局变量、剧本变量及资产变量则完全需要⼈为的去声明、赋值。
变量的优先权讨论,也将着重从这三类变量去分析。
假如在使⽤过程中,我们同时在全局变量、剧本变量及资产变量声明了同⼀个变量名,那么哪⼀个优先级最⾼呢? 下⾯我们将以实验的形式去验证变量的优先级
环境准备:
定义一份资产、且定义了资产变量user
Ansible之变量,Ansible,ansible,java,开发语言
(由于试验机性能问题,我缩减了试验机的数量,读者可自行增加)
编写一份Playbook、同样定义剧本变量user

---
- name: test variable priority
  hosts: all
  remote_user: root
  vars:
    user: mysql
  tasks:
   - name: print the user value
     debug: msg='the user value is {{ user }}'

将其命名为test_4.yml
验证测试–
同时使用全局变量、剧本变量、资产变量
当变量user同时定义在全局变量、剧本变量及资产变量中时,全局变量的优先级最⾼。

ansible-playbook -i hosts test_4.yml -e "user=www"

Ansible之变量,Ansible,ansible,java,开发语言
同时使用剧本变量和资产变量
取消全局变量,发现剧本变量的优先级要高于资产变量的优先级

ansible-playbook -i hosts test_4.yml

Ansible之变量,Ansible,ansible,java,开发语言
只是用资产变量的情况下
我们不使用全局变量、且注释掉剧本变量后,资产变量才最终生效。

---
- name: test variable priority
  hosts: all
  remote_user: root
  #vars:
  # user: mysql
  tasks:
   - name: print the user value
     debug: msg='the user value is {{ user }}'
ansible-playbook -i hosts test_4.yml

Ansible之变量,Ansible,ansible,java,开发语言
**变量优先级结论 **
当⼀个变量同时在全局变量、剧本变量和资产变量中定义时,优先级最⾼的是全局变量;其次是剧本变量;最后才是资产变量。文章来源地址https://www.toymoban.com/news/detail-696979.html

到了这里,关于Ansible之变量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自动化运维(二十六)Ansible 实战变量插件和连接插件

     Ansible 支持多种类型的插件,这些插件可以帮助你扩展和定制 Ansible 的功能。每种插件类型都有其特定的用途和应用场景。今天我们一起学习变量插件和连接插件。 Ansible 变量插件允许动态地添加变量到主机或组中,这些变量可以在 playbook 运行时被解析和使用。变量插件可

    2024年04月14日
    浏览(57)
  • 07_ansible, 条件选择、加载客户事件、在roles和includes上面应用’when’语句、条件导入、基于变量选择文件和模版、注册变量

    10.条件选择 10.1.When语句 10.2.加载客户事件 10.3.在roles和includes上面应用’when’语句 10.4.条件导入 10.5.基于变量选择文件和模版 10.6.注册变量 转自:http://www.ansible.com.cn/docs/playbooks_conditionals.html#id3 常常来说,一个play的结果经常取决于一个变量的值,事件(从远端系统得到事件)

    2024年02月13日
    浏览(44)
  • Container ansible disguises local ansible 【容器 ansible 伪装本地 ansible】

    预备条件: ctr crictl $ nerdctl containerd install 了解 kubespray 是什么 kubespray 包含 ansible、ansible-playbook命令以及通过kubespray项目安装kubernetes集群的介质。 编排 inventory.ini

    2024年01月21日
    浏览(38)
  • 【ansible】ansible配置文件详解

    目录 管理ansible的配置文件 一,配置ansible 二,据优先级选择执行ansible配置文件 1,按照优先级首先会匹配环境变量ANSIBLE_CONFIG  2,第二个匹配到./ansible.cfg文件  3,第三个匹配到~/.ansible.cfg文件 4,当以上文件都不存在时,ansible配置文件就会匹配到/etc/ansible/ansible.cfg 三,管理

    2024年02月04日
    浏览(39)
  • ansible(2)-- ansible常用模块

    部署ansible:ansible(1)-- 部署ansible连接被控端_luo_guibin的博客-CSDN博客 目录  一、ansible常用模块 1.1 ping 1.2 command 1.3 raw 1.4 shell 1.5 script 1.6 copy 1.7 template 1.8 yum 11.0.1.13 主控端(ansible) 11.0.1.12 被控端(k8s-master) 查看主控端被控端IP,主控端(10.1.1.13)查看ansible配置文件的被控端,

    2024年02月11日
    浏览(38)
  • ansible(1)-- 部署ansible连接被控端

    目录 一、部署ansible 1.1 安装 1.2 测试连接 192.168.136.55 ansible 192.168.136.56 被控端 zabbix-s只是主机名,不用在意,更好该主机也安装了zabbix,不好更改。 下载阿里云epel源   被控端192.168.136.56生成的文件 ansible 自动安装,无需经过密码确认,ubantun、centos: 生产中使用ssh-copy-id复制

    2024年02月12日
    浏览(37)
  • 【ansible】认识ansible,了解常用的模块

    目录 一、ansible是什么? 二、ansible的特点? 三、ansible与其他运维工具的对比 四、ansible的环境部署 第一步:配置主机清单 第二步:完成密钥对免密登录 五、ansible基于命令行完成常用的模块学习 模块1:command模块 模块2:shell模块 模块3:cron模块 模块4:user模块 模块5:gro

    2024年02月20日
    浏览(38)
  • [Ansible系列]ansible playbook的条件语句

    目录 简介 when 1.  when的基本使用  2.   比较运算符 3.  逻辑运算符 4.   判断变量 5.  判断执行结果  6.  判断路径  7.  判断字符串  8.  判断整除  9.  其他 9.1  version  9.2   subset  9.3  superset  9.4  in  9.5  string  和 number  条件判断与block 1.  block  2.  rescue 

    2024年02月03日
    浏览(34)
  • ansible创建用户账户和更新ansible库的密钥

    1.创建⽤户帐户 从 http://materials/user_list.yml 下载要创建的⽤户的列表,并将它保存到 /home/greg/ansible 在本次考试中使⽤在其他位置创建的密码库 /home/greg/ansible/locker.yml 。创建名为 /home/greg/ansible/users.yml 的 playbook ,从⽽按以下所述创建⽤户帐户: 职位描述为 developer 的⽤户应当

    2024年04月16日
    浏览(46)
  • [Ansible系列]ansible JinJia2过滤器

    目录 一.  JinJia2简介 二.  JinJia2模板使用  2.1  在play中使用jinjia2 2.2  template模块使用 2.3   jinjia2条件语句 2.4  jinjia2循环语句 2.5   jinjia2过滤器 2.5.1   default过滤器 2.5.2  字符串操作相关过滤器   2.5.3  数字操作相关过滤器 2.5.4  列表操作相关过滤器  2.5.5   应用于文件

    2024年02月02日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包