我正在尝试将yml文件转换为json。我需要从file1.txt中选择yml文件列表,并将所有这些文件转换为json。
下面是我正在使用的代码
- hosts: localhost
tasks:
- name: convert yml to json
shell: cat /home/testadmin/{{ item }}.yml
register: result
- copy:
dest: ./{{ item }}.json
content: "{{ result.stdout | from_yaml | to_nice_json }}"
with_lines: cat file1.txt
代码应该从file1.txt中获取文件名,然后将文件1转换为1。我想知道如何循环使用所有这些命令将yml转换为json。
实际结果应替换file1.txt中的所有.yml文件,并转换为具有相同名称的json格式
答案 0 :(得分:1)
循环仅适用于它所附加的任务。要将多个任务包装在一个循环中,您需要将它们拆分到另一个文件中,使用include语句加载它们,然后将循环附加到该include语句。
在您的情况下,这些都不是必需的。我认为这应该可以满足您的要求,假设file1.txt包含文件名列表,每行一个,并且没有文件扩展名:
CREATE FUNCTION [dbo].[String_Split]
(
@InputString VARCHAR(8000),
@Delimiter VARCHAR(50)
)
RETURNS @Items TABLE
(
Item VARCHAR(8000)
)
AS
BEGIN
IF @Delimiter = ' '
BEGIN
SET @Delimiter = ';'
SET @InputString = REPLACE(@InputString, ' ', @Delimiter)
END
IF (@Delimiter IS NULL OR @Delimiter = '')
SET @Delimiter = ';'
DECLARE @Item VARCHAR(8000)
DECLARE @ItemList VARCHAR(8000)
DECLARE @DelimIndex INT
SET @ItemList = @InputString
SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
WHILE (@DelimIndex != 0)
BEGIN
SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex)
INSERT INTO @Items VALUES (@Item)
SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+1,
LEN(@ItemList)-@DelimIndex)
SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
END
IF @Item IS NOT NULL -- At least one delimiter was encountered in @InputString
BEGIN
SET @Item = @ItemList
INSERT INTO @Items VALUES (@Item)
END
ELSE INSERT INTO @Items VALUES (@InputString)
RETURN
END
GO
DECLARE @Table TABLE (a nvarchar(200), b nvarchar(200))
INSERT INTO @Table (a,b)
VALUES ('a1;a2;a3;a4;a5','b1,b2,b3,b4,b5')
,('a11;a12;a13;a14;a15','b11,b12,b13,b14,b15')
SELECT splitA.value FROM @Table
CROSS APPLY string_split(a,';') as splitA
- host: localhost
connection: local
tasks:
- name: Convert each file listed in file1.txt
copy:
dest: "./{{ item | trim }}.json"
content: "{{ lookup('file', item + '.yml') | from_yaml | to_nice_json }}"
with_lines: cat ./file1.txt
停止Ansible打开与本地主机的SSH连接connection: local
从列表中取出每个项目,并修剪所有前导或尾随空格{{ item | trim }}
读取文件。 lookup('file', item + '.yml')
是循环中使用的默认变量名,用于包含循环中每个元素的内容item
仅在本地工作,因此,如果需要远程运行它,则需要对其进行修改