ansible - 是否有更有效的方法来定位备份目录并将格式化列表保存到文件中?

标签 ansible yaml jinja2 command-line-interface ls

我有一个 Ansible 剧本来执行以下任务:

通过 ssh 访问远程主机并创建一个文本文件,其中列出了远程主机文件系统上可以插入电子邮件正文的所有备份。 我正在寻找一种更有效的方法来编写此内容或找到实现此内容的最佳实践。

非常感谢任何和所有反馈!

以下是当前用于在远程主机上查找备份的迭代:

- name: Create backup log from Remote Host
  shell: |
    cd /mnt/bntestmnt; echo -e "Backup server: [ipv4 address goes here] \nBackup directory: /export
    /Backups/ESG \n\nConfluence Backups:" > BackupStatus.txt
    ls -td Confluence/daily/* | xargs du -sh >> BackupStatus.txt; echo " " >> BackupStatus.txt; 
    ls -td Confluence/weekly/* | xargs du -sh >> BackupStatus.txt; echo -e "\nGitlab Backups:" >> 
    BackupStatus.txt
    ls -td GitLab/daily/* | xargs du -sh >> BackupStatus.txt; echo " " >> BackupStatus.txt
    ls -td GitLab/weekly/* | xargs du -sh >> BackupStatus.txt; echo -e "\nJira Backups:" >> 
    BackupStatus.txt
    ls -td Jira/daily/* | xargs du -sh >> BackupStatus.txt; echo " " >> BackupStatus.txt
    ls -td Jira/weekly/* | xargs du -sh >> BackupStatus.txt; cat BackupStatus.txt
  register: Backup_Status
  delegate_to: [remote host name goes here]

由于“>>”将命令输出重定向到文本文件,Ansible 无法看到结果,因此使用“cat”显示最终结果,以便将其记录为变量,插入到电子邮件正文中.

这是预期的输出:

    Backup server: [ipv4 address goes here] 
    Backup directory: /export/Backups/ESG 
    
    Confluence Backups:
    4.1G    Confluence/daily/Thu-23Mar23
    4.0G    Confluence/daily/Wed-22Mar23
    4.0G    Confluence/daily/Tue-21Mar23
    4.0G    Confluence/daily/Mon-20Mar23
    4.0G    Confluence/daily/Sun-19Mar23
    3.9G    Confluence/daily/Sat-18Mar23
    3.9G    Confluence/daily/Fri-17Mar23
     
    3.7G    Confluence/weekly/Fri-10Mar23
    3.5G    Confluence/weekly/Fri-03Mar23
    3.4G    Confluence/weekly/Fri-24Feb23
    3.3G    Confluence/weekly/Sat-18Feb23
    
    Gitlab Backups:
    2.5G    GitLab/daily/Thu-23Mar23
    2.5G    GitLab/daily/Wed-22Mar23
    2.4G    GitLab/daily/Tue-21Mar23
    2.4G    GitLab/daily/Mon-20Mar23
    2.4G    GitLab/daily/Sun-19Mar23
    2.3G    GitLab/daily/Sat-18Mar23
    2.3G    GitLab/daily/Fri-17Mar23
     
    2.2G    GitLab/weekly/Fri-10Mar23
    2.1G    GitLab/weekly/Fri-03Mar23
    2.2G    GitLab/weekly/Fri-24Feb23
    
    Jira Backups:
    2.6G    Jira/daily/Thu-23Mar23
    2.6G    Jira/daily/Wed-22Mar23
    2.6G    Jira/daily/Tue-21Mar23
    2.6G    Jira/daily/Mon-20Mar23
    2.6G    Jira/daily/Sun-19Mar23
    2.6G    Jira/daily/Sat-18Mar23
    2.6G    Jira/daily/Fri-17Mar23
     
    2.6G    Jira/weekly/Fri-10Mar23
    2.6G    Jira/weekly/Fri-03Mar23
    2.6G    Jira/weekly/Fri-24Feb23
    2.6G    Jira/weekly/Fri-17Feb23

每个应用程序中的列表在最后一个“daily”实例和第一个“weekly”实例之间都有一个换行符

下面是我尝试使用的一些替代格式。我在尝试格式化输出以达到所需结果时遇到了问题。

`ls -td Confluence/{daily,weekly}/* | xargs du -sh`

or

`find Confluence -mindepth 2 -type d -exec du -sh {} \;`
(This version seems to sort the list incorrectly, as the size/dates are out of order)

我还考虑过修改任务以利用 Jinja2 创建模板,但感觉我可能无法理解该方法。请参阅下面的尝试格式:

- name: Create backup log from Remote Host
  template:
    src: backup_report.j2
    dest: /mnt/bntestmnt/BackupStatus.txt
  vars:
    confluence_backups: [variable goes here]
    gitlab_backups: [variable goes here]
    jira_backups: [variable goes here]

我仍在尝试弄清楚如何编写“backup_report.j2”的内容,但我里面有以下内容:

Backup server: [ipv4 address]
Backup directory: /export/Backups/ESG

Confluence Backups: 
{% for backup in confluence_backups %}
{{ backup }}
{% endfor %}

Gitlab Backups: 
{% for backup in gitlab_backups %}
{{ backup }}
{% endfor %}

Jira Backups: 
{% for backup in jira_backups %}
{{ backup }}
{% endfor %}

最佳答案

给定主机 test_11test_13 上的简化树

shell> ssh admin@test_11 find /tmp/bntestmnt
/tmp/bntestmnt
/tmp/bntestmnt/Gitlab
/tmp/bntestmnt/Gitlab/weekly
/tmp/bntestmnt/Gitlab/weekly/Fri-10Mar23
/tmp/bntestmnt/Gitlab/weekly/Fri-03Mar23
/tmp/bntestmnt/Gitlab/daily
/tmp/bntestmnt/Gitlab/daily/Sat-18Mar23
/tmp/bntestmnt/Gitlab/daily/Sun-19Mar23
/tmp/bntestmnt/Gitlab/daily/Fri-17Mar23
/tmp/bntestmnt/Confluence
/tmp/bntestmnt/Confluence/weekly
/tmp/bntestmnt/Confluence/weekly/Fri-03Mar23
/tmp/bntestmnt/Confluence/weekly/Fri-10Mar23
/tmp/bntestmnt/Confluence/daily
/tmp/bntestmnt/Confluence/daily/Sat-18Mar23
/tmp/bntestmnt/Confluence/daily/Sun-19Mar23
/tmp/bntestmnt/Confluence/daily/Fri-17Mar23
/tmp/bntestmnt/Jira
/tmp/bntestmnt/Jira/weekly
/tmp/bntestmnt/Jira/weekly/Fri-10Mar23
/tmp/bntestmnt/Jira/weekly/Fri-03Mar23
/tmp/bntestmnt/Jira/daily
/tmp/bntestmnt/Jira/daily/Sun-19Mar23
/tmp/bntestmnt/Jira/daily/Sat-18Mar23
/tmp/bntestmnt/Jira/daily/Fri-17Mar23

剧情

- hosts: all

  vars:

    bck_remote_dir: /tmp/bntestmnt
    bck_dir: /export/Backups/ESG
    bck:
      Confluence: [daily, weekly]
      Gitlab: [daily, weekly]
      Jira: [daily, weekly]

  tasks:

    - shell:
        cmd: "ls -td {{ item.0.key }}/{{ item.1 }}/* | xargs du -sh"
        chdir: "{{ bck_remote_dir}}"
      with_subelements:
        - "{{ bck|dict2items }}"
        - value
      register: bck_status
    - debug:
        var: bck_status
      when: debug|d(false)|bool

    - copy:
        dest: /tmp/BackupStatus.txt
        content: |
          Backup server: {{ ansible_host }}
          Backup directory: {{ bck_dir }}

          {% for i in bck_status.results %}
          {{ i.item.0.key }} {{ i.item.1 }} Backups:
          {% for j in i.stdout_lines %}
          {{ j }}
          {% endfor %}

          {% endfor %}

给出(与test_13相同)

shell> ssh admin@test_11 cat /tmp/BackupStatus.txt
Backup server: 10.1.0.61
Backup directory: /export/Backups/ESG

Confluence daily Backups:
4.5K    Confluence/daily/Sun-19Mar23
4.5K    Confluence/daily/Sat-18Mar23
4.5K    Confluence/daily/Fri-17Mar23

Confluence weekly Backups:
4.5K    Confluence/weekly/Fri-10Mar23
4.5K    Confluence/weekly/Fri-03Mar23

Gitlab daily Backups:
4.5K    Gitlab/daily/Sun-19Mar23
4.5K    Gitlab/daily/Sat-18Mar23
4.5K    Gitlab/daily/Fri-17Mar23

Gitlab weekly Backups:
4.5K    Gitlab/weekly/Fri-10Mar23
4.5K    Gitlab/weekly/Fri-03Mar23

Jira daily Backups:
4.5K    Jira/daily/Sun-19Mar23
4.5K    Jira/daily/Sat-18Mar23
4.5K    Jira/daily/Fri-17Mar23

Jira weekly Backups:
4.5K    Jira/weekly/Fri-10Mar23
4.5K    Jira/weekly/Fri-03Mar23

创建测试树的完整剧本示例

shell> cat pb-create.yml
- hosts: all

  vars:

    bck_remote_dir: /tmp/bntestmnt
    bck_files:
      daily: [Fri-17Mar23, Sat-18Mar23, Sun-19Mar23]
      weekly: [Fri-03Mar23, Fri-10Mar23]
    bck:
      Confluence: [daily, weekly]
      Gitlab: [daily, weekly]
      Jira: [daily, weekly]

  tasks:

    - file:
        state: directory
        path: "{{ bck_remote_dir }}"

    - file:
        state: directory
        path: "{{ bck_remote_dir }}/{{ item.0.key }}/{{ item.1 }}"
      with_subelements:
        - "{{ bck|dict2items }}"
        - value

    - shell: "for file in {{ files }}; do cp /etc/passwd $file; done"
      with_subelements:
        - "{{ bck|dict2items }}"
        - value
      vars:
        dir: "{{ bck_remote_dir }}/{{ item.0.key }}/{{ item.1 }}"
        files: "{{ [dir]|product(bck_files[item.1])|
                         map('join', '/')|
                         join(' ') }}"

关于ansible - 是否有更有效的方法来定位备份目录并将格式化列表保存到文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75871703/

相关文章:

匹配时的ansible过滤器列表

node.js - Ansible 在启动 node.js 服务器时挂起

yaml - 在推送标签时运行 github 操作未执行

spring - 如何通过 Spring 占位符在 yaml 中表达对象列表或数组?

python - 如何将 Bootstrap 工具提示与 Python WTForms 库一起使用?

python - 将 dash_html_components 传递给 Jinja 模板

vagrant - Ansible & Vagrant - 为 ansible 提供参数

gradle - ansible脚本来设置gradle家?

amazon-web-services - AWS CodeDeploy yaml 文件错误

xml - 使用 Ansible 在 Jinja2 中转义特殊 XML 字符