标签: jinja2

使用 Jinja2 模板迭代嵌套列表/字典

我正在尝试通过使用 Ansible 生成 /etc/exports 文件来动态配置系统中的多个 NFS 服务器。我希望能够使用 jinja2 模板来做到这一点。这是 jinja2 模板,我无法根据我的导出列表找出它。

我在 nfs 角色中定义了以下变量:

site_nfs_servers: ['ansibletarget1', 'ansibletarget2']

exports:
  - server: "ansibletarget1"
    shares:
      - path: "/my/first/share/path"
        client: "*"
        options: "rw,sync"
      - path: "/my/second/share/path"
        client: "*"
        options: "rw,sync,root_squash"
  - server: "ansibletarget2"
    shares:
      - path: "/another/shared/path/different/server"
        client: "*"
        options: "ro,sync"
Run Code Online (Sandbox Code Playgroud)

然后我有以下 ansible play 来生成模板:

- name: Generate the exports file.
  template:
    src: exports.j2
    dest: /etc/exports
    owner: root
    group: root
    mode: '0750'
Run Code Online (Sandbox Code Playgroud)

我的模板目前如下所示:

{% for export in exports %}
{% if ansible_hostname in export.server …
Run Code Online (Sandbox Code Playgroud)

ansible ansible-playbook jinja2

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

Ansible:将带有键:值对的逗号分隔字符串转换为字典

我正在通过额外的变量启动 docker-compose 服务(apache solr)的安装手册。这些变量是在执行时设置的,因为该剧本应该是灵活的并且一台服务器上存在多种配置。

我的想法是,用户可以将 ansible ui (ansible 信号量)中的变量设置为字符串:

  • 变量名project_cores
  • 变量值(字符串)main_en:english,main_de:german

我想将这些核心作为字典进行迭代。我最后想要的是:

{
  {
    name: main_en,
    language: english
  },
  {
    name: main_de,
    language: german
  },
}
Run Code Online (Sandbox Code Playgroud)

第一步是将它们分开,(这已经有效):


- name: "debug: split cores"
  debug:
    msg: "{{ item }}"
  loop: "{{ project_cores.split(',') }}"
Run Code Online (Sandbox Code Playgroud)

然后我尝试了以下操作但没有成功,因为这不会添加子元素的键:


- name: "Extract solr cores configuration."
  set_fact:
    dict: "{{ dict|default({}) | combine ( { item.split(':')[0] : item.split(':')[1] } ) }}"
  with_items:
    - "{{ project_cores.split(',') }}"

Run Code Online (Sandbox Code Playgroud)

我测试了一些组合,但没有找到有关如何添加键的有效解决方案。

知道如何将该字符串转换为第一个示例中所述的真实目录吗?提前致谢!

ansible jinja2

4
推荐指数
1
解决办法
2309
查看次数

ansible/jinja2 拒绝具有特定属性的字典列表中的所有项目

我有一个这样的字典列表:

list_of_dicts:
  - name: Item1
  - name: Item2
    type: special
  - name: Item3
  - name: Item4
    type: small
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,并非所有项目都有属性type。上下文:如果没有type设置属性,则表示该项目是默认类型。

我想选择所有不属于类型的项目special

我试过这个:list_of_dicts | rejectattr('type', 'equalto', 'special')

不幸的是,这会失败并出现AnsibleUndefinedVariable: 'dict object' has no attribute 'type'错误,因为某些项目没有类型。

有什么好的方法可以解决这个问题呢?

ansible jinja2

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

如何在远程服务器中使用ansible将两个文件合并为单个文件

我需要合并两个文件,其中没有重复的条目。有什么方法可以通过 ansible 模块实现它吗?例如,我有两个文件 /etc/hosts1 和 /etc/hosts2。我需要一个 /etc/hosts 文件,其中包含 /etc/hosts1 和 /etc/hosts2 中存在的所有条目,并且没有重复的条目。我怎样才能做到这一点。举个例子将不胜感激

- name: Merge two files
  assemble:
    src: /etc/hosts1
    dest: /etc/hosts2
Run Code Online (Sandbox Code Playgroud)

上述汇编模块失败

python copy ansible ansible-playbook jinja2

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

标签 统计

ansible ×4

jinja2 ×4

ansible-playbook ×2

copy ×1

python ×1