我尝试使用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'"
}
答案 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
命令的输出结构进行一些研究。