使用Jinja2模板将单行附加到现有文件

时间:2019-08-19 10:18:51

标签: ansible

在一本(相当长的)剧本中,我有一些条目会在日志文件中追加一行:

- name: LOG "Task done"
  lineinfile:
    dest: "{{ full_log_name }}"
    line: "{{ tstamp.stdout }}, {{ inventory_hostname }}, Task done"
    insertafter: EOF
  delegate_to: localhost

多亏了这一点,我可以跟踪此剧本已经经历了多少台主机。

但是,我想在剧本开始时添加一行。如果我使用模板:

- name: LOG "Start"
  template:
    src: playbook_start.j2
    dest: "{{ full_log_name }}"
  delegate_to: localhost

它用这一行创建一个新的空文件,然后我的“ lineinfile”任务附加其自己的日志。我想将旧日志保存在同一文件中,因此我的剧本的两次运行将创建如下日志:

2019-08-19 11:34:56.63446, log.log, *** PLAYBOOK STARTED ***
2019-08-19 11:35:09.12405, Host1, First task done
2019-08-19 11:35:09.12299, Host2, First task done
2019-08-19 11:35:18.94610, Host1, Second task done
2019-08-19 11:35:18.95439, Host2, Second task done
2019-08-19 11:35:19.63446, log.log, *** PLAYBOOK STARTED ***
2019-08-19 11:35:20.33616, Host1, First task done
2019-08-19 11:45:25.84871, Host2, First task done
2019-08-19 11:45:25.83616, Host1, Second task done
2019-08-19 11:45:33.13359, Host2, Second task done

我也尝试过使用“ lineinfile”,但是它将为每个主机创建多个“ PLAYBOOK STARTED”行。

2 个答案:

答案 0 :(得分:0)

我认为您可以使用 run_once:true 。像下面这样。我还没有测试。

- name: LOG "PLAYBOOK STARTED"
  lineinfile:
    dest: "{{ full_log_name }}"
    line: "{{ tstamp.stdout }},log.log, *** PLAYBOOK STARTED***"
    insertbefore: BOF
    run_once: true 
  delegate_to: localhost

答案 1 :(得分:0)

run_once: true将使您的lineinfile达到目的。

但是,尽管如此,我还是觉得应该通过回调插件来实现。您应该查看log_plays插件,看看如何根据需要对其进行自定义...