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

我有一个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。但这并不奏效。有可能吗

  - 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
。最终,参数化过滤器处理输入以获得输出。在这种情况下,结果是从作为参数传递的路径到作为输入传递的路径的相对路径。