使用with\ items循环将此方法用于变量的字符串串联是否正确?

2024-04-27 04:34:26 发布

您现在位置:Python中文网/ 问答频道 /正文

输入文件

[centos@linux1 tmp]$ cat data.txt
a car has 4 wheels
a bike has 2 wheels

输出文件

[centos@linux1 tmp]$ cat final_list

vehicle: car blah blah
vehicle: bike blah blah

剧本

[centos@linux1 tmp]$ cat test.yml
---
- hosts: localhost
  tasks:
   - name: check vehicle types
     shell: "cat /tmp/data.txt | grep 'car\\|bike' | awk '{print $2}'"
     register: vehicle_list

   - name : create a empty string variable
     set_fact:
      var1: ''

   - name: concate strings
     set_fact:
      var1: "{{var1}}\nvehicle: {{item}} blah blah"
     with_items: "{{vehicle_list.stdout_lines}}"

   - name: output to file
     shell: echo "{{var1}}" >> /tmp/final_list

我能够得到想要的结果,但我认为代码是不可读的,其他人很难调试

问题:在with\u items循环中,用于连接task- name: concate strings中的变量的方法是否正确 或者 有更干净的方法吗?你知道吗

我希望使用herehere中提到的连接方法 但我没能让他们工作

编辑:如何在with items循环中实现字符串连接,使用其他答案中描述的常规方法?你知道吗

1)python字符串连接

var1=var1+"vehicle: {{item}} blah blah\n"

2)连接筛选器

var1: "{{vehicle: {{item}} blah blah | join('\n') }}" 

3)连接方法

var1: "{{ '\n'.join((vehicle: {{item}} blah blah)) }}"

Tags: 方法namewithitemsitemcartmplist
1条回答
网友
1楼 · 发布于 2024-04-27 04:34:26

我认为你可以在这里做一些改进。首先,此命令不需要catgrep

- name: check vehicle types
  shell: "cat /tmp/data.txt | grep 'car\\|bike' | awk '{print $2}'"
  register: vehicle_list

你可以写:

- name: check vehicle types
  command: "awk '/car|bike/ {print $2}' /tmp/data.txt"
  register: vehicle_list

接下来,您不需要第一个set_fact语句,因为您可以利用default过滤器为var1提供一个值(如果它尚未定义):

- name: concatenate strings
  set_fact:
    var1: "{{var1|default('')}}vehicle: {{item}} blah blah\n"
  with_items: "{{vehicle_list.stdout_lines}}"

注意,我还重新定位了\n,这样生成的文件就不会以空行开头。你知道吗

最后,使用shell任务将数据附加到文件中。如果您实际上不需要追加,您可以使用Ansible的copy模块来创建输出文件:

- name: output to file
  copy:
    content: "{{ var1 }}"
    dest: /tmp/final_list

如果确实需要附加数据,而不是覆盖文件,则可以使用当前的解决方案,尽管我可能会这样编写:

- name: output to file
  shell: "cat >> /tmp/final_list"
  args:
    stdin: "{{ var1 }}"

上述一种“常用方法”,但你肯定有其他选择。如果要建立一个行列表,如下所示:

- name: create list
  set_fact:
    var1: "{{var1|default([]) + ['vehicle: %s blah blah' % (item)] }}"
  with_items: "{{vehicle_list.stdout_lines}}"

然后可以使用join过滤器生成输出:

- name: output to file
  copy:
    content: "{{ var1|join('\n') }}"
    dest: /tmp/final_list

或者使用string.join方法执行相同的操作:

- name: output to file
  copy:
    content: "{{ '\n'.join(var1) }}"
    dest: /tmp/final_list

相关问题 更多 >