【发布时间】:2021-04-26 16:55:27
【问题描述】:
我目前正在开发 ansible 脚本来构建和部署 java 项目。
所以,我可以像下面这样设置 log_path
log_path=/var/log/ansible.log
但是,很难查找构建历史。 是否可以将日期时间附加到日志文件名?
例如,
ansible.20150326145515.log
【问题讨论】:
标签: ansible
我目前正在开发 ansible 脚本来构建和部署 java 项目。
所以,我可以像下面这样设置 log_path
log_path=/var/log/ansible.log
但是,很难查找构建历史。 是否可以将日期时间附加到日志文件名?
例如,
ansible.20150326145515.log
【问题讨论】:
标签: ansible
我不相信有一种内置的方法可以像这样即时生成日期,但您可以选择使用lookup,它可以输出最新的日期。示例:
log_path="/var/log/ansible.{{ lookup('pipe', 'date +%Y%m%d%H%M%S') }}.log"
【讨论】:
log_path 无效;甚至从未尝试执行查找。
ansible-log.{{ lookup('pipe', 'date +%Y%m%d%H%M%S') }}.log 的文件,而不是做一些有用的事情。在整个路径周围加上引号会使 ansible 附加 pwd 到它。
这是一个使用 ANSIBLE_LOG_PATH 环境变量的选项,这要归功于 Bash shell 别名:
alias ansible="ANSIBLE_LOG_PATH=ansible-\`date +%Y%m%d%H%M%S\`.log ansible"
如果您愿意,可以随意使用绝对路径。
【讨论】:
export ANSIBLE_LOG_PATH=... 从 *sh 脚本运行时设置日志路径的方法。
我找到了。
只需将任务添加到本地复制(或 mv 命令)日志
- name: Copy ansible.log
connection: local
command: mv ./logs/ansible.log ./logs/ansible.{{ lookup('pipe', 'date %Y%M%d%H%M%S') }}.log
run_once: true
感谢@jarv
【讨论】:
+ 符号。
这个怎么样:
- shell: date +%Y%m%d%H%M%S
register: timestamp
- debug: msg="foo.{{timestamp.stdout}}.log"
输出:
TASK [command] *****************************************************************
changed: [blabla.example.com]
TASK [debug] *******************************************************************
ok: [blabla.example.com] => {
"msg": "foo.20160922233847.log"
}
【讨论】:
date 命令。
据#ansible freenode IRC 的好心人说,这可以通过custom callback plugin 来完成。
我还没有这样做,因为我无法在这台机器上安装 Ansible Python 库。具体来说,Windows 7 的目录名称长度不能超过 260 个字符,pip 会尝试创建 lengthy 临时路径。但是,如果有人知道它,请在此处发布。
【讨论】:
@ickhyun-kwon 回答的小改进:
- name: "common/_ansible_log_path.yml: rename ansible.log"
connection: local
shell: |
mkdir -vp {{ inventory_dir }}/logs/{{ svn_deploy.release }}/ ;
mv -vf {{ inventory_dir }}/logs/ansible.log {{ inventory_dir }}/logs/{{ svn_deploy.release }}/ansible.{{ svn_deploy.release }}.{{ lookup('pipe', 'date +%Y-%m-%d-%H%M') }}.log args:
executable: /bin/bash
chdir: "{{ inventory_dir }}"
run_once: True
ignore_errors: True
每个 svn 版本都有单独的日志目录,确保日志目录在 mv 命令之前确实存在。
Ansible 将 ./ 解释为当前 playbook 目录,它可能是也可能不是您的 ansible 存储库的根目录,而我的位于 ./playbooks/$project/$role.yml。对我来说,{{ inventory_dir }}/logs/ 恰好对应于~/ansible/log/ 目录,尽管替代布局配置不能保证这一点。
我不确定正式提取绝对 ansible.cfg::log_path 变量的正确方法
月份的日期命令也是+%m,而不是%M,它是分钟
【讨论】:
我在尝试为各种剧本设置动态日志路径时遇到了类似的问题。
一个简单的解决方案似乎是将日志文件名动态传递给 ANSIBLE_LOG_PATH 环境变量。结帐 -> https://docs.ansible.com/ansible/latest/reference_appendices/config.html
在这种特殊情况下,只需在终端上运行预期的 playbook 时导出环境变量:
export ANSIBLE_LOG_PATH=ansible.`date +%s`.log; ansible-playbook test.yml
否则,如果终端无法生成预期的文件名,您始终可以使用从内部运行预期 playbook 的 runner playbook:
---
- hosts:
- localhost
gather_facts: false
ignore_errors: yes
tasks:
- name: set dynamic variables
set_fact:
task_name: dynamic_log_test
log_dir: /path/to/log_directory/
- name: Change the working directory and run the ansible-playbook as shell command
shell: "export ANSIBLE_LOG_PATH={{ log_dir }}log_{{ task_name|lower }}.txt; ansible-playbook test.yml"
register: shell_result
这应该将 test.yml 的结果记录到 /path/to/log_directory/log_dynamic_log_test.txt
希望对您有所帮助!
【讨论】: