标签: jinja

Ansible:如果满足某个条件,则有条件地在 vars 文件中定义变量

根据定义到 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)

我在这里做一些愚蠢的事情还是什至不支持?我试图找到另一种定义这些变量的方法(我有很多),但我没有设法在这里得到一些功能。有什么建议?

automation ansible jinja

30
推荐指数
3
解决办法
8万
查看次数

在 Jinja2 模板中循环 Ansible 变量数组

例如,当 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)

json ansible jinja

15
推荐指数
1
解决办法
5万
查看次数

盐堆 | 如何将 cmd.run 的 shell 输出分配给 Jinja 变量?

问题

无法从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)

shell saltstack jinja

6
推荐指数
1
解决办法
1万
查看次数

如何从 Jinja 模板内部触发自定义错误?

尽管 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 模板内部输出整洁的失败消息?

template custom-errors ansible jinja

5
推荐指数
2
解决办法
5199
查看次数

在 ansible 列表变量中拒绝

我有这样一个变量:

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)

ansible jinja

5
推荐指数
1
解决办法
9412
查看次数

如何在单块中执行多行 Jinja2 条件?

以下代码因语法错误而被拒绝:

{%
    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 大师纠正我......拜托?

template ansible jinja

3
推荐指数
1
解决办法
1万
查看次数

使用 jinja 在 Ansible 中动态创建列表

我需要动态设置一个新的列表类型变量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)

python ansible ansible-playbook jinja

2
推荐指数
1
解决办法
1万
查看次数