如何以模块化方式使用templates / blockinfile / lineinfile构建配置

时间:2018-05-02 14:57:25

标签: ansible

我尝试使用多个角色组装适合iptables-restore的iptables文件:

  • 有一个角色setup-iptables,它创建一个包含一些常用规则的初始文件(即允许SSH)。该文件是从一个大模板创建的。
  • 有多个较小的角色,这些角色会添加到此文件中(即setup-httpd为端口80和443添加规则)。

Playbooks首先应导入角色setup-iptables,然后导入配置主机所需的较小角色。

我的问题是,每次运行playbook时都会重新创建此文件。如果游戏中断并且应用了不完整的规则,这可能是危险的。它也很丑陋,因为ansible会显示对主机的更改,即使生成的文件与其原始状态相同。

简单地使用初学者的lineinfileblockinfile不是一种选择,因为iptable规则高度依赖于规则的排序。初始模板是必需的,因为它提供了许多标记'。然后,后续角色的lineinfile语句使用这些标记来正确定位其规则。

我目前的解决方法是在本地组合文件,并在游戏结束时刷新'它到远程主机。

有更好的方法吗?什么是' ansible方式'这样做?

1 个答案:

答案 0 :(得分:1)

您可以检查文件是否存在,如果存在,请跳过重新创建...

- name: check if the file exists
  stat:
    path: /etc/sysconfig/iptables #Example path
  register: iptables_file

- name: Create the file if it doesnt exists
  copy:
    content: "your initial rules"
    dest: /etc/sysconfig/iptables
  when: iptables_file.stat.exists == False