Доступные разрешения на изменение с использованием идемпотента файлового модуля

Я каждую ночь прогоняю свои ansible playbooks через задание cron, время от времени добавляя к ним.

Я хочу, чтобы в моем выводе для каждого из них говорилось только измененное = (число), если действительно есть изменение, но несколько конкретных модулей говорят, что изменено, когда они не были изменены вообще.

EX:

- name: (name)
  file:
    state: touch
    path: (path)
    group: (group)
    mode: (perms)

Путь до запуска задачи содержит ту же группу и разрешения, что и запрошенные разрешения и группа. Таким образом, они не меняются при запуске задачи, но в ответе на доступный результат говорится, что он «изменился».

Я просмотрел эту проблему и обнаружил, что https://github.com/ansible/ansible/issues/21124, но я использую ansible 2.2.1.0. Насколько я понимаю, они указывают на то, что файловый модуль идемпотентен.

Есть ли предложения сделать его идемпотентным?


person Dorilds    schedule 12.07.2018    source источник


Ответы (4)


Чтобы идемпотентно создать файл с помощью файлового модуля в доступе, вам необходимо отдельно проверить, существует ли файл, создать его и установить какие-либо разрешения (поскольку вы хотите, чтобы они были установлены правильно, независимо от того, существует ли файл уже или нет).

Это может быть выполнено с помощью 3 следующих задач:

- name: Check if file exists
  stat:
    path: /tmp/file
  register: tmp_file

- name: Create file
  file:
    path: /tmp/file
    state: touch
  when: tmp_file.stat.exists == false

- name: Set perms of file
  file:
    path: /tmp/file
    state: file
    owner: user
    group: group
    mode: 0600
person ciphersimian    schedule 29.07.2019

они не меняются при запуске задачи, но результат Ansible говорит, что он «изменился».

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

Не используйте touch, используйте другое подходящее состояние (file, directory, link).


В противном случае вы можете установить changed_when: false, но я не думаю, что это имеет смысл, учитывая, что вы хотите проверить вывод.

person techraf    schedule 12.07.2018
comment
Я понял, что хотел использовать состояние касания, чтобы убедиться, что оно существует, но затем я просто запускаю модуль статистики, чтобы проверить, существует ли он - person Dorilds; 12.07.2018

Проблема в том, что state: touch по умолчанию изменяет время доступа и изменения целевого пути. Поэтому, даже если ничего не изменится, прикосновение приведет к изменению.

Начиная с Ansible 2.7, вы можете использовать переменные access_time и modification_time для создания file с touch идемпотентом.

- name: Touch file
  file:
    path: /etc/file.conf
    state: touch
    access_time: preserve
    modification_time: preserve

(исходное решение от Нкля)

person fap    schedule 16.03.2021

Идемпотентный вариант прикосновения к файлу:

- command: touch file
  args:
    creates: file
person Vladimir Botka    schedule 12.07.2018