如何在ansible任务中使用when子句

时间:2014-12-07 02:10:46

标签: python django ansible ansible-playbook

我在ansible的文件中有以下内容:

- name: Run the Django syncdb command
  django_manage:
    command: syncdb
    app_path: '{{ application_path }}'
    virtualenv: '{{ virtualenv_path }}'
    settings: '{{ django_settings_file }}'
  environment: django_environment
  when: run_django_syncdb
  tags: django

- name: Run Django South migrations
  django_manage:
    command: migrate
    app_path: '{{ application_path }}'
    virtualenv: '{{ virtualenv_path }}'
    settings: '{{ django_settings_file }}'
  environment: django_environment
  when: run_django_south_migration
  tags: django

运行以下行时:

$ ansible-playbook development.yml --tags "django"

这两个命令都会运行。有没有办法利用上面一行中的when子句只运行其中一个命令?

2 个答案:

答案 0 :(得分:2)

在你的情况下,我宁愿使用标签。您可能错过的是您可以将列表传递给标签。这将是分组任务的常用方法:

- name: Run the Django syncdb command
  django_manage:
    command: syncdb
    app_path: '{{ application_path }}'
    virtualenv: '{{ virtualenv_path }}'
    settings: '{{ django_settings_file }}'
  environment: django_environment
  tags: 
    - django
    - django_sync

- name: Run Django South migrations
  django_manage:
    command: migrate
    app_path: '{{ application_path }}'
    virtualenv: '{{ virtualenv_path }}'
    settings: '{{ django_settings_file }}'
  environment: django_environment
  tags: 
    - django
    - django_south

因此,如果您要同时执行这两项任务,请拨打ansible-playbook development.yml --tags django,或者通过ansible-playbook development.yml --tags django_south

调用其中一项任务 拉蒙的回答也有效,但由于以下原因,我更倾向于采用我的做法:

  • 我将变量视为机器参数而不是任务参数。您宁愿标记要执行的任务而不是设置机器参数(因为它可能会随着每次调用而改变)

  • 使用条件时,您将始终在日志文件中看到task skipped,这很烦人;)

答案 1 :(得分:1)

如果要运行任务,run_django_syncdbrun_django_south_migration,您似乎检查了两个变量。

这些可以通过-e调用ansible传递:

$ ansible-playbook development.yml --tags "django" -e "run_django_syncdb=true"
$ ansible-playbook development.yml --tags "django" -e "run_django_south_migration=false"

您未提及的变量将设置为您为其设置的默认值。

如果要设置多个变量,请按空格分隔添加它们:

$ ansible-playbook development.yml --tags "django" -e "run_django_syncdb=true run_django_south_migration=false"