前言:html
生產上有時須要根據指定內容查找相關文件,好比FastJson反序列化漏洞,經過'FastJson'關鍵字查找有無對應文件,若是有則進行整改。web
環境說明:bash
主機名 | 操做系統版本 | ip | ansible version | 備註 |
---|---|---|---|---|
ansible | Centos 7.6.1810 | 172.27.34.51 | 2.9.9 | ansible管理服務器 |
ansible-awx | Centos 7.6.1810 | 172.27.34.50 | / | 被管服務器 |
1、文件列表
[root@ansible-awx ~]# cd /opt
[root@ansible-awx opt]# ls -alrt
總用量 12
drwx--x--x 4 root root 28 5月 21 13:50 containerd
dr-xr-xr-x. 19 root root 250 7月 14 11:07 ..
drwxr-xr-x 2 root root 38 8月 6 15:34 find1
drwxr-xr-x 2 root root 38 8月 6 15:35 find2
drwxr-xr-x 2 root root 38 8月 6 15:35 find3
-rw-r--r-- 1 root root 12 8月 6 15:37 test1.txt
-rw-r--r-- 1 root root 12 8月 6 15:37 test2.txt
-rw-r--r-- 1 root root 12 8月 6 15:37 .test3.txt
drwxr-xr-x. 6 root root 115 8月 6 15:40 .
[root@ansible-awx opt]# find . -path ./containerd -prune -o -type f |xargs grep error
grep: ./containerd: 是一個目錄
./find1/find1.txt:aaaerrorbbb
./find1/.a1.txt:aaaerrorbbb
匹配到二進制文件 ./find2/find2.txt
./find2/.a2.txt:aaaerrorbbb
./find3/find3.txt:aaaerrorbbb
./find3/.a3.txt:aaaerrorbbb
./test1.txt:aaaerrorbbb
./.test3.txt:aaaerrorbbb
./test2.txt:aaaerrorbbb
[root@ansible-awx opt]# tail -n2 find2/find2.txt
aaaerrorbbb
[root@ansible-awx opt]# du -sm find2/*
201 find2/find2.txt
[root@ansible-awx opt]# tree -a
.
├── containerd
│ ├── bin
│ └── lib
├── find1
│ ├── .a1.txt
│ └── find1.txt
├── find2
│ ├── .a2.txt
│ └── find2.txt
├── find3
│ ├── .a3.txt
│ └── find3.txt
├── test1.txt
├── test2.txt
└── .test3.txt
6 directories, 9 files
在被管服務器test50的/opt目錄下構造測試數據,find一、find二、find3爲目錄,test1.txt、test2.txt爲文件,.test3.txt爲隱藏文件,3個find目錄都有兩個文件,一個txt文件和一個隱藏文件,這些文件都包含字符串'aaaerrorbbb',其中find2目錄的find2.txt大小爲201M。
服務器
2、role總覽
1.初始化role
[root@ansible roles]# ansible-galaxy init find
- Role find was created successfully
2.執行文件
[root@ansible ~]# cd /etc/ansible
[root@ansible ansible]# more find.yaml
---
- hosts: "{{ hostlist }}"
gather_facts: no
roles:
- role: find
role名爲find,hosts列表需執行的時候指定。微信
3.task文件
[root@ansible ansible]# more roles/find/tasks/main.yml
---
# tasks file for find
# author: loong576
- name: choose the directory
find:
paths: "{{ directory_path }}"
recurse: no
file_type: directory
excludes: "{{ exclude_directory }}"
register: find_directory
- name: find in directory
find:
paths: "{{item.path}}"
recurse: yes
contains: "{{ file_contains }}"
hidden: yes
size: "{{ file_size }}"
with_list: "{{find_directory.files}}"
register: find_contains_in_directory
- name: echo find file in directories
debug:
msg:
"{% for i in item.files %}
{{ i.path }}
{% endfor %}"
with_list: "{{find_contains_in_directory.results}}"
when: item.matched != 0
- name: find in files
find:
path: "{{ file_path }}"
file_type: file
excludes: "{{ exclude_file }}"
hidden: yes
contains: "{{ file_contains }}"
register: find_only_file
- name: echo find file in files
debug:
msg: "{{item.path}}"
with_list: "{{find_only_file.files}}"
執行邏輯
指定路徑下目錄查找app
首先選擇須要查找的指定路徑{{ directory_path }},這裏爲/opt,選擇的時候排除掉不須要的目錄{{ exclude_directory }};而後經過循環方式在選擇的目錄裏查找指定內容{{ file_contains }}並輸出查到的文件列表。運維
這裏的目錄指/opt下的find1和find2,find3被排除在外。ide
指定路徑下文件查找測試
查找指定路徑{{ directory_path }}下全部文件是否包含指定內容{{ file_contains }}並輸出文件列表,{{ exclude_file }}文件被排除在外。spa
這裏的文件指test1.txt、.test3.txt,test2.txt被排除在外。
全部的隱藏文件默認被查找'hidden: yes'且找到的文件大小不能超過{{ file_size }}即100M
4.default文件
[root@ansible ansible]# more roles/find/defaults/main.yml
---
# defaults file for find
directory_path: /opt
exclude_directory: find3
file_path: /opt
file_contains: .*error.*
exclude_file: test2.txt
file_size: -100m
指定查找的內容爲帶有'error'的文件,指定的路徑爲/opt,排查的目錄爲find3,排除的文件爲test2.txt,全部查找的文件大小小於100m。
3、運行role
1.預期
/opt下的目錄find1的文件find1.txt和隱藏文件.a1.txt被輸出;目錄find2的隱藏文件.a2.txt被輸出;/opt下的文件test1.txt和隱藏文件.test3.txt被輸出;被排除的目錄find3和被排除的文件test2.txt將不會被輸出;不知足大小要求的find2.txt也不會被輸出。
2.執行role
[root@ansible ~]# cd /etc/ansible/
[root@ansible ansible]# ansible-playbook find.yaml -e hostlist=test50
指定主機列表爲test50
結果符合預期
點擊‘閱讀原文’下載本文全部文件。
更多內容請關注公衆號:Linux運維實踐
本文分享自微信公衆號 - Linux運維實踐(gh_11cec8ef4c61)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。