当前位置: 首页 > article >正文

Ansible的dict的key里包含圆点.

环境

  • 管理节点:CentOS Stream release 9
  • 控制节点:同上
  • Ansible:2.15.4

从文件读取yaml数据

假设目标机器上有文件 data.yml 内容如下:

a:
  b: 111
  c: 222
  d.e: 333

现在要读取该文件内容,并转成yaml数据。

创建文件 test1.yml 如下:

---
- hosts: all
  tasks:
    - name: task1
      shell: cat /root/temp1117/data.yml
      register: result

    - name: task2
      set_fact:
        data: "{{ result.stdout | from_yaml }}"

    - name: task3
      debug:
        msg: "{{ data | type_debug }}"

    - name: task4
      debug:
        msg: "{{ data.a }}"

    - name: task5
      debug:
        msg: "{{ data.a.b }}"

运行结果如下:

......
TASK [task1] *************************************************************************************************************************************
changed: [127.0.0.1]

TASK [task2] *************************************************************************************************************************************
ok: [127.0.0.1]

TASK [task3] *************************************************************************************************************************************
ok: [127.0.0.1] => {
    "msg": "dict"
}

TASK [task4] *************************************************************************************************************************************
ok: [127.0.0.1] => {
    "msg": {
        "b": 111,
        "c": 222,
        "d.e": 333
    }
}

TASK [task5] *************************************************************************************************************************************
ok: [127.0.0.1] => {
    "msg": "111"
}
......

读取文件内容后,用 from_yaml 将其转成yaml格式(其数据类型是 dict )。

然后就可以访问其内容了。本例中,通过 aa.ba.c 来访问数据。

key里包含圆点( .

现在的问题是,要如何访问 d.e 这个key呢?用 a.d.e 会出错,因为这种方式表示 ade 是三个层次。

......
    - name: task 6
      debug:
        msg: "{{ data.a.d.e }}"
......

报错如下:

......
TASK [task 6] ************************************************************************************************************************************
fatal: [127.0.0.1]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'd'. 'dict object' has no attribute 'd'\n\nThe error appears to be in '/root/temp1117/test1.yml': line 24, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n    - name: task 6\n      ^ here\n"}
......

解决方法:不是用 a.d.e 的方式,而是用 a['d.e'] 的方式。

......
    - name: task7
      debug:
        msg: "{{ data.a['d.e'] }}"
......

运行结果如下:

......
TASK [task7] *************************************************************************************************************************************
ok: [127.0.0.1] => {
    "msg": "333"
}
......

其它

事实上, a[b] 也是python的用法。

创建文件 test.py 如下:

#!/bin/python3

data = {'a': {'b': 111, 'c': 222, 'd.e': 333}}

print(data['a']['b'])

print(data['a']['d.e'])

运行结果如下:

111
333

如果不喜欢 data['a']['d.e'] 这种方式,还可以用 get() 方法:

data.get('a').get('d.e')

http://www.kler.cn/a/132558.html

相关文章:

  • 3、C语言基本数据类型关键字
  • .NET桌面应用架构Demo与实战|WPF+MVVM+EFCore+IOC+DI+Code First+AutoMapper
  • 【ARM】MDK在debug模式下的Registers窗口包含哪些内容
  • MySQL 中的数据排序是怎么实现的
  • 基于Java Springboot编程语言在线学习平台
  • Essential Cell Biology--Fifth Edition--Chapter one (8)
  • 13 Go的错误处理
  • Spark作业串行与并行提交job
  • 6、传统CV之均值滤波
  • 龙芯 操作系统选择和安装
  • 『 MySQL数据库 』数据库之表的约束
  • 基于SSM的校园闲置物品交易平台
  • Docker - 网络
  • ESP32网络开发实例-非接触式水位监测
  • chrome 浏览器个别字体模糊不清
  • 【技术追踪】SAM(Segment Anything Model)代码解析与结构绘制之Mask Decoder
  • 《LeetCode力扣练习》代码随想录——链表(删除链表的倒数第N个节点---Java)
  • elasticsearch 安装
  • 编程怎么学习视频教程,编程实例入门教程,中文编程开发语言工具下载
  • Java中 ==、equals() 、equalsIgnoreCase() 和compareTo() 方法对比详解
  • python中的NumPy和Pandas往往都是同时使用,NumPy和Pandas的在数据分析中的联合使用
  • 基于SSM+Vue的校园共享单车管理系统
  • 【UE5】物体沿样条线移动
  • OSS服务和MinIO存储做一个区分解析
  • 车载开发岗位如何?Android程序员是否转行
  • 对话芯动科技 | 助力云游戏 4K级服务器显卡的探索与创新