首页 > 解决方案 > 使用 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开始一个值时引用模板表达式括号。例如:

感谢您的宝贵时间现在我修改了剧本,但出现错误


错误:

错误!字段“循环”应该是字符串类型,但是传入的数据结构是

该错误似乎出现在“/home/m6080995/temproot/fileexis.yaml”中:第 7 行第 9 列,但根据确切的语法问题,可能在文件中的其他位置。

违规行似乎是:

tasks:
  - name: Check the file existence
    ^ here

标签: ansible

解决方案


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

给出相同的结果。


推荐阅读