标签: ansible-template

如何使用glob模式将文件串联为单个值?

我有一个相当简单的剧本,可authorized_keys在Ansible中为给定的用户创建条目:

 - name: chat user authorized keys
   authorized_key:
     user: chat
     key: |
       {% for filename in lookup('fileglob', 'public_keys/*.pub') %}
       # {{ filename }}
       {{ lookup('file', filename ) }}
       {% endfor %}
     exclusive: true
Run Code Online (Sandbox Code Playgroud)

我在该目录中大约有六个公钥文件。我正在尝试使用换行符分隔的所有键来格式化单个文件内容。

这是Ansible docs建议的

独家

是否从authorized_keys文件中删除所有其他未指定的密钥。可以通过换行符将多个键指定在单个键字符串值中。此选项不是循环感知的,因此,如果使用with_,则它将在循环的每次迭代中独占,如果要在文件中包含多个键,则需要key如上所述将它们全部传递给一个批处理。

如何在这里使用fileglob将所有匹配的文件连接public_keys/*.pub到单个密钥中,以便我可以保持排他性并在必要时适当地删除密钥?

jinja2 ansible ansible-template

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

转义或区分 Ansible 和 <service> 中的 jinja 模板变量。

历史:

在过去的几个月里,我们一直在使用 Ansible 来部署我们的服务和配置文件,并且我们一直在使用 Ansible 变量。变量被放置在我们的 (config_name).yml.j2 文件中,这使我们可以轻松进行更改而无需对所有配置进行硬编码。

例如在 Ansibles group_vars 中,我们可能有:

metric_port_var: "9100"

并且 (config_name).yml.j2 将包含一行:

EXPOSE_METRIC_PORT={{ metric_port_var}}

当配置被部署时,盒子上的配置现在是:

EXPOSE_METRIC_PORT=9100

问题:

现在我们正在为 AlertManager/Prometheus 部署配置。出现的问题是 AlertManager 还在我们尝试部署的自己的配置文件中使用 jinja 模板变量。这些其他 jinja 模板将来自盒子上的其他配置文件。

这意味着我们的 (config_name).yml.j2 理论上将包含花括号变量的混合,其中一些可能属于 Ansible,而另一些将属于另一个文件。

由于在 group_vars 中找不到变量时抛出错误,我们不能再使用 Ansible 的“模板”模块来部署我们的配置,因为特定变量应该来自 AlertManager。

我们需要一种方法来混合 jinja 模板或转义一些花括号而不是其他花括号。现在我们回到硬编码我们的配置并让 AlertManager 使用所有变量。

jinja2 ansible prometheus ansible-template

3
推荐指数
2
解决办法
5335
查看次数

在Ansible中的Jinja2模板中获取列表的第一个“ N”个元素

我的大多数位置都有4个以上的DNS源,但有几个则更少。每个位置都有自己的dns4_ips列表变量,如下所示:

dns4_ips:
  - dns_A
  - dns_B
  - dns_C
  - dns_C
Run Code Online (Sandbox Code Playgroud)

我的resolv.conf模板如下所示:

domain example.com
search example.com dom2.example.com dom3.example.com
{% for nameserver in (dns4_ips|shuffle(seed=inventory_hostname)) %}
nameserver {{nameserver}}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

Jinja for循环工作得很好,但是在我有大量名称服务器的情况下,我只希望列出shuffle()返回的前3个。

我想到了这一点:

nameserver {{ (dns4_ips|shuffle(seed=inventory_hostname))[0] }}
nameserver {{ (dns4_ips|shuffle(seed=inventory_hostname))[1] }}
nameserver {{ (dns4_ips|shuffle(seed=inventory_hostname))[2] }}
Run Code Online (Sandbox Code Playgroud)

...但是在某些情况下,我只有一个或两个DNS服务器可用,因此它们会产生错误的行或错误,对吗?

是否存在使用for循环处理此问题的干净方法,还是我需要在其中包装三个名称服务器行{% if (dns4_ips|shuffle(seed=inventory_hostname))[1] is defined %}

jinja2 ansible ansible-template

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

作为 YAML 树的变量。如何保存缩进?

我有yml带模板的文件。模板是从 yml 树中间开始的键的一部分。

模板工作没问题,但缩进只保存最后一个键。如何保存所有键的缩进?

base.yml

app:
  config1:
    base: {{ service1.company.backend | to_nice_yaml(indent=2) }}
  config2:
    node: {{ service1.company.addr | to_nice_yaml(indent=2) }}
Run Code Online (Sandbox Code Playgroud)

config.yml

service1:
  company:
    backend:
      node1: "xxx"
      node2: "yyy"
      node3: "zzz"
    addr:
      street: ""
Run Code Online (Sandbox Code Playgroud)

我需要得到:

app:
  config1:
    base:
      node1: "xxx"
      node2: "yyy"
      node3: "zzz"
  config2:
    node:
      street: ""
Run Code Online (Sandbox Code Playgroud)

但真正的结果是:

app:
  config1:
    base:
      node3: "zzz"
node1: "xxx"
node2: "yyy"
  config2:
    node:
      street: ""
Run Code Online (Sandbox Code Playgroud)

node1并且node2不要保存缩进,Jinja2 解析器会获取最后一个节点。在下一步中,不正确的文件用于其他无法正确处理的角色。

ansible ansible-template

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

在 Ansible Jinja 模板中,如何转义双引号内的单引号?

在 Ansible 角色中,我使用 Jinja 模板创建一个从变量中获取值的文件。

vars 文件 vars/main.yml 的内容,从 jinja 模板中获取变量的位置:

Header:
 - key: a-b-c
   action: xxx
   option: '"xyz 'ZZZ' abc.de *.abc.de"'
   enabled: true
Run Code Online (Sandbox Code Playgroud)

Jinja 模板文件 templates/file.conf.j2 的内容:

{% for item in Header %}
{% if item.enabled is sameas true %}
Header {{ item.action }} {{ item.key }} {{ item.option }}
{% endif %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

调用模板模块的 tasks/main.yml 文件的内容:

- name: create server.conf
  template:
   src: file.conf.j2
   dest: 'mydir/server.conf'
   owner: root
   group: root
   mode: '0644'
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

The offending line appears …
Run Code Online (Sandbox Code Playgroud)

jinja2 ansible ansible-template

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

ansible shell 任务在没有正确消息的情况下出错

团队,

我正在尝试验证 mount 命令输出中是否存在 sdd。因此,当有任何时,我很好,但是当没有时,我的任务只是失败,而不仅仅是告诉我不存在任何坐骑。任何提示如何解决这个问题?我不希望我的任务失败,而是报告状态。

当状态代码为 0 am 时很好,但当状态代码为 1 am 时只是看到失败,而不是一条有用的消息,即 mounds sdd 不存在。

 "mount | grep sdd"
Run Code Online (Sandbox Code Playgroud)
      - name: "Verify LVP Mounts sdd exists on CPU Nodes for mount_device"
        shell: "mount | grep sdd"
        register: lvp_mount
        ignore_errors: yes
        failed_when: False
        delegate_to: "{{ item }}"
        with_items: "{{ groups['kube-cpu-node'] }}"
      - name: "Report status of mounts"
        fail:
          msg: |
            Mounts sdd not found
            Output of `mount | grep sdd`:
            {{ lvp_mount.stdout }}
            {{ lvp_mount.stderr }}
        when: lvp_mount | failed
Run Code Online (Sandbox Code Playgroud)

输出: …

ansible ansible-template ansible-2.x ansible-facts

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

如何从包含YAML的字符串中读取Ansible变量?

我有一个任务,该任务运行一个uri调用以获取包含YAML片段的JSON文件(从Rancher API获得)。我可以使用以下任务提取YAML片段

- name: generate_stack_call_body.yml read docker compose from catalog
  set_fact:
    docker_compose: '{{ template_detail|json_query(dc_query) }}'
Run Code Online (Sandbox Code Playgroud)

当我运行ansible调试策略时,表明我的docker_compose变量包含

(debug) p vars['docker_compose']
u"consul:\n  labels:\n    io.rancher.container.hostname_override: container_name\n    io.rancher.container.pull_image: always\n    io.rancher.container.hostname_override: container_name\n    io.rancher.scheduler.global: 'true'\n  stdin_open: true\n  image: registry.mycompany.com/my-project/consul-rancher:0.9.0\n  volumes:\n  - /data/consul:/consul/data\nload-balancer:\n  ports:\n  - 8500:8500\n  labels:\n    io.rancher.container.hostname_override: container_name\n    io.rancher.scheduler.global: 'true'\n  stdin_open: true\n  image: rancher/load-balancer-service\n  links:\n
  - consul:consul\n"
Run Code Online (Sandbox Code Playgroud)

在我看来,这是有效的YAML。

结果,我想应该可以将该值解释为有效的Ansible变量。

但是如何将其解释为变量?

以及以后如何将该变量放回字符串中?

yaml ansible ansible-template

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

如何忽略 j2 模板文件中的 jinja2 大括号 {{}}

我有一个 j2 文件,我想编辑并复制到我的远程服务器(作为我的 ansible play 的一部分)。该文件有几个用大括号表示的 3 个变量{{ }}。我怎样才能只定位命名的第二个变量{{ bar }}并忽略文件中的其他 2个变量,这样它们就可以单独存在并复制到我的远程服务器?例如,我的 test.j2 文件包含:

line 1 {{ foo }}
line 2 {{ bar }}
line 3 {{ foo2 }}
Run Code Online (Sandbox Code Playgroud)

{{ bar }}我可以在我的 ansible playbook 中明确处理变量吗?如果是这样,我将如何在我的 ansible playbook 中(在语法上)编写它?

variables jinja2 ansible ansible-template ansible-2.x

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

Ansible 嵌套变量正则表达式搜索

我们如何使用 Ansible 嵌套变量进行通配符搜索?

YAML

test:
  name:
    address:
         zipcode: 12345
Run Code Online (Sandbox Code Playgroud)

Ansible 模板变量

{{ test[name][addre*].zipcode }}
Run Code Online (Sandbox Code Playgroud)

jinja2 ansible ansible-template

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

在 Ansible 模板中加入键值对列表

我需要将以下 yaml 字典转换为逗号分隔的 key=value 对列表

nodes:
  node1: 192.168.56.11
  node2: 192.168.56.12
Run Code Online (Sandbox Code Playgroud)

所以它变成了

node1=192.168.56.11,node2=192.168.56.12
Run Code Online (Sandbox Code Playgroud)

在 Python 中,我会使用简单的列表理解来完成此操作,然后加入列表:

','.join([ k+'='+v for k,v in nodes.items()])
Run Code Online (Sandbox Code Playgroud)

不过,我不知道如何在 Ansible 模板中优雅地做到这一点。for当然,我可以用循环来做到这一点,但它会留下尾随逗号。迄今为止我最好的镜头:

{% for k,v in nodes.items() %}{{k}}={{v}}{% if not loop.last %},{% endif %}{% endfor %}
Run Code Online (Sandbox Code Playgroud)

我是否忽略了什么?

jinja2 ansible ansible-template ansible-2.x

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