首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找到一个文件并将其重命名为ansible剧本

找到一个文件并将其重命名为ansible剧本
EN

Stack Overflow用户
提问于 2021-03-16 11:34:47
回答 1查看 1.2K关注 0票数 0

因此,我一直试图通过使用游戏手册来修复我在所有服务器上犯的错误。简单地说,我启动了一个带有日志旋转的游戏手册来解决不断增长的日志问题,在其中有一个名为btmp的日志,我本来不应该旋转它,但无论如何都是偶然地旋转的,现在log旋转式改变了它的名称,为它添加了一个日期,从而阻止了日志。现在我想使用一个剧本,它将在/var/log目录中找到一个名为btmp的日志,并将其重命名,问题是在每个服务器中,文件atm是不同的--例如,一个服务器有btmp-20210316,另一个服务器有btmp-20210309,因此在bash命令行中,一个将使用通配符"btmp*“来绕过thos问题,但是这在剧本中似乎不起作用。到目前为止,我想出了这个:

代码语言:javascript
复制
  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中操作的剧本:

代码语言:javascript
复制
---
- 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-16 13:54:08

在Ansible中有不止一种方法可以做到这一点,使用shell模块当然是一种可行的方法(但是您需要使用shell模块来代替command,因为后者不支持通配符)。我会以以下方式解决这个问题:

  1. 首先创建一个任务,查找所有匹配的文件(即/var/log/btmp*),并将它们存储在变量中供以后处理--如下所示:

代码语言:javascript
复制
    - 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的变量中。

  1. 接下来创建一个任务将btmp*文件复制到btmp。现在,您很可能有超过一个文件,上面的模式,从逻辑上说,您不想将它们全部重命名为btmp,因为这只是每次都会覆盖文件。相反,让我们假设您只需要匹配的最新文件--我们可以使用一个聪明的Jinja2过滤器从第一个任务的结果中获得这个条目:

代码语言:javascript
复制
    - 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/btmpremote_src: yes参数告诉复制模块源文件存在于远程计算机上,而不是Ansible主机本身。

如果找不到任何文件,则使用when子句确保不运行此复制操作。

现在,让我们分解一下Jinja2过滤器:

  • find_btmp.files --这是我们的find_btmp variable
  • sort(attribute='mtime',reverse=true)中列出的所有文件--在这里,我们使用mtime (修改时间)属性对文件列表进行排序--我们正在反向排序,以便最新的条目位于list.
  • map(attribute='path')的顶部--我们使用地图“提取”文件字典的path属性,由于这是我们实际上希望传递给复制模块(文件itself
  • first的路径)的唯一数据,因此它只选择列表中的第一个元素(即最新的文件,因为它们是您请求移动操作的反向sorted)
  1. Finally,)--在Ansible中没有本机“移动”模块,因此您希望在复制之后删除源文件--可以这样做( Jinja2筛选器与前面相同:

)

代码语言:javascript
复制
  - 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)。

希望这能帮到你!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66654451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档