我正在使用Ansible部署我的Django应用程序。
在我的Ansible攻略中,我有一个创建超级用户的步骤:
- name: django create superuser
django_manage:
virtualenv: /.../app
app_path: /.../app
command: "createsuperuser --noinput --username=admin --email=admin@{{ inventory_hostname }}"但当我第二次运行我的剧本时,由于数据库约束错误而失败,因为具有给定用户名的超级用户已经存在。我希望Ansible只创建一次用户。
如何使这一步是幂等的?
发布于 2017-08-28 21:00:12
这是未经测试的,但它应该可以工作:
- name: Check if django superuser exists
django_manage:
virtualenv: /.../app
app_path: /.../app
command: shell -c 'import sys; from django.contrib.auth.models import User; sys.exit(0 if User.objects.filter(username="admiin").count() > 0 else 1)'
register: checksuperuser
check_mode: True
ignore_errors: True
changed_when: False
- name: django create superuser
django_manage:
virtualenv: /.../app
app_path: /.../app
command: "createsuperuser --noinput --username=admin --email=admin@{{ inventory_hostname }}"
when: checksuperuser.rc != 0发布于 2020-06-29 19:00:34
另一种选择是告诉ansible忽略该错误:
- name: django create superuser
django_manage:
virtualenv: /.../app
app_path: /.../app
command: "createsuperuser --noinput --username=admin --email=admin@{{ inventory_hostname }}"
ignore_errors: yes发布于 2021-09-23 13:42:11
Antonis Christofides的回答启发了以下内容,但有几个方面需要改进:
我已经使我的工作副本更加通用,显然你需要提供你自己的变量。
- name: Check if django superuser {{ username }} exists
django_manage:
command: shell -c 'import sys; from django.contrib.auth.models import User; print(User.objects.filter(username="{{ username }}").count())'
virtualenv: "{{ working_directory }}/venv"
project_path: "{{ working_directory }}"
register: checksuperuser
ignore_errors: True
changed_when: False
- name: django create superuser {{ username }}
django_manage:
command: "createsuperuser --noinput --username={{ username }} --email={{ username }}@change-me.example.org"
virtualenv: "{{ working_directory}}/venv"
project_path: "{{ working_directory }}"
when: checksuperuser.out|trim == "0"
changed_when: True
ignore_errors: Truehttps://stackoverflow.com/questions/45915174
复制相似问题