Ansible:如何用项目替换字符串中的文本
我有一个Ansible命令,它会返回目录列表:Ansible:如何用项目替换字符串中的文本,ansible,Ansible,我有一个Ansible命令,它会返回目录列表: - local_action: command find {{ role_path }}/files -type f register: result 例如,它返回两个路径:path/files/a/1.zip和path/files/a/2.zip。我需要剪切字符串路径/文件的开头,保留/a/1.zip和/a/2.zip,并注册删除这些文件的结果。我尝试了regex\u替换并使用sed替换shell。但这并不奏效。有可能吗 - comma
- local_action: command find {{ role_path }}/files -type f
register: result
例如,它返回两个路径:path/files/a/1.zip
和path/files/a/2.zip
。我需要剪切字符串路径/文件的开头,保留/a/1.zip
和/a/2.zip
,并注册删除这些文件的结果。我尝试了regex\u替换并使用sed
替换shell。但这并不奏效。有可能吗
- command: "echo {{item}} | sed s/'{{ role_path }}/files'/''"
with_items: "{{result.stdout_lines}}"
register: script_results
- msg: {{ item | regex_replace('/path/files','\\1') }}
with_items: "{{result.stdout_lines}}"
如注释中所述:首先不应使用命令。您可以将任务委托给127.0.0.1
,任务应该在您执行剧本的机器上执行
您可以使用删除路径的开头,还可以使用带有属性的映射过滤器方便地提取路径:
- find:
path: "{{ role_path }}"
recurse: yes
register: result
delegate_to: 127.0.0.1
- debug:
msg: "{{ item | relpath(role_path) }}"
with_items: "{{ result.files | map(attribute='path')}}"
您将获得的输出类似于下面的示例。这些值不是以斜杠开头的,但是我认为您可以很容易地解决这个问题
ok: [127.0.0.1] => (item=/path/to/role/dir/file_1) => {
"item": "/path/to/role/dir/file_1",
"msg": "dir/file_1"
}
使用模块而不是与shell命令跳舞怎么样?您不能在命令
任务中使用类似|
的shell功能。您需要使用shell
任务。我想使用ansible find,但我只能在客户端本地运行它。我需要找到存储在角色中的文件。所以在shell中查找命令对我来说很好。@larsks当我使用这个shell时:${{{{item}}}{{{role\u path}}/files/}我得到错误-模板字符串时模板错误:预期的标记“:”,得到“}”。当我使用这个shell:echo{{item}}sed's/{{role_path}}}/files/'我得到错误-sed-e:-e expression#1,char 162:unterminated`s'命令谢谢你对relpath的想法。但是在调试部分中,我有点混淆了如何使这个{item | relpath(role_path+'/files')}}。是这样吗?ansible对此操作是否有特殊的部分?@Risha:这被调用,其含义是左侧的内容作为输入传递给过滤器。在这种情况下,过滤器本身也可以具有参数role\u path
。最终,参数化过滤器处理输入以获得输出。在这种情况下,结果是从作为参数传递的路径到作为输入传递的路径的相对路径。