【问题标题】:in Ansible, How can I set log file name dynamilcally在 Ansible 中,如何动态设置日志文件名
【发布时间】:2021-04-26 16:55:27
【问题描述】:

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

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

log_path=/var/log/ansible.log

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

例如,

ansible.20150326145515.log

【问题讨论】:

    标签: ansible


    【解决方案1】:

    我不相信有一种内置的方法可以像这样即时生成日期,但您可以选择使用lookup,它可以输出最新的日期。示例:

    log_path="/var/log/ansible.{{ lookup('pipe', 'date +%Y%m%d%H%M%S') }}.log"
    

    【讨论】:

    • 这对你真的有用吗?对我来说,运行 2.3.2.0,引号被解释器转义,导致 log_path 无效;甚至从未尝试执行查找。
    • 抱歉,它会创建名为 ansible-log.{{ lookup('pipe', 'date +%Y%m%d%H%M%S') }}.log 的文件,而不是做一些有用的事情。在整个路径周围加上引号会使 ansible 附加 pwd 到它。
    • 这对我不起作用:ansible 2.7.8 配置文件 = /root/scripts/ansible/affinities/ansible.cfg 配置的模块搜索路径 = ['/root/.ansible/plugins/modules' , '/usr/share/ansible/plugins/modules'] ansible python 模块位置 = /usr/local/lib/python3.5/dist-packages/ansible 可执行位置 = /usr/local/bin/ansible python 版本 = 3.5 .2(默认,2018 年 11 月 12 日,13:43:14)[GCC 5.4.0 20160609]
    • 这怎么会有 17 票?这没用。刚刚在 Ansible 2.9.7 上尝试过。
    • @EM0 你找到解决办法了吗?
    【解决方案2】:

    这是一个使用 ANSIBLE_LOG_PATH 环境变量的选项,这要归功于 Bash shell 别名:

    alias ansible="ANSIBLE_LOG_PATH=ansible-\`date +%Y%m%d%H%M%S\`.log ansible"
    

    如果您愿意,可以随意使用绝对路径。

    【讨论】:

    • +1 不知道环境变量。这似乎是使用 export ANSIBLE_LOG_PATH=... 从 *sh 脚本运行时设置日志路径的方法。
    【解决方案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

    【讨论】:

    • 请注意您的日期格式缺少@jarv 答案中的+ 符号。
    • 我测试过这行得通。我从删除现有日志开始;制作剧本以:执行调试任务以开始写入日志,执行命令任务以移动/重命名日志,执行另一个任务以查看 Ansible 是否仍然正确写入日志。结果是成功的——日志由ansible创建,写入,重命名,并在移动/重命名后再次写入。
    【解决方案4】:

    这个怎么样:

    - 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"
    }
    

    【讨论】:

    • 我认为你被否决了,因为他需要动态更改日志文件——这涉及修改 log_path——而不仅仅是使用调试模块来表明你可以使用 Ansible 执行 date 命令。
    【解决方案5】:

    据#ansible freenode IRC 的好心人说,这可以通过custom callback plugin 来完成。

    我还没有这样做,因为我无法在这台机器上安装 Ansible Python 库。具体来说,Windows 7 的目录名称长度不能超过 260 个字符,pip 会尝试创建 lengthy 临时路径。但是,如果有人知道它,请在此处发布。

    【讨论】:

      【解决方案6】:

      @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,它是分钟

      【讨论】:

        【解决方案7】:

        我在尝试为各种剧本设置动态日志路径时遇到了类似的问题。

        一个简单的解决方案似乎是将日志文件名动态传递给 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

        希望对您有所帮助!

        【讨论】:

          猜你喜欢
          • 2014-11-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多