如何使用一个saltstack状态在同一个文件上进行多次替换?

时间:2015-01-24 07:04:48

标签: replace nexus configuration-management salt-stack

这是我的目标文件:

Sonatype Nexus
# ==============
# This is the most basic configuration of Nexus.

# Jetty section
application-port=8081
application-host=0.0.0.0
nexus-webapp=${bundleBasedir}/nexus
nexus-webapp-context-path=/nexus

# Nexus section
nexus-work=/opt/nexuswork
runtime=${bundleBasedir}/nexus/WEB-INF

我知道使用regex或简单的sed脚本可以轻松实现此目的:

sed -i 's/${bundleBasedir}\/..\/my\/second\/path\/002\/\/nexus/\/myfirstdir001\/g'

但是,理想情况下,我更喜欢盐栈方式。

我希望它看起来像这样:

Sonatype Nexus
# ==============
# This is the most basic configuration of Nexus.

# Jetty section
application-port=8081
application-host=0.0.0.0
nexus-webapp=/my/second/path/002/nexus # changed
nexus-webapp-context-path=/nexus

# Nexus section
nexus-work=/opt/nexuswork
runtime=/myfirstdir001/nexus/WEB-INF # changed 

我还没有理解这方面的saltstack文档。

Saltstack的salt.states.file.replace文档似乎相当简单:

http://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html#salt.states.file.replace

这是我试过的:

/opt/nexus-2.8.0/conf/nexus.properties
  file:                                  # state
    - replace
    - pattern: '\$\{bundleBasedir\}'  # without escapes: '${bundleBasedir}/nexus'
    - repl: '/my/second/path/002/nexus'
#    - name: /opt/nexus-2.8.0/conf/nexus.properties
#    - count=0
#    - append_if_not_found=False
#    - prepend_if_not_found=False
#    - not_found_content=None
#    - backup='.bak'
#    - show_changes=True
    - pattern: '\$\{bundleBasedir\}\/WEB-INF' # without escapes: ${bundleBasedir}/WEB-INF
    - repl: '/myfirstdir001/'

我可能会尝试多个状态ID,但这似乎不够优雅。

如果还有其他事情我要搞砸了,请指教!

我喜欢找到解决方案。

此外,如果有人要求人们改进盐文件,我认为我的团队可以说服一些人。

这是我发现的最接近别人问这个问题的事情:

http://comments.gmane.org/gmane.comp.sysutils.salt.user/15138

1 个答案:

答案 0 :(得分:4)

根据我的理解,这样做的方法是:在salt中放置nexus.properties的模板文件并使用file.managed,如文档中所示http://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html

你最终会得到类似的东西:

/opt/nexus-2.8.0/conf/nexus.properties:
  file.managed:
    - source: salt://nexus/nexus.properties.jinja
    - template: jinja
    - defaults:
        bundleBasedir: "..."

然后,您将在文件中使用Jinja模板:

# Jetty section
application-port=8081
application-host=0.0.0.0
nexus-webapp={{ bundleBasedir }}/nexus
nexus-webapp-context-path=/nexus

请参阅此处查看Jinja模板:http://docs.saltstack.com/en/latest/ref/renderers/all/salt.renderers.jinja.html

我希望它有所帮助。