我有一个 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_11 和 test_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/