因此,我一直试图通过使用游戏手册来修复我在所有服务器上犯的错误。简单地说,我启动了一个带有日志旋转的游戏手册来解决不断增长的日志问题,在其中有一个名为btmp的日志,我本来不应该旋转它,但无论如何都是偶然地旋转的,现在log旋转式改变了它的名称,为它添加了一个日期,从而阻止了日志。现在我想使用一个剧本,它将在/var/log目录中找到一个名为btmp的日志,并将其重命名,问题是在每个服务器中,文件atm是不同的--例如,一个服务器有btmp-20210316,另一个服务器有btmp-20210309,因此在bash命令行中,一个将使用通配符"btmp*“来绕过thos问题,但是这在剧本中似乎不起作用。到目前为止,我想出了这个:
tasks:
- name: stat btmp*
stat: path=/var/log
register: btmp_stat
- name: Move btmp
command: mv /var/log/btmp* /var/log/btmp
when: btmp_stat.stat.exists但是,这会导致找不到文件的错误。因此,我的问题是,如何使通配符在剧本中工作,或者是否有一种同等的方法来查找所有在其名称中包含"btmp“的文件并将其重命名?顺便说一下,所有服务器都是Centos 7服务器。
因此,我也会添加我自己的解决方案,即使答案的解决方案更好。在ansible中的任何地方,用一行创建bash脚本。行是: mv /var/log/filename* /var/log/filename
现在创建一个在目标VM中操作的剧本:
---
- hosts: '{{ server }}'
remote_user: username
become: yes
become_method: sudo
vars_prompt:
- name: "server"
prompt: "Enter server name or group"
private: no
tasks:
- name: Move the script to target host VM
copy: src=/anywhereyouwant/bashscript.sh dest=/tmp mode=0777
- name: Execute the script
command: sh /tmp/bashscript.sh
- name: delete the script
command: rm /tmp/bashscript.sh发布于 2021-03-16 13:54:08
在Ansible中有不止一种方法可以做到这一点,使用shell模块当然是一种可行的方法(但是您需要使用shell模块来代替command,因为后者不支持通配符)。我会以以下方式解决这个问题:
/var/log/btmp*),并将它们存储在变量中供以后处理--如下所示: - name: Find all files named /var/log/btmp*
ansible.builtin.find:
paths: /var/log
patterns: 'btmp*'
register: find_btmp此任务使用find模块在/var/log中定位所有名为btmp*的文件--结果存储在一个名为find_btmp的变量中。
- name: Copy the btmp* to the required filename
ansible.builtin.copy:
src: "{{ find_btmp.files | sort(attribute='mtime',reverse=true) | map(attribute='path') | first }}"
dest: /var/log/btmp
remote_src: yes
when: find_btmp.failed == false此任务使用Ansible的copy模块将所选源文件复制到/var/log/btmp。remote_src: yes参数告诉复制模块源文件存在于远程计算机上,而不是Ansible主机本身。
如果找不到任何文件,则使用when子句确保不运行此复制操作。
现在,让我们分解一下Jinja2过滤器:
find_btmp.files --这是我们的find_btmp variablesort(attribute='mtime',reverse=true)中列出的所有文件--在这里,我们使用mtime (修改时间)属性对文件列表进行排序--我们正在反向排序,以便最新的条目位于list.map(attribute='path')的顶部--我们使用地图“提取”文件字典的path属性,由于这是我们实际上希望传递给复制模块(文件itselffirst的路径)的唯一数据,因此它只选择列表中的第一个元素(即最新的文件,因为它们是您请求移动操作的反向sorted))
- name: Delete the original file
ansible.builtin.file:
path: "{{ find_btmp.files | sort(attribute='mtime',reverse=true) | map(attribute='path') | first }}"
state: absent
when: find_btmp.failed == false同样,我们使用一个when子句来确保如果我们一开始没有找到它,我们就不会删除它。
我已经在Ansible 3.1.0/ Ansible -base 2.10.7上测试了这一点--如果您正在运行Ansible 2.9或更早版本,请从模块名中删除ansible.builtin. (即ansible.builtin.copy变为copy)。
希望这能帮到你!
https://stackoverflow.com/questions/66654451
复制相似问题