Ansible change default value according to a condition - ansible

I need to help with Ansible and make variable base on condition with another user defined variable.
I wrote something like this, but I am pretty sure this is wrong script.
So "{{ vcpu_size }}" has to be define base on user defined "{{ vm_size }}" and I don't know how to do it
Thanks for help
---
- name: Deploy VM on XenServer
hosts: XEN_Server
become: true
tasks:
- name: Load VPS specs for chosen type
set_fact:
vcpu_size: "{{ '2' if ({{ vm_size }} == 'S') }}"
vcpu_size: "{{ '4' if ({{ vm_size }} == 'M') }}"
vcpu_size: "{{ '6' if ({{ vm_size }} == 'L') }}"
vcpu_size: "{{ '8' if ({{ vm_size }} == 'XL') }}"
- debug:
msg: "Write {{ vcpu_size }} and to be sure {{ vm_size }}"

You can define the sizes in group_vars/all, or somewhere else (such as vars for the role, or in the playbook itself):
sizes:
S: 2
M: 4
L: 6
XL: 8
Then use it like this:
set_fact:
vcpu_size: "{{ sizes[vm_size] }}"

You can use Jinja expression like this :
vcpu_size: "{% if vm_size == 'S' %}2{% elif vm_size == 'M' %}4{% else %}some_def_value_here{% endif %}"

Related

ansible jinja2 template delimiters failed if using 'when'

I have this code, where the first task fails and the second task produces the following warning:
[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: {{ VRF }} == 17
I am assuming this warning and the failure of the first task are happening for the same reason. From what I understand, the variables are different types. How do I fix this?
---
- name: PE_CE
hosts: localhost
tasks:
- include_vars: /opt/netsec/ansible/orchestration/capabilities/PE_CE/PE_CE_1.yml
- name: Build PE config Cisco
template:
src=/opt/netsec/ansible/orchestration/cisco_templates/PE_CE_CISCO_config_PE.j2
dest=/opt/netsec/ansible/orchestration/config_outputs/new/{{PE_HOSTNAME}}
when: "{{ PX_HOSTNAME }} == None"
- name: Build CE config Cisco
template:
src=/opt/netsec/ansible/orchestration/cisco_templates/PE_CE_CISCO_config_CE.j2
dest=/opt/netsec/ansible/orchestration/config_outputs/new/{{CE_HOSTNAME}}
when: "{{ VRF }} == 17"
What I really want to do is when: "{{ VRF }} == 17" and "{{ PX_HOSTNAME }} == None", or something like {{ PX_HOSTNAME }}|length < 1"
You do not need {{ and }} with when. Do it like this:
when: PX_HOSTNAME == "None" and when: VRF == "17"
Here is some documentation
when: PX_HOSTNAME == "None" will check if PX_HOSTNAME contains the string "None".
If you want to run the task if it is empty, do when: not PX_HOSTNAME or if you want to run the task it it is not empty, do when: PX_HOSTNAME.
You can use the length as well: when: PX_HOSTNAME|length > 0

Unclear ansible variable formatting

When formatting variables in ansible playbooks which format should be followed?
I cannot for the life of me find a straight answer for this?
environment:
- http_proxy: "{{ {{ proxy }} if {{ proxy }} != '' else {{ ansible_local.proxy_facts.proxy }} }}"
- http_proxy: "{{ proxys if proxy != '' else ansible_local.proxy_facts.proxy }}"
Use ternary filter. For example
- set_fact:
http_proxy: "{{ (proxy|length > 0)|
ternary(proxy, ansible_local.proxy_facts.proxy) }}"
Don't compare to empty string

skip multiple values for loop which is passing to a task ansible

how can I filter out unwanted values from loop which are passed from register output (from previous task)
code
# assume the list_one below register values.
list_one = [root, a, b, c]
- name: with_together
debug:
msg: "{{ item.0 }} - {{ item.1 }}"
with_together:
- "{{ list_one }}"
- "{{ list_two }}"
how can I skip only root passing to {{item.0}} ?
Thanks
You can add a when condition as below
- name: with_together
debug:
msg: "{{ item.0 }} - {{ item.1 }}"
when: item.0 != 'root'
with_together:
- "{{ list_one }}"
- "{{ list_two }}"

