循环中有多个不同的命令

时间:2019-01-17 15:06:03

标签: ansible

我正在尝试将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格式

1 个答案:

答案 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仅在本地工作,因此,如果需要远程运行它,则需要对其进行修改