在 Ansible Jinja 模板中使用 last/first hostname hostvars
Use last/first hostname hostvars in Ansible Jinja template
我正在为 Ansible 使用 aws ec2 inventory 并且有一个像这样的 jinja 模板(换行符是为了提高可读性 - 都是一行):
my_variable: "{% if tags.Id == '1' -%}
{{groups['tag_Name_myinstance'] | sort | hostvars[last].tags.dns}}
{% else -%}
{{groups['tag_Name_myinstance'] | sort | hostvars[first].tags.dns}}
{% endif %}:123"
失败 Error was a <class 'ansible.errors.AnsibleError'>, original message: template error while templating string: expected token 'end of print statement', got '['
目的是始终使用最后一个实例(即具有最高 Id 值)作为值传递给 Id=1 的实例,并使用第一个实例传递给所有其他实例。
如果我只是这样做,它会提供可靠的主机名,例如 i-0123456789(ec2 实例 ID):
my_variable: "{% if tags.Id == '1' -%}
{{groups['tag_Name_myinstance'] | sort | last}}
{% else -%}
{{groups['tag_Name_myinstance'] | sort | first}}
{% endif %}:123"
如何将 jinja 中的 first
或 last
转换为可以从中获取 hostvars 的方式,前提是它解析为主机名(aws ec2 实例 ID)?我想专门抓取 dns 的标签。在我的 yaml 的其他部分,我像这样引用它:
other_variable: "{{ tags.dns }}"
而且效果很好。
就像在算术表达式中一样,您可以用括号 ()
对 Jinja 过滤器列表进行分组。或者使用复杂的表达式作为 hostvars
字典中的键。
然后从这个yield的字典中获取你想要的属性。
my_variable: >-
{%- if tags.Id == '1' -%}
{{ hostvars[groups['tag_Name_myinstance'] | sort | last].tags.dns }}
{%- else -%}
{{ hostvars[groups['tag_Name_myinstance'] | sort | first].tags.dns }}
{%- endif %}:123
还有关于你的
line breaks are readability - it's all one line
嗯,这正是 YAML multiline is for。
所以上面的 YAML 片段是一个完全有效的片段,在多行上。
关于 YAML 多行的额外提示:这个网站非常简洁“勾选方框,看看它是如何呈现的” 种类:https://yaml-multiline.info/
我正在为 Ansible 使用 aws ec2 inventory 并且有一个像这样的 jinja 模板(换行符是为了提高可读性 - 都是一行):
my_variable: "{% if tags.Id == '1' -%}
{{groups['tag_Name_myinstance'] | sort | hostvars[last].tags.dns}}
{% else -%}
{{groups['tag_Name_myinstance'] | sort | hostvars[first].tags.dns}}
{% endif %}:123"
失败 Error was a <class 'ansible.errors.AnsibleError'>, original message: template error while templating string: expected token 'end of print statement', got '['
目的是始终使用最后一个实例(即具有最高 Id 值)作为值传递给 Id=1 的实例,并使用第一个实例传递给所有其他实例。
如果我只是这样做,它会提供可靠的主机名,例如 i-0123456789(ec2 实例 ID):
my_variable: "{% if tags.Id == '1' -%}
{{groups['tag_Name_myinstance'] | sort | last}}
{% else -%}
{{groups['tag_Name_myinstance'] | sort | first}}
{% endif %}:123"
如何将 jinja 中的 first
或 last
转换为可以从中获取 hostvars 的方式,前提是它解析为主机名(aws ec2 实例 ID)?我想专门抓取 dns 的标签。在我的 yaml 的其他部分,我像这样引用它:
other_variable: "{{ tags.dns }}"
而且效果很好。
就像在算术表达式中一样,您可以用括号 ()
对 Jinja 过滤器列表进行分组。或者使用复杂的表达式作为 hostvars
字典中的键。
然后从这个yield的字典中获取你想要的属性。
my_variable: >-
{%- if tags.Id == '1' -%}
{{ hostvars[groups['tag_Name_myinstance'] | sort | last].tags.dns }}
{%- else -%}
{{ hostvars[groups['tag_Name_myinstance'] | sort | first].tags.dns }}
{%- endif %}:123
还有关于你的
line breaks are readability - it's all one line
嗯,这正是 YAML multiline is for。
所以上面的 YAML 片段是一个完全有效的片段,在多行上。
关于 YAML 多行的额外提示:这个网站非常简洁“勾选方框,看看它是如何呈现的” 种类:https://yaml-multiline.info/