ansible - "when"条件不使用逻辑"AND"运算符

Jah*_*iam 1 yaml jinja2 ansible ansible-playbook

我正在尝试为开发人员编写ansible playbooks并为django应用程序测试env配置.然而,在ansible任务中使用条件时似乎存在问题.

在下面的代码中,任务2在任务1被更改时执行.它不检查第二个条件.

- 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
Run Code Online (Sandbox Code Playgroud)

每当更改Task1而不评估第二个条件时,就会运行任务2

"'Applying auth.0001_initial... OK' in django_migration_result.stdout"
Run Code Online (Sandbox Code Playgroud)

当我尝试没有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"
Run Code Online (Sandbox Code Playgroud)

以上是按预期工作的.我尝试用boolean var替换它,甚至还没有运气.

Ansible版本:2.0.0.1

任何想法,请帮忙.

udo*_*dan 6

你的第二个条件似乎是一个字符串.我的意思是整个条件.字符串始终为true.

"'Applying auth.0001_initial... OK' in django_migration_result.stdout"
Run Code Online (Sandbox Code Playgroud)

在最后一个代码块中,整个条件都在引号中.这将是yaml级别的字符串以及它之所以有效的原因.

这个:

key: value
Run Code Online (Sandbox Code Playgroud)

是相同的:

key: "value"
Run Code Online (Sandbox Code Playgroud)

写这样的条件应该可以解决问题:

when: django_migration_result|changed and ('Applying auth.0001_initial... OK' in django_migration_result.stdout)
Run Code Online (Sandbox Code Playgroud)

甚至更好:

when:
  - django_migration_result | changed
  - 'Applying auth.0001_initial... OK' in django_migration_result.stdout
Run Code Online (Sandbox Code Playgroud)

  • 我发现 Ansible 的语法像这样完全令人困惑。在某些地方你必须引用并使用转义符,例如`"{{variable|int }}"`。在其他地方,你可以直接写一个条件。在其中一些地方,引用和转义的形式似乎也不起作用...... (3认同)