Продолжение выполнимой задачи только при нахождении строк в зарегистрированной переменной - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть код Ansible ниже

- name: Try to delete file
  shell: rm -rf /tmp/"{{ file_Del }}"
  register: result
  ignore_errors: True 

- name: Display result
  debug:
    var: result.stdout

result.stdout может иметь значение
"result.stderr": "Ошибка сервера (NotFound): файл / tmp / somefile не найден"

ИЛИ
"result.stderr": "" <= в случае успеха <br>

Оба они действительны, но я хочу потерпеть неудачу..stderr».Пример: "result.stderr": "Команда rm -rf не найдена"


Как мне это сделать с помощью "end_play"

- meta: end_play
  when: "*Error from server (NotFound): file.*.*not found" not in result.stderr OR result.stderr ==""

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

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

На данный момент;более элегантное решение с использованием только модулей Ansible;

---
- hosts: local_test
  # gather_facts: False
  vars:
    file_Del: test
  tasks:
    - name: find some files at a location, recursively
      find:
        paths: "/tmp/{{ file_Del }}"
        recurse: true
      register: found_files

    - name: display files found, to be deleted, could be empty
      debug:
        msg: "Files found are {{ item.path }}"
      with_items:
        - "{{ found_files.files }}"

    - name: delete files when found
      file:
        path: "{{ item.path }}"
        state: absent
      with_items: "{{ found_files.files | default ([]) }}"

    - name: display files found, to be deleted, could be empty
      debug:
        msg: "{{ found_files }}"

    - name: end play when no files are found
      meta: end_play
      when: found_files.matched == 0

    - name: this task is skipped when there are no files found, but executed when files were deleted
      shell: echo hi

Относительно вашего вопроса с помощью "rm -rf Command not found";это выглядит необычно, например, вы запускаете playbook на хосте Linux и Windows, где задача не будет выполнена на хосте Windows.На каждом известном мне хосте Linux уже установлена ​​rm, даже большинство контейнеров Docker и хосты OpenBSD.

Возможно, было бы целесообразно разделить эти задачи для каждой среды.

Возможно, немногоконтекст может помочь нам, а в конечном итоге и вам.

0 голосов
/ 19 сентября 2019

rm не очень болтливый.См. rm -rf коды возврата .Но можно использовать find и xargs.Например, воспроизведение

- hosts: localhost
  vars:
    file_del: xxx
  tasks:
    - shell: "find /tmp/{{ file_del }} | xargs /bin/rm"
      ignore_errors: True 
      register: result
    - meta: end_play
      when: result.rc == 123
    - debug:
        msg: /tmp/{{ file_del }} found and deleted. Continue play.

дает (когда / tmp / {{file_del}} найден и удален)

"msg": "/tmp/xxx found and deleted. Continue play."

и завершает воспроизведение, когда файл не найден result.rc == 123.


Примечания

  • Убедитесь, что rc 123 сообщается, когда файл не найден
  • Возможно проверить результат.stderr

Если возможно, напишите пользовательскую команду.Например

$ cat my_custom_command.sh 
#!/bin/sh

if [ "$#" -eq "0" ]; then
   echo "[ERR 123] No files found.";
   exit 123;
fi

echo "Here I can do whatever I want with $@";
exit 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...