Ansible Module" lineinfile"替换多个文件中的多行

时间:2016-06-15 17:34:26

标签: apache ssl ansible ansible-playbook

我们的SSL证书在几天内就用完了。所以我认为Ansible可以将新证书放在服务器上并更改apache2站点。

此服务器上正在运行多个站点。

我想替换以下几行:

  
      
  • SSLCertificateChainFile
  •   
  • 了SSLCertificateKeyFile
  •   
  • 了SSLCertificateFile
  •   

我使用此命令获取/ etc / apache2中所有网站的列表,其中模式为" SSLCertificate"存在。

- name: Apache 2.2 list sites files and store it in register
  command: grep -lR --exclude default-ssl "SSLCertificate" /etc/apache2/
  register: apache22_sites

这是我使用的,只需要更改一个文件:

- name: apache2.2.* | configure certs
  lineinfile: dest=/path/to/...  regexp={{ item.regexp }} line={{ item.line}} backrefs=yes
  with_items:
        - { regexp: "SSLCertificateChainFile", line: "    SSLCertificateChainFile = ..." }
        - { regexp: "SSLCertificateKeyFile ", line: "    SSLCertificateKeyFile = ..." }
        - { regexp: "SSLCertificateFile", line: "    SSLCertificateFile = ..."
  notify: reload apache2

我如何告诉ansible将此代码与变量" apache22_sites"中列出的多个文件一起使用? 多行?

我找到了一个很好的提示here,遗憾的是只有一行。

我感谢任何提示,技巧和提示:)

问候 丹尼斯

1 个答案:

答案 0 :(得分:1)

正如tedder42在评论中指出的那样,并且正如人们使用lineinfile时的情况一样,相反,templating这些文件会更好。

但是,如果你想解决更多关于如何遍历多个事物列表的问题,那么你应该使用with_nested loop

所以在你的情况下,你会有类似的东西:

- name: Apache 2.2 list sites files and store it in register
  command: grep -lR --exclude default-ssl "SSLCertificate" /etc/apache2/
  register: apache22_sites

- name: apache2.2.* | configure certs
  lineinfile: dest={{ item.0 }}  regexp={{ item.1.regexp }} line={{ item.1.line}} backrefs=yes
  with_nested:
        - apache22_sites
        - lines_to_replace
  notify: reload apache2

只要您在此处定义lines_to_replace

lines_to_replace:
    - { regexp: "SSLCertificateChainFile", line: "    SSLCertificateChainFile = ..." }
    - { regexp: "SSLCertificateKeyFile ", line: "    SSLCertificateKeyFile = ..." }
    - { regexp: "SSLCertificateFile", line: "    SSLCertificateFile = ..."