我目前正在开发ansible脚本来构建和部署java项目。
所以,我可以像下面那样设置log_path
log_path=/var/log/ansible.log
但是,很难查找构建历史记录。 是否可以将日期时间附加到日志文件名?
例如,
ansible.20150326145515.log
答案 0 :(得分:15)
我不相信有一种内置的方式可以像这样生成日期,但是你有一个选择就是使用lookup,它可以直到最新。例如:
log_path="/var/log/ansible.{{ lookup('pipe', 'date +%Y%m%d%H%M%S') }}.log"
答案 1 :(得分:4)
这是一个使用ANSIBLE_LOG_PATH
环境变量的选项,这要归功于Bash shell别名:
alias ansible="ANSIBLE_LOG_PATH=ansible-\`date +%Y%m%d%H%M%S\`.log ansible"
如果您愿意,可以随意使用绝对路径。
答案 2 :(得分:3)
我找到了。
只需将任务添加到本地复制(或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
答案 3 :(得分:1)
根据#ansible freenode IRC的优秀人员,这可以通过custom callback plugin完成。
我还没有这样做,因为我无法在这台机器上安装Ansible Python库。具体来说,Windows 7不能具有目录名称>长度为260个字符,pip
尝试生成lengthy个临时路径。但如果有人接触它,请在此处发布。
答案 4 :(得分:0)
这个怎么样:
- 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"
}
答案 5 :(得分:0)
@ 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
,即分钟
答案 6 :(得分:0)
我在尝试为各种剧本设置动态日志路径时遇到了类似的问题。
一个简单的解决方案似乎是将日志文件名动态传递给 ANSIBLE_LOG_PATH 环境变量。结帐 -> https://docs.ansible.com/ansible/latest/reference_appendices/config.html
在这种特殊情况下,只需在终端上运行预期的剧本时导出环境变量:
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
希望这对您有帮助!