Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用with_items循环将此方法用于变量的字符串串联是否正确?_Python_Ansible_Yaml_Jinja2_String Concatenation - Fatal编程技术网

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

Python 使用with_items循环将此方法用于变量的字符串串联是否正确?,python,ansible,yaml,jinja2,string-concatenation,Python,Ansible,Yaml,Jinja2,String Concatenation,输入文件 [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: c

输入文件

[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_items循环中,用于连接任务
-name:concate strings
中变量的方法是否正确 或 有没有更干净的方法

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

编辑:如何使用其他答案中描述的常规方法在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)) }}"

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

- 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\u 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}}"

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

- 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
或者使用字符串
执行相同的操作。join
方法:

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

感谢您的努力,我最初的问题是如何使用常用方法(如字符串连接或连接方法)连接?编辑问题