Ansible 替换目录中多个文件中的代码

com*_*ewb 5 linux centos ansible

我正在尝试使用 ansible 禁用我服务器上的所有存储库,因此我正在尝试对一个目录中的多个文件进行替换,但似乎无法让它工作,任何想法都值得赞赏!

tasks:

  - name: get repo names
    raw: find /etc/yum.repos.d/ -type f -name "*.repo"
    register: repos

  - name: disable all repos
    replace: dest={{repos}} regexp="enabled=1" replace="enabled=0"
    with_items: repos.stdout_lines
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我只是收到一个错误,就像它试图一次完成所有这些?如果是这样,我将如何拆分它们?

/etc/yum.repos.d/CentOS-Debuginfo.repo\r\n/etc/yum.repos.d/epel.repo\r\n/etc/yum.repos.d/CentOS-Base.repo\r \n'} 不存在!",

更新:

  - find:
      paths: "/etc/yum.repos.d/"
      patterns: "*.repo"
    register: repos

  - name: disable all repos
    replace: dest={{items}} regexp="enabled=1" replace="enabled=0"
    with_items: repos
Run Code Online (Sandbox Code Playgroud)

新错误如下:“msg”:“字段‘args’有一个无效值,它似乎包含一个未定义的变量。错误是:‘items’未定义

好的 越来越近了!现在在禁用回购中收到此错误:

FAILED! => {
    "failed": true,
    "msg": "'dict object' has no attribute 'stdout_lines'"
}
Run Code Online (Sandbox Code Playgroud)

Ala*_*nSE 10

这个问题似乎在没有完全完成的情况下就消失了……至少在使用时没有find。这是备受追捧的两步流程的示例。raw第一种情况的使用情况已得到答复。但我发现这个解决方案更有吸引力,即使更难:

tasks:
- name: Find all of the files inside this directory
  find:
    paths: "/etc/yum.repos.d/"
    patterns: "*.repo"
  register: repos

- name: Replace foo with bar in the files
  replace:
    path: "{{ item.path }}"
    regexp: 'foo'
    replace: 'bar'
  with_items: "{{ repos.files }}"
Run Code Online (Sandbox Code Playgroud)

这需要对命令的输出结构进行一些研究find


tec*_*raf 4

它是“一次尝试所有这些”,因为您提供前一个任务的整个输出作为以下参数dest

dest={{repos}}
Run Code Online (Sandbox Code Playgroud)

相反,您应该提供您迭代的项目:

dest={{item}}
Run Code Online (Sandbox Code Playgroud)

您也不引用with_items.

第二个任务应该是这样的:

- name: disable all repos
  replace: dest={{item}} regexp="enabled=1" replace="enabled=0"
  with_items: "{{ repos.stdout_lines }}"
Run Code Online (Sandbox Code Playgroud)

此外,您可以使用find模块代替raw命令。