在Ansible中使用多个命令,需要在一行中显示文件详细信息

在Ansible中使用多个命令,需要在一行中显示文件详细信息,ansible,find,centos7,aix,ls,Ansible,Find,Centos7,Aix,Ls,我使用的是AIX6.1系统 我需要dd mm yyyy格式的文件权限文件所有者日期绝对文件路径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

我使用的是AIX6.1系统

我需要dd mm yyyy格式的文件权限文件所有者日期绝对文件路径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)"
以下是CentOS 7上的ansible命令的工作原理:

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\""
问题是,此解决方案在AiX 6.1系统上不起作用,我遇到以下错误:

find: bad option -printf
有人能为AiX的Ansible命令提供一个与上面共享的CentOS命令完全相同的解决方案吗?

模块没有实现find命令的全部功能。使用模块获取详细信息。例如下面的剧本

- 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..."
注释

默认情况下,模块find返回一个列表 默认情况下,校验和算法为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') }}
给予


此插件和其他插件可访问。

感谢您的帮助。我能得到校验和的输出吗?它是一个10位数的数字,而不是校验和给我的数字,因为它们都是不同的。另外,我正在寻找一些AiX命令建议,以获得类似的输出,而不是将ansible模块从shell更改为stat。module stat不提供cksum算法。@Ashar听起来好像您正在尝试将此ansible输出与一些预先存在的输出相匹配。与其让Ansible playbook过于复杂以引入校验和输出,我建议使用本机校验和,因为它将更加一致唯一,而不是chksum生成的本机循环冗余校验。旧的CRC值很容易发生冲突,并且可能导致两个不同文件具有相同的CRC值时出现误报。谢谢大家的输入!!
$ 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 ..."