Variables in "when" statement

Hi,

I want to use variable in when statement, for example:

  • include: some_playbook.yml
    when: “{{ SOME_VARIABLE }}” == “true”

where:
SOME_VARIABLE - is given as false/true via --extra-vars

Unfortunately I get error:

ERROR: Syntax Error while loading YAML script, run_soak_test.yaml
Note: The error may actually appear before this position: line 3, column 26

  • include: some_playbook.yml
    when: “{{ SOME_VARIABLE }}” == “true”
    ^
    We could be wrong, but this one looks like it might be an issue with
    missing quotes. Always quote template expression brackets when they
    start a value. For instance:

with_items:

  • {{ foo }}

Should be written as:

with_items:

  • “{{ foo }}”

Do you know what’s the reason and what’s the workaround?

Thanks in advance,
Wojtek

Hi Wojtek

The error you are getting is due to inconsistent quoting. You may also need to cast your variable. Try one of these:

- include: some_playbook.yml
  when: "{{ some_variable | bool }} == True"

or shorter:

- include: some_playbook.yml
  when: "{{ some_variable | bool }}"

See http://docs.ansible.com/YAMLSyntax.html#gotchas and http://docs.ansible.com/playbooks_variables.html#other-useful-filters for more details.

Regards
Tom

Thanks Tom. It worked pefrect.

But I faced another issue with including tasks.
I have the file tasks.yml with two tasks, I tagged them as below:

  • name: Perform action - FULL
    shell: run_script_full.py
    tags:
  • full
  • name: Perform action - BASIC
    shell: run_script_basic.py
    tags:
  • basic

In my main playbook I want to inlcude them like below:

  • hosts: controller
    user: ansuser
    tasks:
  • include: tasks.yml tags=full
    when: “‘{{ LEVEL }}’ == ‘full’”
  • include: tasks.yml tags=basic
    when: “‘{{ LEVEL }}’ == ‘basic’”

I run ansible with command:

ansible-playbook main_playbook.yml --extra-vars=“LEVEL=basic”. My point is to execute only task with tagged as “basic” so I’d like main script to:

  1. skip first include statement
  2. execute tasks.yml in second include statement but only second one (first is tagged as full so requirenments are not met).

Is it possible to achive this way?

Regards,
Wojtek

W dniu wtorek, 13 stycznia 2015 09:29:08 UTC+1 użytkownik Wojciech Korzenny napisał:

The inclusion of tagged tasks doesn’t work like you’re expecting in your example. That will simply tag all tasks in the included file. It won’t include the tasks that are tagged like that. You want something like:

`

cat hosts
[localhost]
127.0.0.1

cat playbook.yml

Cheers Dan for your answer.
It works but it’s not exactly what I want to achieve. I tried one more configruation using tags but still doesn’t work as I expect.
I have main playbook (test1.yml) with only one include:

  • include: test2.yml tags=“{{ TEST_LEVEL }}”

Playbook test2.yml looks like below:

  • hosts: controller
    user: ansuser
    tasks:

  • name: Test task 1
    shell: ‘echo 1’
    tags:

  • test1

  • hosts: controller
    user: ansuser
    tasks:

  • name: Test task 2
    shell: ‘echo 2’
    tags:

  • test2

I’d like to run main playbook with extra-vars where I set TEST_LEVEL, like:
ansible-playbook examples/test1.yml --extra-vars=“TEST_LEVEL=test2”

and value of TEST_LEVEL to be a tag for choosing tasks from test2.yml playbook.

For now it executes all tasks (whatever value for TEST_LEVEL I choose). Is there any typo/wrong quotas etc.in my playbook or I just try to use something wrong way?

Regards,
Wojtek

W dniu wtorek, 13 stycznia 2015 09:29:08 UTC+1 użytkownik Wojciech Korzenny napisał:

Hi, I got what you said. However, I must repeat myself: passing tags to the include task will tag all tasks in the included file, it will NOT call ONLY the tasks that have that specific tag.