Коснитесь файла журнала с помощью Ansible, только если он не начинается с __ - PullRequest
0 голосов
/ 07 октября 2019

Используя Ansible 2.7.13, я пытаюсь выполнить касание файлов журнала в списке, только если имя файла начинается с __. Кажется, я не могу запустить его.

Вот мой код:

# file touch.yml
- name: Touch
  file:
    path: "{{ item }}"
    state: touch
    mode: '0777'
  when: not (item | basename | regex_search("^__"))
  with_items:
    - "{{ touch_files }}"

Я вызываю это с помощью

touch_files:
        - "{{ path }}/job_count.json"
        - "{{ path }}/query_time.json"
        - "{{ path }}/disk_usage.json"
        - "{{ path }}/__revert__"

В результате:

ERROR! 'when' is not a valid attribute for a Play[0m
The error appears to have been in '... /playbooks/touch.yaml': line 3, column 3, but may be elsewhere in the file depending on the exact syntax problem.

Ожидаемый результат: файлы, перечисленные в списке touch_files, касаются. Файл __revert__ не затрагивается.

В чем здесь проблема?

Заранее большое спасибо!

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Ошибка предполагает, что вы не завернули свою задачу в игру . Необходимо указать хосты, на которых будут выполняться задачи, и другие необязательные параметры.

loop предпочтительнее, чем with_items сейчас. Вы также передавали ему список списков.

Пример книги с заданием:

- hosts: <the-hosts-you-want-to-run-the-playbook-on>
  tasks:
    - name: Touch
      file:
        path: "{{ item }}"
        state: touch
        mode: '0777'
      when: item | basename is startedwith '__'
      loop: "{{ touch_files }}"

Я создал пользовательский тест startedwith, чтобы сделать его немного более читабельным:

from ansible.errors import AnsibleFilterError

class TestModule(object):
  def tests(self):
    return {
      'startedwith': self.startedwith,
    }

  def startedwith(self, text, starts):
    if not isinstance(text, basestring):
      raise AnsibleFilterError(
        'Argument to `startedwith` expected to be a string'
      )
    return text.startswith(starts)

Есть много мест, где вы можете поместить его, но, вероятно, наиболее подходящим является каталог test_plugins в том же каталоге, что и ваша книга воспроизведения. Назовите файл startedwith.py или как вам угодно.

Подробнее см. ansible docs .

1 голос
/ 07 октября 2019

Q: "Выполните прикосновение файлов журнала в списке, только если имя файла начинается с __"

A: В коде есть проблемы

  • when должен использоваться вне списка loop
  • touch_files;цикл списков списков не может работать
  • when условие неверно

Попробуйте выполнить следующую задачу

- name: Touch
  file:
    path: "{{ item }}"
    state: touch
    mode: '0777'
  loop: "{{ touch_files }}"
  when: "item|basename is regex('^__(.*)$')"

(не проверено)

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