AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1058550
Accepted
Lethargos
Lethargos
Asked: 2021-03-28 10:38:51 +0800 CST2021-03-28 10:38:51 +0800 CST 2021-03-28 10:38:51 +0800 CST

使用 ansible 模板文件以获取不同主机的不同变量部分(通过其索引)

  • 772

我正在尝试将证书分发到其相应的主机(我将仅给出私钥任务的示例):

- name: create certificate private key
  community.crypto.openssl_privatekey:
    path: "/root/client/{{ item }}.key"
    type: Ed25519
    backup: yes
    return_content: yes
  register: privatekey
  loop: "{{ ansible_play_hosts_all }}"
  when: "'prometheus1' in inventory_hostname"

我可以像这样为其他主机调用变量:

{{ hostvars['prometheus1']['privatekey']['results'][0]['privatekey'] }}

索引指向某个键,因此 0 将是第一个主机 ( prometheus1),1 将是第二个主机,依此类推。

我想模板化是要走的路,但我根本不知道如何编写模板。我认为ansible_play_hosts_all是解决方案的关键,因为它的索引对应于私钥的索引,例如: ansible_play_hosts_all[2]-->hostvars['prometheus1']['privatekey']['results'][2]['privatekey']

但逻辑是:

for i in index of ansible_play_hosts_all
add the  hostvars['prometheus1']['privatekey']['results'][i]['privatekey']
if ansible_play_hosts_all[i] in inventory_hostname

我想有这样的效果:) 非常感谢任何帮助。


更新

也许更准确一些:

{% for i in ansible_play_hosts_all|length) %}
{{ hostvars['prometheus1']['privatekey']['results'][i]['privatekey'] }}
{% endfor %}

并在其中添加条件:

{% if ansible_play_hosts_all[i] in inventory_hostname %}
ansible template jinja2
  • 3 3 个回答
  • 401 Views

3 个回答

  • Voted
  1. Best Answer
    flowerysong
    2021-03-28T16:10:57+08:002021-03-28T16:10:57+08:00

    使用委托来创建密钥会更简单,prometheus1同时将已注册的变量与正确的主机关联。然后你可以privatekey.privatekey在你的模板中使用。

    - name: create certificate private key
      community.crypto.openssl_privatekey:
        path: /root/client/{{ inventory_hostname }}.key
        type: Ed25519
        backup: yes
        return_content: yes
      register: privatekey
      delegate_to: prometheus1
    

    如果你真的想坚持你当前的结构,你可以通过检查item结果中的值来找到当前主机对应的列表元素,其中包含item来自该循环的迭代。

    {{ (hostvars['prometheus1']['privatekey']['results'] | selectattr('item', '==', inventory_hostname) | list | first).privatekey }}
    
    • 1
  2. Vladimir Botka
    2021-03-30T01:54:45+08:002021-03-30T01:54:45+08:00

    使用数据创建字典,例如给定库存

    shell> cat hosts
    prometheus1 ansible_host=localhost
    test_11     ansible_host=10.1.0.61 ansible_user=admin 
    test_12     ansible_host=10.1.0.62 ansible_user=admin
    test_13     ansible_host=10.1.0.63 ansible_user=admin
    

    剧本

    - hosts: all
      gather_facts: false
      tasks:
        - community.crypto.openssl_privatekey:
            path: "{{ playbook_dir }}/client/{{ item }}.key"
            type: Ed25519
            backup: yes
            return_content: yes
          register: privatekey
          loop: "{{ ansible_play_hosts_all|difference(['prometheus1']) }}"
          delegate_to: prometheus1
          run_once: true
    
        - set_fact:
            host_priv: "{{ privatekey.results|
                           json_query('[].{host: item,
                                           priv: privatekey}')|
                           items2dict(key_name='host', value_name='priv') }}"
          run_once: true
    

    为除prometheus1之外的每个主机生成私钥,将密钥存储在文件中,并根据注册的数据创建主机及其密钥的字典

    shell> tree client/
    client/
    ├── test_11.key
    ├── test_12.key
    └── test_13.key
    
    ok: [prometheus1] => 
      host_priv:
        test_11: |-
          -----BEGIN PRIVATE KEY-----
          MC4CAQAwBQYDK2VwBCIEIM7/BtpiM1EZxrrwtuE2VdSdr++3J/yxm/BnabnMqL3e
          -----END PRIVATE KEY-----
        test_12: |-
          -----BEGIN PRIVATE KEY-----
          MC4CAQAwBQYDK2VwBCIEIPr8VV2RDOggNxo6vpBiXjSTzclJHFHaTVSxlFFVKoU1
          -----END PRIVATE KEY-----
        test_13: |-
          -----BEGIN PRIVATE KEY-----
          MC4CAQAwBQYDK2VwBCIEIJjp2knmccffeEGvTNaP2f+ijXkeLmu89cGgkqFi771/
          -----END PRIVATE KEY-----
    

    然后,您可以继续播放并将密钥复制到主机,例如

        - name: copy private key
          copy:
            content: "{{ host_priv[inventory_hostname] }}"
            dest: /tmp/private.key
          when: inventory_hostname != 'prometheus1'
          become: true
    

    根据您的需求调整路径并设置所有权和权限。

    • 1
  3. Lethargos
    2021-03-28T11:40:14+08:002021-03-28T11:40:14+08:00

    我终于能够想出解决方案:

    {%  for i in range(ansible_play_hosts_all|length) %}
    {% if ansible_play_hosts_all[i] in inventory_hostname -%}
    {{ hostvars['prometheus1']['privatekey']['results'][i]['privatekey'] }}
    {%- endif %}
    {% endfor %}
    

    这按预期工作。我正在遍历 ansible_play_hosts_all 的长度(以了解运行角色的主机数量),并在循环内添加索引需要与清单中的主机名相对应的条件。

    if 条件中的-%and%-去除空格的输出。没有它们,每个文件都会添加一个空行(在这种情况下似乎不会打扰 openssl,当然没有它会更好)

    模板任务本身如下:

    - name: copy certificate through templating
      template:
        src: certs.j2
        dest: "/root/{{ inventory_hostname }}.key"
    
    • 0

相关问题

  • 重复的 Ansible 任务

  • 无法形成站点中的文件的链接,该链接可用于使用 ansible 在远程服务器中启用的目录站点?

  • 如何执行 ansible 的特定角色?

  • Ansible 和 rbash

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve