【问题标题】:Ansible replace a value in big config fileAnsible 替换大配置文件中的值
【发布时间】:2020-10-01 07:09:14
【问题描述】:

我有一个超过 3000 行的配置文件,我只需要更改/替换几个参数。 因为配置文件很大。我无法使用该模板。

在替换以下参数时需要帮助。


  gateway-config {
    enable = true
    host-name = "car-cache"
    port = 202
    batch-size = 100
    patterns = ["^((test))"]
    type = LINE
    prefix = "stats."${auth}".service"
  }


  k9-config {
    enable = true

    send-enable = false

    host-name = ${auth}

    connection-timeout = 120000

    read-timeout = 60000

    proxy = ""

    project = "Networking"

    period = 120

我只需要在 some-config 上将 enable = false 替换为 enable = true,但是当我使用替换模块时,整个 enable = false 会在配置文件中被替换。

【问题讨论】:

  • 我使用了 shell 模块 awk 命令。但即使它没有做出实际的改变,它也会导致改变。 sed -i '/^\\s*hite-config\\s*{\\s*/!b;n;c\\ \\ \\ \\ enable = false' /etc/repli.conf
  • 为什么不能使用模板?在我看来,这将是去这里的方式。
  • @toydarian:我可以给你一些用例,它们并不总是最好的解决方案,包括当配置文件很大(如 OP 报告的那样)并且你不一定拥有所有您库存中所有值的参考。我可以给出的另一个示例是在应用程序安装时仅更改默认生成的配置文件中的某些值(例如侦听端口、日志级别..),您希望确保可以在该文件中捕获新的添加/删除应用程序升级,而无需在每个新版本中自行维护该模板。
  • @Zeitounator 我没有说在某些情况下replace 更好。不过,我确实有点太喜欢模板了。我猜最佳解决方案取决于需要多少 OP 来更改此配置以及它来自哪里
  • 是的,模板在我的情况下不起作用。

标签: regex ansible jinja2 ansible-template


【解决方案1】:

您实际上可以将replace moduleafterbefore 参数一起使用:

- name: Replace between the expressions (requires Ansible >= 2.4)
  replace:
    path: /path/to/your/file
    after: 'gateway-config {'
    before: '}'
    regexp: '^(\s*enable = )false$'
    replace: '\g<1>true'

【讨论】:

  • 这可以通过匹配任何类型的缩进来增强,以防文件的主机/版本之间存在差异:regexp: '^(\\s*enable = )false$'replace: '\\g&lt;1&gt;true'
  • 为什么要用双斜线,用单引号的时候,我们需要单斜线,对吧?
  • 哎呀!我的错 !打字太快了。是的,这里不需要双反斜杠。
  • @Zeitounator 我没有看到我的文件发生了任何变化。基本上下面是配置文件 gateway-config { enable = true host-name = "car-cache" port = 201 batch-size = 100 patterns = ["^((?!(test).*$" ] type = LINE prefix = "stats."${auth}".service" } k2-config { enable = true send-enable = false host-name = ${auth} connection-timeout = 120000 read-timeout = 60000 proxy = ""
  • @celcoprab 你想改哪一个? k2-configk9-configgateway-config?
【解决方案2】:

你可以使用替换模块吗:

---
- name: Replace variable
  replace:
   path: "/etc/repli.conf"
   after: "hite-config {"
   regexp: "enable = false"
   replace: "enable = true"

【讨论】:

  • 这也会将send-enable = false 更改为send-enable = true
猜你喜欢
  • 2017-10-05
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
相关资源
最近更新 更多