我正在尝试在 YAML 文件中添加一些项目,从 ansible (核心 2.16.5)调用 yq (v4.43.1)。它正确插入值,但不带引号,这会使其成为有效的 yaml 文件。现在我使用 ansible.builtin.replace 在字符串周围添加引号,但我正在寻找更好的解决方案。
这是剧本,它假设 ansible 和 yq 已经在机器上:
---
- name: Customize cluster.yaml
hosts: localhost
vars:
rook_tag: "v1.14.0"
ceph_datapath:
rpi4b-1: "sda3"
rpi4b-2: "sda3"
rpi4b-3: "sda3"
rpi4b-4: "sda3"
rpi4b-5: "sda3"
rock3a: "nvme0n1p3"
vim4: "nvme0n1"
nanopct6: "mmcblk0p3"
opi5p: "mmcblk0p3"
rock5b: "mmcblk0p3"
tasks:
- name: Download cluster.yaml manifest from Internet
ansible.builtin.get_url:
url: "https://raw.githubusercontent.com/rook/rook/{{ 'release-' + '.'.join(''.join(rook_tag.split('v')[1:]).split('.')[:2]) }}/deploy/examples/cluster.yaml"
dest: ./cluster.yaml
mode: '0664'
- name: Set spec.storage.config.nodes
ansible.builtin.shell: >
/usr/local/bin/yq -i '.spec.storage.config.nodes += [{"name": "{{ item.key }}", "devices": [{"name": "{{ item.value }}"}]}]' cluster.yaml
with_dict: "{{ ceph_datapath }}"
register: command_output
changed_when: command_output.rc == 0
生成的 cluster.yaml 文件的相关部分是:
config:
nodes:
- name: rpi4b-1
devices:
- name: sda3
- name: rpi4b-2
devices:
- name: sda3
- name: rpi4b-3
devices:
- name: sda3
- name: rpi4b-4
devices:
- name: sda3
- name: rpi4b-5
devices:
- name: sda3
- name: rock3a
devices:
- name: nvme0n1p3
- name: vim4
devices:
- name: nvme0n1
- name: nanopct6
devices:
- name: mmcblk0p3
- name: opi5p
devices:
- name: mmcblk0p3
- name: rock5b
devices:
- name: mmcblk0p3
如何使用 yq 在名称周围添加引号?
谢谢你!
正如评论中所述,这(在大多数情况下)只是美观。但如果您确实想重新设置 YAML 文件的样式,可以使用 YAML 处理器mikefarah/yq将节点设置
style
为single
或double
引用样式。首先,遍历到所需的节点,然后应用,例如style = "double"
。例如,要设置以下所有值的样式
.config.nodes[].name
(遍历到config
,然后遍历到node
,然后迭代所有子项,最后下降到节点name
):或者,使用递归下降运算
..
符来到达所有项目: