热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Ansible:在循环中生成变量

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Ansible:在循环中生成变量相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Ansible:在循环中生成变量相关的知识,希望对你有一定的参考价值。



在我的变量文件中,我需要定义一个列表变量,其项目具有相似的模式,并且还共享一些(冗余)信息。我想在循环中生成列表变量,而不是手动输入所有这些信息。

例如,我有100个主机,主IP地址为192.168.100。[1:100],每个主机有一个额外的IP地址10.0.1。[1:100]。所有主IP使用相同的网关,例如192.168.100.254,所有额外的IP使用另一个网关,例如10.0.1.254。

在一项任务中,我想循环遍历所有主机,并且对于每个主机,它都是主要的ip,额外的ip和网关都是需要的。我想在我的任务中使用“with_items”,所以我希望有一个列表变量“IP_ADDRS”,其中每个项目都是如下所示:

{ primary_ip: 192.168.100.x, primary_gw: 192.168.100.254, extra_ip: 10.0.1.x, extra_gw: 10.0.1.254}

而不是手动定义IP_ADDRS:

IP_ADDRS:
- { primary_ip: 192.168.100.1, primary_gw: 192.168.100.254, extra_ip: 10.0.1.1, extra_gw: 10.0.1.254}
- { primary_ip: 192.168.100.2, primary_gw: 192.168.100.254, extra_ip: 10.0.1.2, extra_gw: 10.0.1.254}
- ...

我想以某种方式生成列表变量“IP_ADDRS”...

我尝试了jinja2语句,如下所示:

IP_ADDRS: >
"{% for idx in range(1, 101) %}
- { primary_ip: 192.168.100.{{ idx }}, primary_gw: 192.168.100.254, extra_ip: 10.0.1.{{ idx }}, extra_gw: 10.0.1.254 }
"{% endfor %}"

当我使用调试模块打印IP_ADDRS时,它确实打印列表中的所有项目,但似乎Ansible不将此变量视为LIST,因此



with_items:{{IP_ADDRS}}


不像我预期的那样工作。

jinja2语句有什么问题,还是有办法实现相同的结果?

非常感谢,

/棕色


答案

您可以定义对象的模板并在循环中使用它:

---
- hosts: localhost
gather_facts: no
vars:
ip_template:
primary_ip: "192.168.100.{{ item }}"
primary_gw: "192.168.100.254"
extra_ip: "10.0.1.{{ item }}"
extra_gw: "10.0.1.254"
tasks:
# execute single task, no need in list
- debug:
msg: "{{ ip_template }}"
with_sequence: "start=1 count=5"
# construct list
- set_fact:
ip_list: "{{ (ip_list | default([])) + [ip_template] }}"
with_sequence: "start=1 count=5"
- debug:
msg: "{{ ip_list }}"

如果您仍希望在变量中定义ip_list,则需要构建复杂的Jinja2语句以生成JSON格式的列表而不是YAML,就像您尝试的那样。这种字符串的小例子里面有两个对象:'[{"ip":"192.168.0.10","gw":"192.168.0.1"},{"ip":"192.168.0.20","gw":"192.168.0.1"}]'


另一答案

如果需要由loopsif/else生成许多复杂变量。有时候,当尝试在任务中生成它们时,它会变得讨厌且不易理解。以jinja模板格式创建变量文件可能会有所帮助。

例如,创建jinja模板生成的变量:

# variable file
{% for idx in range(1, 101) %}
- primary_ip: 192.168.100.{{ idx }}
primary_gw: 192.168.100.254
extra_ip: 10.0.1.{{ idx }}
extra_gw: 10.0.1.254
{% endfor %}

然后通过template查找插件读取任务中的变量:

# playbook tasks
- name: Read variables
set_fact:
ip_list: "{{ lookup('template', 'path_to_file') | from_yaml }}"

结果将是:

TASK [set_fact] *******************************************************************************************************************
Tuesday 06 February 2018 17:16:55 +0800 (0:00:00.110) 0:00:00.110 ******
Tuesday 06 February 2018 17:16:55 +0800 (0:00:00.108) 0:00:00.108 ******
ok: [localhost]
TASK [debug] **********************************************************************************************************************
Tuesday 06 February 2018 17:16:55 +0800 (0:00:00.137) 0:00:00.247 ******
Tuesday 06 February 2018 17:16:55 +0800 (0:00:00.137) 0:00:00.245 ******
ok: [localhost] => {
"ip_list": [
{
"extra_gw": "10.0.1.254",
"extra_ip": "10.0.1.1",
"primary_gw": "192.168.100.254",
"primary_ip": "192.168.100.1"
},
{
"extra_gw": "10.0.1.254",
"extra_ip": "10.0.1.2",
"primary_gw": "192.168.100.254",
"primary_ip": "192.168.100.2"
},
...........


推荐阅读
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • Oracle另一台电脑访问的问题
    参考:https:www.cnblogs.comsand-tinyp3797087.html首先,两台电脑需要在同一个网络,然后安装Oracle的电脑上找到listener.ora ... [详细]
  • k8snamespace配置cpu最大和最小限额
    世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。问:如何为namespace配置最大和最小限额&#x ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 目录1、将mysql数据导出到SQL文件中(数据库存在的情况)2、将现有的sql文件数据导入到数据库中(前提数据库存在) 3、利用Navicat导出SQL文件和导入SQL文件1)从 ... [详细]
author-avatar
捕鱼达人2502931267
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有