使用ansible,将一行添加到现有文件的最佳方法是什么,该文件取决于--extra-vars传递的变量的值?

时间:2014-09-10 23:20:22

标签: ansible

我有一个需要在标准系统文件中设置的数字配置(例如,某些配置的毫秒数)。我不想将整个配置文件保留在版本控制中,因为它是标准安装的一部分。有没有办法在文件中添加一行,并在行中有一些变量替换文本可以依赖于指定的变量(例如,当使用--extra-vars运行playbook时通过命令行传递。

例如,以下内容(我迄今为止的最大努力):

- name: Set ring delay
  lineinfile:
    dest: /etc/cassandra/cassandra-env.sh
    state: present
    regexp: 'JVM_OPTS="$JVM_OPTS -Dcassandra.ring_delay_ms=.*"'
    line: 'JVM_OPTS="$JVM_OPTS -Dcassandra.ring_delay_ms=${ring_delay}"'
    backrefs: yes
  when: ring_delay is defined

使用ansible-playbook -e "ring_delay=10000"执行剧本 如果我没有配置的变量值,上面的例子工作正常(例如,我只是硬代码line: 'JVM_OPTS="$JVM_OPTS -Dcassandra.ring_delay_ms=10000"',但我希望能够在运行时从命令行手动指定值有没有一种好方法可以做到这一点?理想情况下,重新运行剧本会用新值覆盖ring_delay

编辑:从link开始,我上面使用的${ring_delay}符号似乎不是ansible的功能,尽管网上有几个例子表明存在一些相关的功能用于更换字符串。 docs引用"命名为反向引用",但我不确定它们是什么。

1 个答案:

答案 0 :(得分:4)

插值的正确语法是' {{var}}'。 ' $ {var}'语法已经被弃用了一段时间。

如下所示改变你的任务应该这样做:

- name: Set ring delay lineinfile: dest: /etc/cassandra/cassandra-env.sh state: present regexp: 'JVM_OPTS="$JVM_OPTS -Dcassandra.ring_delay_ms=.*"' line: 'JVM_OPTS="$JVM_OPTS -Dcassandra.ring_delay_ms={{ring_delay}}"' when: ring_delay is defined

你不需要backrefs,因为正则表达式中没有捕捉组。

祝你好运。