Conditional ansible to set variable

Tried all luck but doesnot work. I would require to set the environment variable check with a condition and then run a play or task on the main.yml while doing includes and using 2 tasks.
main.yml
- include: createnonprod.yml
when: "{{ environment }}" == 'dev' or "{{ environment }}" == 'qa' or "
{{ environment }}" == 'preprod'
- include: createprod.yml
when: "{{ environment }}" == 'prod'
The environment is set on groups_vars variable file "all"
environment:
"{{ lookup('env','ENVIRONMENT') }}"
But this logic to check fails
(Or)
I need to run this logic so that it calls the task with a condition to check the variable
create.yml
- name: Install all users from IAM of the AWS Account.
shell: "{{ scriptdir }}/install.sh -i {{ iamgroup }},{{ sudogroup }} -s {{ sudogroup }}"
when: "{{ environment }}" == 'dev' or "{{ environment }}" == 'qa' or "{{ environment }}" == 'preprod'
- name: Install all users from IAM of the AWS Account.
shell: "{{ scriptdir }}/install.sh -i {{ iamgroup }},{{ sudogroup }} -s {{ sudogroup }}"
when: "{{ environment }}" == 'prod'
Please help me with a logic that works. I get this error:
fatal: [localhost]: FAILED! => {"failed": true, "reason": "ERROR!
Syntax Error while loading YAML.\n\n\nThe error appears to have been in
'/tmp/ansible/roles/provision/users/tasks/create.yml': line 18, column
22, but may\nbe elsewhere in the file depending on the exact syntax
problem.\n\nThe offending line appears to be:\n\n when:\n - {{
env_type }} == 'dev'\n ^ here\nWe could be wrong,
but this one looks like it might be an issue with\nmissing quotes.
Always quote template expression brackets when they\nstart a value. For
instance:\n\n with_items:\n - {{ foo }}\n\nShould be written
as:\n\n with_items:\n - \"{{ foo }}\"\n"}
The When Statement
The when clause, which contains a raw Jinja2 expression without
double curly braces
when: environment == 'dev' or environment == 'qa' or environment == 'preprod'
when: environment == 'prod'
What if you try this way.
Define a variable to handle the lookup of your environment:
vars:
env_value: "{{ lookup('env', 'ENVIRONMENT') }}"
and then use this variable in the when condition:
when: env_value == "dev"
Simple example:
- hosts: "localhost"
vars:
env_value: "{{ lookup('env', 'ENVIRONMENT') }}"
tasks:
- shell: echo "I've got {{ env_value }} and am not afraid to use it!"
when: env_value == "prd"
Example in your code:
- name: Install all users from IAM of the AWS Account.
shell: "{{ scriptdir }}/install.sh -i {{ iamgroup }},{{ sudogroup }} -s {{ sudogroup }}"
when: env_value == 'dev' or env_value == 'qa' or env_value == 'preprod'
Please, also look at this link about Ansible environment variable name being reserved.

how to use variable in "when" statement in ansible?

I am trying to use a variable in when statement in ansible ,
my code snippet looks like this :
- name: git repo for non prod env
git:
repo=http://url/repo.git
dest=/opt/dest
version={{ bld_env }}
when: ( "{{ bld_env }}" == "rc" ) or ( "{{ bld_env }}" == "sandbox" ) or ( "{{ bld_env }}" == "dev" ) or ( "{{ bld_env }}" == "qa" )
This is not working and gives an a error as :
The offending line appears to be:
version={{ bld_env }}
when: "{{ bld_env }}" == "rc"
^ here
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 }}"
Let me know where I am wrong.
I think you don't have to use "{{ bld_env }}" == "rc".
Just compare variable to value bld_env == "rc" and so on as it is written in documentation

Resources