Получите ошибку при использовании with_items и в ansible, пожалуйста, помогите - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь проверить, существует ли файл и создать резервную копию файла

   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 объект 'не имеет атрибута' 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Мы можем ошибаться, но похоже, что это может быть проблема с \ nmissing кавычками Всегда заключайте в скобки выражения шаблона, когда они \ n запускают значение. Например: \ n \ n with_items: \ n - {{foo}} \ n \ nДолжно быть записано как: \ n \ n with_items: \ n - \ "{ {foo}} \ "\ n"

Спасибо за ваше время. Теперь я изменил playbook, но получаю сообщение об ошибке


  • имя: статистика тестирования хосты модуля: все пользователь: root collect_fact s: Ложные задачи:

    • name: проверить, существует ли файл stat: путь: регистр "{{item}}": результат l oop:

      • / etc / shadow
      • / etc / sudoers
    • set_fact: my_stat: "{{dict (result.results | json_query ('[]. [] item.stat.exists] '))}} "

    • debug: var: my_stat

    • name: резервное копирование / etc / shadow и / etc / sudoers shell: cp -p "{{item}}" "{{item}}". $ (дата +% Y% m% d) когда: my_stat [item] | bool l oop:

      • / etc / shadow
      • / etc / sudoers ~ выше - playbook

ошибка:

ОШИБКА! Поле 'l oop' должно иметь строковый тип, однако структура входящих данных имеет вид

Ошибка, по-видимому, была в /home/m6080995/temproot/fileexis.yaml: line 7, столбец 9, но может находиться в другом месте файла в зависимости от точной синтаксической проблемы.

Неправильная строка выглядит так:

tasks:
  - name: Check the file existence
    ^ here

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

все еще получаю ошибку:

ОШИБКА! Поле 'l oop' должно иметь строковый тип, однако структура входящих данных имеет вид

. Ошибка, по-видимому, была в /home/m6080995/temproot/fileexis.yaml: line 7, столбец 9, но может находиться в другом месте файла, в зависимости от точной проблемы синтаксиса.

Кажется, что нарушающей строкой является:

tasks:
  - name: Check the file existence
    ^ here

ниже приведен список воспроизведения


  • имя: модуль статистики тестирования хосты: все пользователь: root collect_facts: ложные задачи:

    • имя: проверить, существует ли файл stat: путь : регистр "{{item}}": результат l oop:

      • / etc / shadow
      • / etc / sudoers
    • set_fact: my_stat: "{{dict (result.results | json_query ('[]. [Item.stat.exists]'))}}"

    • debug: var: my_stat

    • name: Резервное копирование оболочки / etc / shadow и / etc / sudoers: cp -p "{{item}}" "{{item}}". $ (дата +% Y% m% d) когда: my_stat [item] | bool l oop:

      • / etc / shadow
      • / etc / sudoers
0 голосов
/ 11 марта 2020

Зарегистрируйте 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

дает те же результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...