Concatenating a variable in Jinja with a single quote - jinja2

I'm having trouble trying to concatenate variables (one with a single quote) in Jinja. My code looks like this:
{%- set my_quote = "'" -%}
{%- set invocation = invocation_id -%}
And the output I'm attempting is this:
{{ invocation ~ my_quote }}
The output from this is:
f21f9039-44e5-452f-8d7a-ee64245ada23'
Ok great! Now when I attempt to add the single quote to the beginning as well:
{{ my_quote ~ invocation ~ my_quote }}
The output is the invocation variable value without any single quotes:
f21f9039-44e5-452f-8d7a-ee64245ada23
How can I get this to output both single quotes properly?

Try the following:
"'{{ invocation_id }}'"

oh I love this question and the great reproducible example you provided. First thought, what happens if you escape the ' like this?
{%- set my_quote = "\'" -%}

Is there a reason it has to be part of the variable?
Could you do:
'{{ invocation }}'

Related

Using Saltstack cmd.script with args to Insert Jinja Variable

I am running a powershell script to obtain a particular user's credentials, and then use those credentials in a salt state. This works fine when the username is hardcoded directly in the powershell script. But, I am unable to pass the username as an argument. Here is my salt state:
{% set creds = salt['cmd.powershell']('C:\test2.ps1' 'username') %}
test_output:
cmd.run:
- name: echo {{ creds }}
I have also tried this too...but it doesn't work.
{% set creds = salt['cmd.script'](shell='powershell' source='C:\test2.ps1' args='username')
%}
How do i correctly pass an argument to my powershell script to set my variable?
The rules for strings and function calls are the same in Jinja as for Python. Either " or ' are the string delimiters, and \ is the escape character. Function arguments are separated by commas.
{% set creds = salt['cmd.powershell']('C:\\test2.ps1 username') %}
For cmd.script, the source should be a remote URL, not a local file.
{% set creds = salt['cmd.script'](shell='powershell', source='salt://path/test2.ps1', args='username') %}

Jinja2 if/else on user defined variable

Attempting to make a decision in a template based on the last character of a variable (third level domain hostname) , but the epiphany alludes me. Make a config stanza if value else, do the other.
I set a fact in play:
- name: Set third level domain name to a variable
set_fact:
my_3rd_levelname: "{{ ansible_nodename.split('.')[0] }}"
- name: Ascertain if which server we're on
set_fact:
my_one_or_two: "{{ my_3rd_levelname[-1]|int }}"
...which appears to echo out with debug, save the casting as an int...see below.
TASK [role-test : Echo out my_one_or_two] *******************************************************************************************************************
ok: [w.x.y.42] => {
"my_one_or_two": "2"
}
Then in the template.j2...
{# If my_one_or_two is even list server1 first. If not, second. #}
{% if lookup('vars,',my_one_or_two) + my_one_or_two|int is 1 %}
[some config file stanza here]
{% else %}
[some other config file stanza instead]
I've poked and hoped until I can stand it no longer and am reaching out. I've tried just using the raw variable, e.g., {% if my_one_or_two|int == 1 %} along with many other attempts, but I'm stuck. I can't seem to overcome this error:
AnsibleError: template error while templating string: expected token 'name', got 'integer'. String: [the contents of my template]
Any input would be greatly appreciated at this juncture.
Thanks
Okay...leaving this here in case someone else doesn't realize you can use any Python method that the object supports. Here's what I did. Remember the server names end in 1 or 2 and its a String.
Created a varible in /roles/[rolename]/vars...
my_simple_hostname: "{{ ansible_nodename.split('.')[0] }}"
Then used the 'endswith' method to evaluate it....
% if my_simple_hostname.endswith('1') == true %}
[content if true]
{% else %}
[content when false]
{% endif %}

Replace and eval in Jinja

I have a string like this as Jinja variable:
foo-VERSION-bar
I want to replace VERSION with {{ grains.lsb_distrib_release }} and I want this to get evaluated.
if grains.lsb_distrib_release contains 123 I want the result to be foo-123-bar.
How to replace and eval in jinja?
Set value of your grain to a variable:
{% set version = salt['grains.get']('lsb_distrib_release', {}) %}
Use Jinja replace function:
{{ "foo-VERSION-bar"|replace("VERSION", version) }}
Without using replace Jinja filter, you can use its concatenation possibilities
{{ 'foo-' ~ salt['grains.get']('lsb_distrib_release') ~ '-bar' }}

Liquid map error "After parsing a value an unexpected character was encountered"

I have a very simple Liquid map (extract here below):
{
{% if content.DisplayLastName__c %}
"DisplayLastName__c": "{{ content.DisplayLastName__c }}",
{% endif %}
}
The input message of the map is the following:
{
"DisplayLastName__c": "é\" r",
"FirstName": "é\""
}
I got this error due to the fact that there is a \" in one field: "After parsing a value an unexpected character was encountered".
Am I missing something?
The following worked for me, however I don't fully know why:
{% assign vDescription = system.Data.Description | Replace: '\"', '\"' %}

Parsing a token with hyphen in Jinja

I have a token which has hyphen in it and I am trying to read it in jinja, Here is the sample code:
{
[
{
{% for curPool in data.pool %}
"name": "{{curPool.name}}",
"my-org":"{{curPool.my-org}}"
{% endfor %}
}
]
}
The variable curPool has two fields: name and my-org ( i have no choice of defining these tokens)
When I run this code, I get an error:
Can't render, error: 'unsupported operand type(s) for -: 'Undefined' and 'Undefined''
It seems to me that it does not know how to parse the hyphen in the token name. I have tried to escape it with '\', ''', and a '%'. But nothing works. Would appreciate your help
Thanks
dict.get() can be used:
"my-org":"{{curPool.get('my-org')}}"