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

问题描述 投票:0回答:3

我有一个 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

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

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

`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 %}
ansible yaml jinja2 command-line-interface ls
3个回答
2
投票

给定主机上的简化树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(' ') }}"

0
投票

正如用户 Vladimir Botka 所指出的,此实现提供了一种通过模板创建文件的方法。这是最终产品:

    ---
    - name: StackOverflow Test Playbook
      hosts: localhost
      become: true
      gather_facts: false
      vars:
        bck_remote_dir: /mnt/bntestmnt
        bck_dir: /export/Backups/ESG
        bck:
          Confluence: [daily, weekly]
          GitLab: [daily, weekly]
          Jira: [daily, weekly]
    
      tasks:
        - name: Retrieve Backup data
          shell:
            cmd: "ls -td {{ item.0.key }}/{{ item.1 }}/* | xargs du -sh"
            chdir: "{{ bck_remote_dir }}"
          with_subelements:
            - "{{ bck|dict2items }}"
            - value
          register: bck_status
          delegate_to: (remote hostname is here)
        - debug:
            var: bck_status
          when: debug|d(false)|bool
    
        - name: Create backup log from Remote Host
          ansible.builtin.copy:
            dest: /mnt/bntestmnt/results.txt
            mode: 0755
            content: |
              Backup server: (plaintext ipv4 address is here)
              Backup directory: /export/Backups/ESG
    
              {% for i in bck_status.results %}
              {{ i.item.0.key }} {{ i.item.1 }} Backups:
              {% for j in i.stdout_lines %}
              {{ j }}
              {% endfor %}
    
              {% endfor %}
          delegate_to: (remote hostname is here)
    ...

.txt文件输出如下:

Backup server: 10.5.5.50
Backup directory: /export/Backups/ESG

Confluence daily Backups:
4.4G    Confluence/daily/Wed-29Mar23
4.4G    Confluence/daily/Tue-28Mar23
4.3G    Confluence/daily/Mon-27Mar23
4.3G    Confluence/daily/Sun-26Mar23
4.2G    Confluence/daily/Sat-25Mar23
4.1G    Confluence/daily/Fri-24Mar23
4.1G    Confluence/daily/Thu-23Mar23

Confluence weekly Backups:
3.9G    Confluence/weekly/Fri-17Mar23
3.7G    Confluence/weekly/Fri-10Mar23
3.5G    Confluence/weekly/Fri-03Mar23
3.4G    Confluence/weekly/Fri-24Feb23

Jira daily Backups:
2.6G    Jira/daily/Wed-29Mar23
2.6G    Jira/daily/Tue-28Mar23
2.6G    Jira/daily/Mon-27Mar23
2.6G    Jira/daily/Sun-26Mar23
2.6G    Jira/daily/Sat-25Mar23
2.6G    Jira/daily/Fri-24Mar23
2.6G    Jira/daily/Thu-23Mar23

Jira weekly Backups:
2.6G    Jira/weekly/Fri-17Mar23
2.6G    Jira/weekly/Fri-10Mar23
2.6G    Jira/weekly/Fri-03Mar23
2.6G    Jira/weekly/Fri-24Feb23

GitLab daily Backups:
2.7G    GitLab/daily/Wed-29Mar23
2.7G    GitLab/daily/Tue-28Mar23
2.6G    GitLab/daily/Mon-27Mar23
2.6G    GitLab/daily/Sun-26Mar23
2.6G    GitLab/daily/Sat-25Mar23
2.6G    GitLab/daily/Fri-24Mar23
2.5G    GitLab/daily/Thu-23Mar23

GitLab weekly Backups:
2.3G    GitLab/weekly/Fri-17Mar23
2.2G    GitLab/weekly/Fri-10Mar23
2.1G    GitLab/weekly/Fri-03Mar23
2.2G    GitLab/weekly/Fri-24Feb23

0
投票

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

让我们看看这是怎么回事...

我正在寻找一种更有效的方式来编写这个或者找到一个最佳实践来实现这个。

即使其他答案是正确的并且满足要求,我认为还有更有效的方法来写这个,这取决于一个人如何定义它和最佳实践是使用Custom Facts.


如何实现和使用自定义事实?

我引用了一个简单的最小示例 “如何实施和使用自定义事实?” 仅在此处,而不是提供完整的实施。并且需要使用 Store output diskspace

df -h
in JSON formatConvert a table from Bash command into JSON.


分布式方法比其他方法有一些优势。

通过 SSH 访问远程主机并创建一个文本文件,列出远程主机文件系统上的所有备份 ...

在我看来,从 Ansible 剧本本身和运行时创建关于远程节点的事实既没有必要,也不是最佳实践。远程节点可以运行这些脚本并自行生成所需的数据,而无需依赖 Ansible 控制节点。远程节点可以做很多后处理和格式化必要的数据(输出)。收集事实应该足够以后

可以插入到电子邮件正文中。

通过这样做,您可以实现您的系统松散耦合

不需要使用

shell
模块,但仍然使用与Ansible脚本完全分离的Shell脚本。它们可以单独维护或用其他语言编写。提供的输出格式已经可以是 JSON,并且可以在 Ansible 中进行更好的后处理。

背景资料

© www.soinside.com 2019 - 2024. All rights reserved.