Ansible 通过数组嵌套循环把 yaml 内容写入 ini 配置的新思路

简介: 把一个多层级的 yaml 配置内容,转换成 ini 配置的内容。

昨天遇到一个问题场景,我需要修改一个 ini 配置文件,ansible 的 ini_file 模块里需要定义 section, option 和 value 三个数据。

那么,我如何可以通过一个通用的变量数组,把数据套用到 ini 文件里呢?

假设我的 ini 文件内容是:

[log]
level = info
max_size = 100

[storage]
data_path = /mnt/data
log_path = /mnt/log

我写了一个 yaml 格式的字典,如下:

node_config_ini:
  log:
    level: warn
    max_size: 200
  storage:
    data_path: /tmp/data
    log_path: /tmp/log

摸索的过程就不详细写了,反正 ansible 的 loop 功能没有适合我的。于是我选择直接用 python 的嵌套循环来生成一个 list:

- hosts: localhost
  gather_facts: false
  vars:
    node_config_ini:
      log:
        level: warn
        max_size: 200
      storage:
        data_path: /tmp/data
        log_path: /tmp/log

  tasks:
    - set_fact:
        ini_items: "{{ item.split(';') }}"
      with_items: >-
        {%- for section in node_config_ini | dict2items -%}
        {%- for option in section.value | dict2items -%}
          {{ section.key }},{{ option.key }},{{ option.value }}
        {%- if loop.nextitem is defined -%};{%- endif -%}
        {%- endfor -%}
        {%- if loop.nextitem is defined -%};{%- endif -%}
        {%- endfor -%}
      loop_control:
        label: "{{ item.split(';') }}"

    - debug:
        msg: "{{ item.split(',') }}"
      loop: "{{ ini_items }}"

set_fact 和 debug 打印出来的内容如下:

TASK [set_fact] *******************************************************************************
星期二 22 二月 2022  15:22:42 +0800 (0:00:00.055)       0:00:00.072 **************** 
ok: [localhost] => (item=['log,level,warn', 'log,max_size,200', 'storage,data_path,/tmp/data', 'storage,log_path,/tmp/log'])

TASK [debug] *******************************************************************************
星期二 22 二月 2022  15:22:42 +0800 (0:00:00.057)       0:00:00.130 **************** 
ok: [localhost] => (item=log,level,warn) => {
    "msg": [
        "log",
        "level",
        "warn"
    ]
}
ok: [localhost] => (item=log,max_size,200) => {
    "msg": [
        "log",
        "max_size",
        "200"
    ]
}
ok: [localhost] => (item=storage,data_path,/tmp/data) => {
    "msg": [
        "storage",
        "data_path",
        "/tmp/data"
    ]
}
ok: [localhost] => (item=storage,log_path,/tmp/log) => {
    "msg": [
        "storage",
        "log_path",
        "/tmp/log"
    ]
}

这样,我就可以再根据 , 来分割数据,填入 ini 文件里,如下:

- ini_file:
    path: /tmp/test.ini
    create: true
    section: "{{ item.split(',')[0] }}"
    option: "{{ item.split(',')[1] }}"
    value: "{{ item.split(',')[2] }}"
  loop: "{{ ini_items }}"

顺利地把 ini 内容修改了:

cat /tmp/test.ini

[log]
level = warn
max_size = 200

[storage]
data_path = /tmp/data
log_path = /tmp/log
目录
相关文章
|
2月前
|
Java 数据库连接 Maven
springBoot:项目建立&配置修改&yaml的使用&resource 文件夹(二)
本文档介绍了如何创建一个基于Maven的项目,并配置阿里云仓库、数据库连接、端口号、自定义启动横幅及多环境配置等。同时,详细说明了如何使用YAML格式进行配置,以及如何处理静态资源和模板文件。文档还涵盖了Spring Boot项目的`application.properties`和`application.yaml`文件的配置方法,包括设置数据库驱动、URL、用户名、密码等关键信息,以及如何通过配置文件管理不同环境下的应用设置。
248 1
|
3月前
|
JSON Kubernetes API
深入理解Kubernetes配置:编写高效的YAML文件
深入理解Kubernetes配置:编写高效的YAML文件
|
6月前
|
存储 运维 Serverless
函数计算产品使用问题之在YAML文件中配置了环境变量,但在PHP代码中无法读取到这些环境变量,是什么原因
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
关系型数据库 MySQL Go
go抽取mysql配置到yaml配置文件
go抽取mysql配置到yaml配置文件
|
2月前
yolov5的coco128.yaml的配置信息详解
这篇文章详细解释了YOLOv5的`coco128.yaml`配置文件中的参数,包括训练和验证数据集的路径、类别数量以及类别名称。
126 0
|
4月前
|
运维 应用服务中间件 nginx
自动化运维的利剑:Ansible Role 打造标准化配置
【8月更文挑战第31天】在追求效率和稳定性的今天,自动化运维不再是奢侈品,而是必需品。Ansible Role,作为自动化配置管理的利器,它如何帮助我们实现标准化部署和维护?本文将通过一个简单示例,带你了解 Ansible Role 的魅力所在,并探讨其在现代 IT 架构中的应用价值。
|
4月前
|
机器学习/深度学习 计算机视觉 Python
深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
150 0
|
5月前
|
安全 Devops KVM
Ansible的基本配置
Ansible的基本配置
60 2
|
4月前
|
Dart iOS开发 C++
Dart ffi 使用问题之在pubspec.yaml文件中,对plugin_ffi_sample插件的依赖如何配置
Dart ffi 使用问题之在pubspec.yaml文件中,对plugin_ffi_sample插件的依赖如何配置
|
4月前
|
JSON 运维 Linux
在CentOS 7上安装和配置Ansible的方法
在CentOS 7上安装和配置Ansible的方法
190 0