Ansible替换目录

时间:2017-02-23 12:22:59

标签: 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

当我运行这个时,我只是得到一个错误,就像它试图一次完成它们一样?如果是这样的话,我该怎么把它们分开呢?

  

/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

新错误如下: " msg":"字段' args'具有无效值,似乎包含未定义的变量。错误是:' items'未定义

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

FAILED! => {
    "failed": true,
    "msg": "'dict object' has no attribute 'stdout_lines'"
}

3 个答案:

答案 0 :(得分:3)

它是“一次尝试所有”,因为你提供前一个任务的整个输出作为dest的参数:

dest={{repos}}

相反,你应该喂食你迭代的物品:

dest={{item}}

您也不引用with_items中的变量。

第二项任务应如下所示:

- name: disable all repos
  replace: dest={{item}} regexp="enabled=1" replace="enabled=0"
  with_items: "{{ repos.stdout_lines }}"

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

答案 1 :(得分:0)

错误是:'items'未定义

这是因为你必须使用“item”而不是

中的项目
 dest=

(dest={{item}})

,但items

所以正确的方法是:

- name: disable all repos
  replace: dest={{item}} regexp="enabled=1" replace="enabled=0"
  with_items: repos

答案 2 :(得分:0)

这个问题似乎没有完全完成就解决了……至少没有使用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 }}"

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