Назад | Перейти на главную страницу

Ansible: как проверить зарегистрированную переменную на условность?

Пытаетесь использовать Ansible для поиска и изменения всех владельцев файлов с user_01 на user_02?

  - name: "Find files for user_01 or UID of user_01_uid"
    command: "find / -path /proc -prune -o -path /sys -prune -o  \\( -user user_01 \\) -o  \\( -uid user_01_uid \\)"
    # escape character "\" prior to backslash character "\"   \\. Spacing to work with Ansible CentOS 7
    ignore_errors: yes
    register: files_2_change

  - name: "Display files_2_change"
    debug:
      msg: "{{ files_2_change.stdout_lines }}"

  - name: "Change owner & group permissions"
    file: 
      path: "{{ files_2_change.stdout_lines }}"
      owner: user_02
      group: user_02
      mode: 0760
      modification_time: preserve   # now
    when: 
      - files_2_change != '/proc'
      - files_2_change != '/sys'


    # Better soln for chown
    # command: "chown -h -R --from=user_01:user_01 user_02:user_02 {{ files_2_change.stdout_lines }}"

Проблема в том, что вы пытаетесь выполнить условную проверку всего files_2_change переменная, когда то, что вас действительно интересует, - это выполнение условной проверки каждого элемента списка, который вы повторяете. К сожалению, из-за как Ansible обрабатывает условные выражения в циклах, вы не можете просто перебрать file модуль и каждый раз проводите проверку.

Я бы порекомендовал добавить дополнительную задачу обработки до фактического file задача отбросить нежелательные пути, используя понимание списка Python:

- name: "Process files_2_change, dropping unwanted files"
  set_fact:
    processed_files_2_change: >
      {{ processed_files_2_change | default([]) +
        [ item ] if '/proc' not in item and '/sys' not in item else []
      }}
  loop: "{{ files_2_change.stdout_lines }}"

- name: "Change owner & group permissions"
  file: 
    path: "{{ item }}"
    owner: user_02
    group: user_02
    mode: 0760
    modification_time: preserve
  loop: "{{ processed_files_2_change }}"

Обновление: это то, что я получил после отзыва здесь (17 июля 2019 г.).

В исключения добавлен / var / spool / mail.

Текущие испытания, кажется, работают.

  - name: "Find files for user_X or UID of user_X_uid"
    command: "find / -path /proc -prune -o -path /sys -prune -o  \\( -user user01 \\) -o  \\( -uid 1051 \\)"
    ignore_errors: yes
    register: files_2_change


  - name: "Change owner & group permissions"
    file: 
      path: "{{ item }}"
      owner: user02
      group: user02
      mode: 0771          # If there are directories - 0760 will make them not accessible for the group.
      modification_time: preserve
    loop: "{{ files_2_change.stdout_lines }}"
    when: 
      - item is not search('^/proc')
      - item is not search('^/sys')
      - item is not search('^/var/spool/mail')

Спасибо всем за ваш вклад и помощь!

Атрибут дорожка в модуле файл требуется строка. Список должен потерпеть неудачу.

фатальный: [localhost]: НЕ ВЫПОЛНЕНО! => {"msg": "ошибка шаблона при создании строки шаблона: неожиданно ')'. Строка: {{files_2_change.stdout_lines))"}

(так же, как с обработано_files_2_change)

Вместо этого можно зациклить список.

- name: "Change owner & group permissions"
  file: 
    path: "{{ item }}"
    owner: user_02
    group: user_02
    mode: 0760
    modification_time: preserve   # now              
  loop: "{{ files_2_change.stdout_lines }}"
  when: 
    - item is not search('^/proc')
    - item is not search('^/sys')

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

Ноты

  • Использовать найти вместо "команда:" найти ... "
  • Если в files_2_change.stdout_lines режим режим: 0760 сделает их недоступными для группы.