Нужно указать детали файла в одной строке, используя несколько команд в Ansible - PullRequest
0 голосов
/ 22 сентября 2019

Я в системе AiX 6.1.

Мне нужны «права доступа к файлам», «владелец файла», «дата в формате дд-мм-гггг», «абсолютный путь к файлу», «значение cksum», разделенные одним пробелом.

Я использую команды "find" и "cksum" для этой цели с модулем ansible shell.

Причина, по которой я предпочитаю команду "find", а не "ls", заключается в том, что команда "ls" изменит командуформат столбца времени в зависимости от возраста файла, например: как показано ниже:

-rw-r--r--  1 root root 89 Aug 29 12:08 booking
-rw-r--r--  1 root bin   0 Oct 21  2016 basic.log

Команда ниже работает и дает мне желаемый вывод на Redhat Linux CentOs 7

find test.sh -printf "%M %u %TY-%Tm-%Td %TH:%TM %h/%f $(cksum<test.sh | cut -d' ' -f1)"

Вывод:

-rwxrwxr-x root 2019-08-29 17:25 ./test.sh 3522761671

Ниже приведена рабочая команда ANSI для CentOS 7 для того же самого:

ansible localhost -m shell -a "find test.sh -printf \"%M %u %TY-%Tm-%Td %TH:%TM %h/%f $(cksum<test.sh | cut -d' ' -f1)\n\""

Вывод:

localhost | CHANGED | rc=0 >>
-rwxrwxr-x root 2019-08-29 17:25 ./test.sh 3522761671

Проблема заключается в том, что это решение делаетне работает в системе AiX 6.1, и я получаю эту ошибку:

find: bad option -printf

Может кто-нибудь помочь предложить решение для команды Ansible для AiX, которое работает точно так же, как и команда CentOS, указанная выше?

1 Ответ

1 голос
/ 22 сентября 2019

Модуль find не реализует полную функциональность команды find .Используйте модуль stat для получения подробной информации.Например, игра ниже

- hosts: localhost
  tasks:
    - find:
        paths: /scratch/test1
        patterns: test.sh
        recurse: true
      register: results
    - set_fact:
        list_of_files: "{{ results.files|json_query('[].path') }}"
    - debug:
        var: list_of_files
    - stat:
        path: "{{ item }}"
        get_checksum: true
      loop: "{{ list_of_files }}"
      register: results
    - debug:
        msg: "{{ item.item }}
              {{ item.stat.mode }}
              {{ item.stat.pw_name }}
              {{ item.stat.mtime }}
              {{ item.stat.checksum }}"
      loop: "{{ results.results }}"

дает (сокращенно)

"list_of_files": [
    "/scratch/test1/bin/test.sh", 
    "/scratch/test1/sbin/test.sh"
]

"msg": "/scratch/test1/bin/test.sh 0664 admin 1569127708.13 d7b5ad41fb2c3..."
"msg": "/scratch/test1/sbin/test.sh 0664 admin 1569127711.13 fe20d6a0d3c2e..."

Примечания

  • По умолчанию модуль найти возвращает список
  • По умолчанию используется алгоритм контрольной суммы sha1
  • Использовать stat.atime , если необходимо "время доступа"
  • Использовать stat.ctime если необходимо "время создания"
  • Чтобы преобразовать дату, взгляните на файл манипуляций с форматом или написать плагин.

С плагином ниже

$ cat filter_plugins/datetime_filters.py
from datetime import date, datetime

def datetime_epoch_strftime(epoch, format='%Y-%m-%d %H:%M:%S'):
    return datetime.fromtimestamp(float(epoch)).strftime(format)

class FilterModule(object):
    ''' Ansible filters. Interface to Python datetime methods.

        datetime Basic date and time types
        https://docs.python.org/3/library/datetime.html'''

    def filters(self):
        return {
            'datetime_epoch_strftime': datetime_epoch_strftime
        }

измененный элемент отладки

{{ item.stat.mtime|datetime_epoch_strftime('%d-%m-%Y') }}

дает

"msg": "/scratch/test1/bin/test.sh 0664 admin 22-09-2019 20d6a0d ..."
"msg": "/scratch/test1/sbin/test.sh 0664 admin 22-09-2019 fe20d6a ..."

Этот плагин и другие доступнына GitHub .

...