在Ansible中使用多个命令,需要在一行中显示文件详细信息
我使用的是AIX6.1系统 我需要dd mm yyyy格式的文件权限文件所有者日期绝对文件路径cksum值,所有值都用一个空格分隔 为此,我将find&cksum命令用于ansible shell模块 我更喜欢find而不是ls命令的原因是ls命令将根据文件的使用期限更改时间列格式,例如:如下所示:在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
-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 ..."