在Ansible中,如何动态设置日志文件名

时间:2015-03-26 05:57:33

标签: ansible

我目前正在开发ansible脚本来构建和部署java项目。

所以,我可以像下面那样设置log_path

log_path=/var/log/ansible.log

但是,很难查找构建历史记录。 是否可以将日期时间附加到日志文件名?

例如,

ansible.20150326145515.log

7 个答案:

答案 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

希望这对您有帮助!