这篇是几年前写的文章,之前一直纠结按照知识的学习顺序去发布文章,所以有些文章写了但没有发出来,最近准备把之前写的文章发一发,不纠结这个问题了,不然好多文章可能因为软件版本过时等问题写了都过期了,帮助不到大家了。
本篇文章看标题便可以得知大概内容是与Ansible有关,我们需要用到的就是Ansible的find模块,find模块给了我们很多参数,但是不涉及查找文件的返回值,所以我们需要自己去定义。
如下面playbook所示,我们的需求是查找在test主机组下面的主机是否有后缀名为locked的文件,有的话,我们需要将其文件名输出到屏幕上并且记录到ansible的指定目录下面,方面我们后续去查找。
1、定义hosts主机清单
[root@template ansible]# cat hosts
[test]
192.168.101.113
192.168.11.112
192.168.100.45
192.168.66.61
192.168.66.67
192.168.66.68
192.168.66.253
192.168.88.19
192.168.88.20
192.168.88.21
192.168.88.30
192.168.88.31
2、编辑playbook
[root@template ansible]# cat find_locked.yaml
---
- name: Find locked files
hosts: test
tasks:
- name: Find files with locked extension
find:
paths: /
recurse: yes
patterns: "*.locked"
register: locked_files # 将内容注册为变量,方便后续输出与写入
- name: Print locked file paths
debug:
var: locked_files.files|map(attribute='path')|list # 输出定义的变量内容
- name: Write locked file paths to a file
local_action: # 本地的动作字段
module: copy
content: "{{ locked_files.files|map(attribute='path')|list|join('\n') }}"
dest: /koten/find_result_{{ inventory_hostname }}.txt
when: locked_files.files|length > 0 # 加条件,如果找到文件才会写入,否则会所有主机写入一遍文本,但是有的没有内容
3、检查并执行playbook
如果要操作的主机没有做免密钥的话需要先做免密钥
[root@template ansible]# ansible-playbook --syntax-check find_locked.yaml
playbook: find_locked.yaml
[root@template ansible]# ansible-playbook -i hosts find_locked.yaml
4、执行后在当前目录显示了最终的目录结构如下
[root@template ansible]# ls
find_locked.yaml find_result_192.168.11.112.txt find_result_192.168.101.113.txt hosts
5、内容为主机中后缀名为locked的文件路径
[root@template ansible]# cat find_result_192.168.11.112.txt
/data/logs/error.log.locked
/data/logs/info.log.locked
/data/logs/warn.log.locked
/data/logs/base.log.locked
/data/logs/httpLog.log.locked
/data/logs/sql.log.locked
...
我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!