根据定义到 group_vars 中的变量的值(真/假),我试图在 vars 文件中定义一些变量。它们的值取决于组变量的值。
我当前的 var 文件如下所示:
{% if my_group_var %}
test:
var1: value
var2: value
...
varn: value
{% else %}
test:
var1: other_value
var2: other_value
...
varn: other_value
{% endif %}
Run Code Online (Sandbox Code Playgroud)
对于我的每一个角色,我都使用了一个定义在这个文件中的变量。
我的测试手册如下所示:
- name: blabla
hosts: blabla
vars_files:
- <path>/test_vars.yml
roles: blabla
Run Code Online (Sandbox Code Playgroud)
运行剧本后我收到的错误是:
{% if my_group_var %}
^ here
exception type: <class 'yaml.scanner.ScannerError'>
exception: while scanning for the next token
found character that cannot start any token
in "<unicode string>"
Run Code Online (Sandbox Code Playgroud)
我在这里做一些愚蠢的事情还是什至不支持?我试图找到另一种定义这些变量的方法(我有很多),但我没有设法在这里得到一些功能。有什么建议?
例如,当 Ansible 收集有关主机的事实时,它会获取主机的所有挂载:
"ansible_mounts": [
{
"block_available": 7800291,
"block_size": 4096,
"block_total": 8225358,
"block_used": 425067,
"device": "/dev/mapper/foobar",
"fstype": "xfs",
"inode_available": 16403366,
"inode_total": 16458752,
"inode_used": 55386,
"mount": "/",
"options": "rw,seclabel,relatime,attr2,inode64,noquota",
"size_available": 31949991936,
"size_total": 33691066368,
"uuid": "2ebc82cb-5bc2-4db9-9914-33d65ba350b8"
},
{
"block_available": 44648,
"block_size": 4096,
"block_total": 127145,
"block_used": 82497,
"device": "/dev/sda1",
"fstype": "xfs",
"inode_available": 255595,
"inode_total": 256000,
"inode_used": 405,
"mount": "/boot",
"options": "rw,seclabel,relatime,attr2,inode64,noquota",
"size_available": 182878208,
"size_total": 520785920,
"uuid": "c5f7eaf2-5b70-4f74-8189-a63bb4bee5f8"
},
Run Code Online (Sandbox Code Playgroud)
等等。所以我想做的是:在模板中,我想遍历数组中的所有对象并输出每个“mount”键的值。
我像这样尝试:
(% for mounts in {{ ansible_mounts }} %)
Mountpoint: {{ ansible_mounts.mount }}
(% …Run Code Online (Sandbox Code Playgroud) 无法从cmd.run我的 Salt State分配输出。即使load_avgminion 中的 并不真正等于或超出 ,条件也始终返回 true threshold。我还在配置中包含了我尝试过的东西。
# {% set load_avg = salt['cmd.run']('uptime | sed "s/.*load average: //" | cut -d " " -f2 | cut -d . -f1') %} # Not working
# {% set load_avg = salt['cmd.run']('/bin/sh -c "uptime | sed \"s/.*load average: //\" | cut -d \" \" -f2 | cut -d . -f1"') %} # Not working
# {% set load_avg = salt['cmd.run']('echo 0') %} # Not working …Run Code Online (Sandbox Code Playgroud) 尽管 Ansible 本身有触发自定义错误的方法,但我找不到类似 Jinja 的任何内容。
我当前的方法使用语法错误:
{% if 'ansible_mounts' in hostvars[host] %}
# {{ host }} knows its mount-points
{% else %}
# {% error!! No ansible_mounts listed for host - fact-gathering must've failed %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)
但是那些在运行时渲染得很差——需要查看模板文件内部并搜索错误(渲染甚至不包括行号!)。
有没有办法从 Jinja 模板内部输出整洁的失败消息?
我有这样一个变量:
apps:
- {name: kapitalism, extension: .war}
- {name: socialism, extension: .war}
- {name: somethingelse, extension: .ear}
Run Code Online (Sandbox Code Playgroud)
我需要根据它制作另一张,其中不会包括某些列表。我正在尝试这个:
- name: Reject this please
set_fact:
apps: "{{ apps | map(attribute='name') | reject('search',item.name) | list }}"
when: "item.name.find('socialism') != -1"
with_items: "{{ apps }}"
Run Code Online (Sandbox Code Playgroud)
但在这里我遇到了这样一个问题,扩展参数丢失了,我得到了变量:
apps: [u'kapitalism', u'somethingelse']
Run Code Online (Sandbox Code Playgroud)
如何创建这样的变量:
apps:
- {name: kapitalism, extension: .war}
- {name: somethingelse, extension: .ear}
Run Code Online (Sandbox Code Playgroud)
?
以下代码因语法错误而被拒绝:
{%
if inventory_hostname in groups.aptcache
set cachehost = 'localhost'
else
set cachehost = groups['aptcache'] | first
endif
%}
cache={{ cachehost }}
Run Code Online (Sandbox Code Playgroud)
我希望,我的意图足够清楚,以便 Jinja2 大师纠正我......拜托?
我需要动态设置一个新的列表类型变量list var。
这是一个基本的剧本示例:
vars:
app_instances:
- host_name: host1-domain
inst_count: 3
- host_name: host2-domain
inst_count: 1
- host_name: host3-domain
inst_count: 1
tasks:
- set_fact:
instance_config: >-
{% set inst_config = [] %}
{% for inst in app_instances %}
{% for inst_num in range(inst.inst_count) %}
{% set node_number = inst.host_name.split('-') | first | replace('host', '') %}
{% set host_name = "host_name" %}
{% set host_num = "host_num" %}
{% set inst_name = "inst_name" %}
{% set node_conf = { host_name: inst.host_name, host_num: …Run Code Online (Sandbox Code Playgroud)