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

How to change part of file via ansible template

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).

我可以通过 模板 来完成吗?或者更好地使用 replace?

ansible 中是否有其他方法来设置 django-settings?

template 模块将覆盖整个文件。没有仅替换特定部分的选项。这就是模板的概念。

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

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

不过你很幸运,Stouts 创造了一个 django role:

您可以将其安装在您的项目中:

ansible-galaxy install Stouts.django

Ansible 2.0 中引入的 blockinfile 模块正是您想要的。它将在您的文件中创建和管理一个带有特殊开始和结束标记(默认为"BEGIN/END ANSIBLE MANAGED BLOCK")的块。