gpt4 book ai didi

ansible - 查找文件并将其重命名为 ansible playbook

转载 作者:行者123 更新时间:2023-12-04 19:35:34 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to move/rename a file using an Ansible task on a remote system

(13 个回答)


去年关闭。




所以我一直在尝试通过使用剧本来修复我在所有服务器中犯的错误。基本上,我启动了一个带有 logrotate 的剧本来解决不断增长的日志问题,其中有一个名为 btmp 的日志,我不应该旋转它,但无论如何还是意外地做了,现在 logrotate 更改了它的名称以添加一个日期,因此刹车日志。现在我想使用一个剧本,它将在/var/log 目录中找到一个名为 btmp 的日志并将其重命名,问题是每个服务器中的文件 atm 都不同,例如 1 个服务器有 btmp-20210316,另一个有 btmp- 20210309,所以在 bash 命令行中可以使用通配符“btmp*”来绕过这个问题,但是这在剧本中似乎不起作用。到目前为止,我想出了这个:

  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 VM 中的任何地方用一行编写一个 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

最佳答案

在 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用于定位所有名为 btmp* 的文件的模块在 /var/log - 结果存储在一个名为 find_btmp 的变量中.
  • 接下来创建一个任务,将 btmp* 文件复制到 btmp。现在您很可能有超过 1 个文件路径上述模式,从逻辑上讲,您不想将它们全部重命名为 btmp,因为这只是每次都覆盖文件。相反,假设您只需要匹配的最新文件 - 我们可以使用聪明的 Jinja2 过滤器从第一个任务的结果中获取此条目:
  •     - 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 中列出的所有文件变量
  • sort(attribute='mtime',reverse=true) - 这里我们使用 mtime 对我们的文件列表进行排序(修改时间) 属性 - 我们正在反向排序,以便最新条目位于列表顶部。
  • map(attribute='path') - 我们正在使用 map “提取”path files 字典的属性,因为这是我们真正想要传递给复制模块的唯一数据 - 文件本身的路径
  • first - 这只会选择列表中的第一个元素(即最新的文件,因为它们是反向排序的)
  • 最后,您要求进行移动操作 - Ansible 中没有 native “移动”模块,因此您需要在复制后删除源文件 - 这可以按如下方式完成(Jinja2 过滤器与之前相同:
  •   - 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 。)
    希望这可以帮助你!

    关于ansible - 查找文件并将其重命名为 ansible playbook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66654451/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com