【问题标题】:Idempotency in ansible playbookansible playbook 中的幂等性
【发布时间】:2015-02-12 10:25:36
【问题描述】:

我正在使用 Ansible playbook 配置服务器。我的剧本在第一次执行时工作正常,但是当我再次运行相同的剧本时,它会在服务器上的配置文件中创建重复行。 我正在使用lineinfile 模块。每次运行 playbook 时,以下示例任务都会添加该行。

- lineinfile: dest=/etc/pam_ldap.conf line="ssl off"

有没有办法避免这种情况,并保持幂等性。

【问题讨论】:

  • 你的任务应该已经是幂等的了。这是确切的任务吗?你是否也在其他地方修改了剧本中的这个文件? line 属性是否包含\n?您的剧本是否会在第二次运行时重新安装或重新配置 ldap?
  • 你用的是什么版本的ansible?
  • 我使用的是 ansible 1.8.2。
  • 有一个单独的 playbook 用于安装,我正在运行一次,并且有一个单独的 playbook 用于配置服务器。并且在多次运行中会多次添加内容。我正在使用 ansible 1.8.2。请给我一些建议,我该如何实现这一目标。
  • 我想在配置文件中添加多行。为此,我没有使用 '\n' 为每一行创建单独的任务。这实质上意味着我在剧本中不止一次地修改文件。我不知道这是个好主意还是有更好的方法。

标签: ansible ansible-playbook idempotent


【解决方案1】:

理论上 lineinfile 应该可以按您的预期工作。仅当文件中不存在该行时才添加该行。

文件是符号链接吗?我看不出 Ansible 不应该关注该链接的原因,但也许这可能是它无法识别线路的原因。

您是否尝试添加regexp 参数?无论如何,涵盖ssl on 之类的行已经存在的情况是有意义的。

- lineinfile: dest=/etc/pam_ldap.conf
              line="ssl off"
              regexp="^ssl\s+"

【讨论】:

  • 当我在文件中添加单行并在 Ansible 剧本中只修改一次文件时,它保持幂等性。但是当我向配置文件添加多行时它不起作用,因此在剧本中多次修改文件。
  • 我不明白符号链接在这里有什么作用,我提到了文件名本身。服务器中已经存在配置文件。
  • 我很清楚你的问题。我只是解释了它应该如何工作。我知道无论出于何种原因,它在您的情况下都无法按预期工作。如果没有regexp 属性,基本上你的line 就会变成regexp。它正在搜索行/正则表达式。如果找到它,它正在更新它 - 如果没有,它会将它添加为一个新行。使用regexp 属性,如果已包含该行,您可以更加具体或不具体。由于由于某种原因在您的情况下无法识别该行,因此尝试使用 regexp 似乎是个好主意。
  • 只有当regexpdid 匹配文件内容时,该行才会被添加到文件中。关于符号链接:可能只是 Ansible 没有跟随链接,因此首先无法读取文件的内容。我绝对不相信这是一个案例,但如果该文件实际上是一个符号链接,那么您可以检查它是否是原因。
  • 它现在正在使用正则表达式。如果正则表达式匹配,那么它将尝试替换该行,但如果正则表达式不匹配,它将添加新行。这就是我想要的,谢谢你的帮助。
猜你喜欢
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
相关资源
最近更新 更多