如何通过ansible模板更改文件的一部分

时间:2015-02-05 14:14:53

标签: django ansible

db_conn.j2:

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'db_name',
    'USER': 'db_user',
    'PASSWORD': 'db_pass',
    'HOST': 'localhost',
    'PORT': '5432', 
  }
}

main.yml:

tasks:
  - name: Set DB settings
    template: src="/vagrant/ansible/templates/db_settings.j2" dest="{{ proj_dev }}/proj/settings.py"
    tags:
      - template

在我的任务文件中 settings.py 将替换为 db_conn.j2 。 但我只需要更改目标文件中的 DATABASES 选项( settings.py )。

我可以通过模板执行此操作吗?或者更好地使用替换

设置django-settings的 ansible 还有其他方法吗?

2 个答案:

答案 0 :(得分:2)

template模块将覆盖整个文件。没有选项只能替换特定部分。这就是模板的想法。

您可以将DATABASES部分移至另一个文件,然后移至from database.py import *,但当然您会遇到同样的问题:您需要替换DATABASES包含import规则的部分。

是的,replace模块或lineinfile module通常更适合替换文件的一部分。

但是你很幸运,Stouts创造了django role

您可以使用以下命令将其安装到项目中:

ansible-galaxy install Stouts.django

答案 1 :(得分:0)

Ansible 2.0中引入的blockinfile模块完全可以满足您的需求。它将在文件中创建和管理带有特殊开始和结束标记(默认为“ BEGIN / END ANSIBLE MANAGED BLOCK”)的块。