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月前
|
Kubernetes Linux 持续交付
在 Alibaba Cloud Linux 上搭建并配置 Ansible
本场景简单介绍了在Alibaba Cloud Linux上安装并配置Ansible的方式。
|
3月前
|
Linux 网络安全 数据安全/隐私保护
在 Alibaba Cloud Linux 上配置 Ansible
本场景是在 Alibaba Cloud Linux 上配置 Ansible
73 0
|
4月前
|
XML JSON Java
SpringBoot入门(三) 之springboot的配置配置文件以及yaml的使用
SpringBoot入门(三) 之springboot的配置配置文件以及yaml的使用
SpringBoot入门(三) 之springboot的配置配置文件以及yaml的使用
|
4月前
|
存储 Java 开发者
Spring Boot中的yaml配置简介
Spring Boot中的yaml配置简介
|
4月前
|
网络协议 网络安全 数据安全/隐私保护
Ansible模块介绍——配置网络模块、上传下载文件模块
Ansible模块介绍——配置网络模块、上传下载文件模块
132 0
|
6月前
|
XML JSON Java
【SpringBoot学习笔记 二】YAML格式文件配置方式详解
【SpringBoot学习笔记 二】YAML格式文件配置方式详解
124 0
|
9月前
|
Java Spring
spring的yaml配置
spring的yaml配置
74 0
|
10月前
|
XML JSON 数据格式
python小知识-好用的配置工具yaml
配置是开发中常用的手段,通过配置可以灵活的设置可变的参数,而不需要调整代码。 python中有使用不同的文件格式来做配置,如json,xml等。今天这里分享一个好用的配置工具yaml文件。
267 0
【初始环境】ansible配置/免密登录配置
文章目录 前言 一、ansible 二、结语
187 0
相关产品
云迁移中心
推荐文章
更多