我正在尝试为开发人员编写ansible playbooks,并为django应用程序测试env配置。但是,在ansible任务中使用条件时似乎存在问题。
在下面的代码中,当任务1被更改时,执行任务2。它没有检查第二个条件。
- name: Task 1
become: yes
command: docker-compose run --rm web python manage.py migrate chdir="{{ server_code_path }}"
when: perform_migration
register: django_migration_result
changed_when: "'No migrations to apply.' not in django_migration_result.stdout"
tags:
- start_service
- django_manage
- name: Task 2 # Django Create Super user on 1st migration
become: yes
command: docker-compose run --rm web python manage.py loaddata create_super_user_data.yaml chdir="{{ server_code_path }}"
when: django_migration_result|changed and ("'Applying auth.0001_initial... OK' in django_migration_result.stdout")
ignore_errors: yes
tags:
- start_service
- django_manage
每当更改Task1而不评估第二个条件
时,就会运行任务2"'Applying auth.0001_initial... OK' in django_migration_result.stdout"
当我在没有django_migration_result|changed
的情况下尝试时,它按预期工作。
- name: Task 2 # Django Create Super user on 1st migration
become: yes
command: docker-compose run --rm web python manage.py loaddata create_super_user_data.yaml chdir="{{ server_code_path }}"
when: "'Applying auth.0001_initial... OK' in django_migration_result.stdout"
以上是按预期工作的。我尝试用boolean var替换它,甚至还没有运气。
Ansible版本:2.0.0.1
任何想法,请帮助。
答案 0 :(得分:5)
您的第二个条件似乎是一个字符串。我的意思是整个条件。字符串始终为真。
"'Applying auth.0001_initial... OK' in django_migration_result.stdout"
在您的上一个代码块中,整个条件都在引号中。这将是一个关于yaml级别的字符串以及它之所以起作用的原因。
此:
key: value
与:
相同key: "value"
写下这样的条件应该可以解决问题:
when: django_migration_result|changed and ('Applying auth.0001_initial... OK' in django_migration_result.stdout)
甚至更好:
when:
- django_migration_result | changed
- 'Applying auth.0001_initial... OK' in django_migration_result.stdout