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
目录
相关文章
|
8月前
|
XML JSON Java
SpringBoot入门(三) 之springboot的配置配置文件以及yaml的使用
SpringBoot入门(三) 之springboot的配置配置文件以及yaml的使用
159 0
SpringBoot入门(三) 之springboot的配置配置文件以及yaml的使用
|
1月前
|
Oracle 关系型数据库 MySQL
Flink CDC产品常见问题之从EARLIEST_OFFSET启动就报错如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
|
4月前
|
Java
Java【代码分享 11】yaml配置List和Map参数对象的配置信息及类文件实例分享(效仿GatewayDynamic+DynamicDataSource的注入方法)
Java【代码分享 11】yaml配置List和Map参数对象的配置信息及类文件实例分享(效仿GatewayDynamic+DynamicDataSource的注入方法)
51 0
|
4月前
|
存储 Kubernetes Perl
k8s(10)声明式对象配置--yaml文件
k8s(10)声明式对象配置--yaml文件
57 0
|
6月前
|
Kubernetes Linux 持续交付
在 Alibaba Cloud Linux 上搭建并配置 Ansible
本场景简单介绍了在Alibaba Cloud Linux上安装并配置Ansible的方式。
|
6月前
|
测试技术 持续交付
SAP UI5 Tools 里配置文件 ui5-local.yaml 的配置要点
SAP UI5 Tools 里配置文件 ui5-local.yaml 的配置要点
64 0
|
7月前
|
Linux 网络安全 数据安全/隐私保护
在 Alibaba Cloud Linux 上配置 Ansible
本场景是在 Alibaba Cloud Linux 上配置 Ansible
151 0
|
8月前
|
存储 Java 开发者
Spring Boot中的yaml配置简介
Spring Boot中的yaml配置简介
|
8月前
|
网络协议 网络安全 数据安全/隐私保护
Ansible模块介绍——配置网络模块、上传下载文件模块
Ansible模块介绍——配置网络模块、上传下载文件模块
267 0
|
10月前
|
XML JSON Java
【SpringBoot学习笔记 二】YAML格式文件配置方式详解
【SpringBoot学习笔记 二】YAML格式文件配置方式详解
438 0