Я использую блочный модуль в нижеприведенной книге. В принципе, если files существует, то только я хочу выполнить Play 2 и Play3, но по какой-то причине я получаю сообщение об ошибке при выполнении ниже playbook.

---
- name: Play 1
  hosts: 127.0.0.1
  tasks:
  - name: find the latest file
    find: paths=/var/lib/jenkins/jobs/process/workspace/files
          file_type=file
          age=-1m
          age_stamp=mtime
    register: files

  - name: Play 2 & 3 if Play 1 has a file
    block:
      - name: Play 2
        hosts: all
        serial: 5
        tasks:
          - name: copy latest file
            copy: src=data_init/goldy.init.qa dest=/data01/admin/files/goldy.init.qa

          - name: copy latest file
            copy: src=data_init/goldy.init.qa dest=/data02/admin/files/goldy.init.qa

      - name: Play 3
        hosts: 127.0.0.1
        tasks:
          - name: execute command
            shell: ./data_init --init_file ./goldy.init.qa
    when: files != ""

Ниже ошибка. Есть идеи, что я здесь делаю не так?

ERROR! no action detected in task. This often indicates a misspelled module name, or incorrect module path.

The error appears to have been in '/var/lib/jenkins/jobs/process/workspace/test.yml': line 14, column 9, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

    block:
      - name: Play 2
        ^ here
0
flash 9 Окт 2019 в 03:33
Пьесы не могут быть вложенными.
 – 
Vladimir Botka
9 Окт 2019 в 03:59
Понятно, как мне это исправить? В основном я хочу выполнять Play2 и Play3, только если в Play1 есть файлы. Возможно ли это сделать в ансибле?
 – 
flash
9 Окт 2019 в 04:02
Конечно. Просто запустите Play2 (или 3) и используйте переменные, объявленные в Play1. (Если это то, что вы хотите). Почему нужно начинать еще один спектакль?
 – 
Vladimir Botka
9 Окт 2019 в 04:07
Я не понял. Вы можете привести пример? В основном, если в модуле Play1 нет файлов, я даже не хочу запускать Play2 или Play3, поэтому я попытался использовать end_play, но он пропускает все задачи в Play1.
 – 
flash
9 Окт 2019 в 04:09
Вы тот, кто сделает это mcve. Шаг за шагом.
 – 
Vladimir Botka
9 Окт 2019 в 04:11

2 ответа

Я думаю, что путаница здесь связана с несоответствием Play < / a> и Заблокировать. Плейбуки Ansible могут содержать одну или несколько пьес, воспроизведение - это структура высшего порядка в плейбуке (помните, что плейбуки - это просто YAML, поэтому фактически все это структура данных). Блоки появляются, когда вы хотите эффективно объединить серьезную задачу в единицу, над которой вы можете выполнять групповые действия, например, условные выражения, а также для отлова ошибок и восстановления. Блоки - это часть игры, их можно поставить практически везде, где есть задача. Однако в синтаксисе вы определили новые пьесы, вложенные в другие, что недопустимо. Надеюсь, это поможет, удачной автоматизации!

0
Adam Miller 9 Окт 2019 в 05:02
Получил это сейчас. так как я могу делать то, что хочу? Обычно, если файлы не существуют в Play1, я вообще не хочу запускать Play2 и Play3. Возможно ли это сделать?
 – 
flash
9 Окт 2019 в 05:09
Вы можете подумать о том, чтобы разбить то, что вы хотите делать, на роли таким образом, чтобы эту серию задач можно было легко использовать повторно, а затем использовать Включает и Импорт, чтобы импортировать туда, куда вы хотите. Или просто иметь файл задачи, который вы импортируете / включаете.
 – 
Adam Miller
10 Окт 2019 в 18:16

В этом есть несколько ошибок, и я предполагаю, что вы новичок в анзибле. Вы не можете поставить имя на блок. ваша структура тоже неверна. файлы не определены. пытаться:

---
- name: Play 1
  hosts: 127.0.0.1



  tasks:
  - name: find the latest file
    find: paths=/var/lib/jenkins/jobs/process/workspace/files
          file_type=file
          age=-1m
          age_stamp=mtime
    register: files
  - debug:
      msg: "{{ files }}"
    when: files != ""

  - block:
    - name: copy latest file
      copy: src=data_init/goldy.init.qa dest=/data01/admin/files/goldy.init.qa

    - name: copy latest file
      copy: src=data_init/goldy.init.qa dest=/data02/admin/files/goldy.init.qa

    - name: execute command
      shell: ./data_init --init_file ./goldy.init.qa
    when: files != ""
0
Mark Garcia 9 Окт 2019 в 12:38
Я не вижу разницы в вашем скрипте ansible по сравнению с моим. Думаю, это то же самое.
 – 
flash
9 Окт 2019 в 09:57
Извиняюсь, я вставил ваш сценарий. Я редактировал, пожалуйста, протестируйте.
 – 
Mark Garcia
9 Окт 2019 в 10:14
Привет, флэш, попробуй использовать этот скрипт. Он должен работать, если ваша система настроена правильно.
 – 
Mark Garcia
9 Окт 2019 в 14:52
Думаю, вы ошибаетесь. Play1 Я работаю на своем компьютере с локальным хостом, но Play2 запускается на удаленных серверах, а затем снова Play3 на моем компьютере с локальным хостом, поэтому я не думаю, что смогу объединить все в одной игре.
 – 
flash
9 Окт 2019 в 19:47
Хорошо, теперь я понимаю. Попробуйте использовать delegate_to
 – 
Mark Garcia
9 Окт 2019 в 19:58