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
感谢您的努力,我最初的问题是如何使用常用方法(如字符串连接或连接方法)连接?编辑问题