ansible - 使用 with_items 和 ansible 时出现错误,请您帮忙
问题描述
我正在尝试检查文件是否存在并备份文件
tasks:
- name: Check the file existence
stat:
path: "{{item.file}}"
register: "{{item.name}}"
with_items:
- { name: shadow, file: /etc/shadow }
- { name: sudoers, file: /etc/sudoers }
- name: Backing up the /etc/shadow and /etc/sudoers
shell: cp -p "{{item.file}}" "{{item.file}}".$(date +%Y%m%d)
when: item.when.stat.exists
with_items:
- { file: /etc/shadow, when: "shadow" }
- { file: /etc/sudoers, when: "sudoers" }
错误: 致命:[c369hmx]:失败!=> {“msg”:“条件检查'item.when.stat.exists'失败。错误是:评估条件时出错(item.when.stat.exists):'ansible.parsing.yaml.objects.AnsibleUnicode object' 没有属性 'stat'\n\n错误似乎出现在 '/home/m6080995/temproot/fileexis.yaml': 第 16 行第 7 列,但可能\n在文件中的其他位置,具体取决于确切的语法问题。\n\n违规行似乎是:\n\n #- name: 备份 /etc/shadow 和 /etc/sudoers\n - shell: cp -p \"{{item.file}}\ " \"{{item.file}}\".$(date +%Y%m%d)\n ^ 在这里\n我们可能错了,但这个看起来可能是\n缺少引号的问题。总是当它们\n开始一个值时引用模板表达式括号。例如:
感谢您的宝贵时间现在我修改了剧本,但出现错误
名称:测试统计模块主机:所有用户:rootgather_facts:错误任务:
name: 检查文件是否存在 stat: path: "{{item}}" register: result loop:
- /etc/影子
- /etc/sudoers
set_fact: my_stat: "{{ dict(result.results|json_query('[].[item.stat.exists]')) }}"
调试:var:my_stat
name: 备份 /etc/shadow 和 /etc/sudoers shell: cp -p "{{ item }}" "{{ item }}".$(date +%Y%m%d) when: my_stat[item ]|布尔循环:
- /etc/影子
- /etc/sudoers ~ 以上是剧本
错误:
错误!字段“循环”应该是字符串类型,但是传入的数据结构是
该错误似乎出现在“/home/m6080995/temproot/fileexis.yaml”中:第 7 行第 9 列,但根据确切的语法问题,可能在文件中的其他位置。
违规行似乎是:
tasks:
- name: Check the file existence
^ here
解决方案
result
在单个变量中注册并创建包含文件状态的字典。例如
- name: Check the file existence
stat:
path: "{{ item }}"
register: result
loop:
- data/shadow
- data/sudoers
- set_fact:
my_stat: "{{ dict(result.results|json_query('[].[item,stat.exists]')) }}"
- debug:
var: my_stat
给
"my_stat": {
"data/shadow": true,
"data/sudoers": true
}
那么条件是微不足道的
- name: Backing up the /etc/shadow and /etc/sudoers
shell: cp -p "{{ item }}" "{{ item }}".$(date +%Y%m%d)
when: my_stat[item]|bool
loop:
- data/shadow
- data/sudoers
给
shell> ls -1 data
shadow
shadow.20200311
sudoers
sudoers.20200311
使用copy
模块而不是shell
. 例如
- copy:
remote_src: true
src: "{{ item }}"
dest: "{{ item ~ '.' ~ lookup('pipe', 'date +%Y%m%d') }}"
when: my_stat[item]|bool
loop:
- data/shadow
- data/sudoers
给出相同的结果。
推荐阅读
- mongodb - 错误:TypeError:user.insertOne 不是使用猫鼬的函数
- python - 将熊猫数据框从日期时间转换为年份
- python - 将列表中的每个项目与其他列表 Python 中的其他项目进行比较
- json - GSON 多态反序列化无法使用 RuntimeTypeAdapterFactory 反序列化 `type` 属性
- django - 如何在 django 中从一个应用程序向另一个应用程序发出通知?
- flutter - 当我启动时,第一页(Dart 文件)将在 Flutter App 中运行
- reactjs - 优化 reactjs 中的拖动单元格表?
- r - 比较两条曲线的趋势差异
- openmpi - abinit 中的字符串方法教程 - 未生成输出文件
- python - 如何读取我的 exel 表中的特定数据并从读取的每个数据集创建一个图?(Python)