blockinfile不断添加块

时间:2016-12-22 13:44:44

标签: ansible

我想使用blockinfile为我的ElasticSearch配置添加一个文本块,但每次运行我的playbook时,该块都会被添加到文件中 - 即使它已经存在。这是一个问题,因为ElasticSearch并不只是取最后一个值,它在启动时会窒息说'#34;这个值有多个条目" (或类似的东西)。

我的游戏看起来像这样:

  - name: configure elasticsearch
    blockinfile:
      dest: /etc/elasticsearch/elasticsearch.yml
      marker: "## added by ansible configuration"
      block: |
        network.host: 0.0.0.0
        path.data: /var/lib
        path.logs: /var/log/elasticsearch
        path.repo: /home/chris/elastic-backups
      state: present

但是在第二次运行我的剧本之后,我的elasticsearch.yml文件看起来像是:

## added by ansible configuration
network.host: 0.0.0.0
path.data: /var/lib
path.logs: /var/log/elasticsearch
path.repo: /home/chris/elastic-backups
## added by ansible configuration
network.host: 0.0.0.0
path.data: /var/lib
path.logs: /var/log/elasticsearch
path.repo: /home/chris/elastic-backups
## added by ansible configuration

有没有办法只添加块,如果它还不存在?

2 个答案:

答案 0 :(得分:12)

您应在{mark}参数中指定marker关键字:

marker: "## {mark} added by ansible (configuration elasticsearch)"

这将导致Ansible在块的开头和末尾插入一行,用{mark}BEGIN相应地替换END

## BEGIN added by ansible (configuration elasticsearch)
network.host: 0.0.0.0
path.data: /var/lib
path.logs: /var/log/elasticsearch
path.repo: /home/chris/elastic-backups
## END added by ansible (configuration elasticsearch)

否则Ansible没有线索,块开始的地方和结束的位置,所以在每次运行时它认为块不存在并插入一个新块。

答案 1 :(得分:1)

接受的答案是正确和直截了当的。

marker字符串也不应包含\n之类的换行符,否则,Ansible将继续添加该块。听起来像是我的错误