You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ansible Playbook中使用加密的YAML清单文件?

Ansible读取加密YAML格式密钥文件的问题

我最初为清单和密钥都使用INI格式,后来因需要使用循环将清单文件切换为YAML格式。现在需要通过循环设置密钥,因此想将密钥文件也从INI转为YAML,但ansible-playbook无法读取加密的YAML文件,以下是详细场景和问题:

可行的单文件示例(基础场景)

Playbook文件 single_file_test.yaml

---
- hosts: encrypted_hosts_test
  tasks:
  - name: create file
    ansible.builtin.lineinfile:
      path: "/home/vagrant/{{ file_name }}"
      line: "{{ single_secret }}"
      create: yes

清单文件 hosts.yaml

all:
  children:
    encrypted_hosts_test:
      hosts:
        machine1:
          file_name: "machine1_file"
        machine2:
          file_name: "machine2_file"

加密密钥文件 hosts.vault(INI格式)

[encrypted_hosts_test]
machine1 single_secret="123"
machine2 single_secret="234"

执行命令

ansible-playbook --ask-vault-pass -i hosts.yaml -i hosts.vault single_file_test.yaml

此场景下,加密的INI格式密钥文件可以被正常解析执行。

需要实现的多文件循环场景

Playbook文件 multi_file_test.yaml

---
- hosts: encrypted_hosts_test
  tasks:
  - name: create multiple file tags
    ansible.builtin.lineinfile:
      path: "/home/vagrant/{{ item.key }}"
      line: "{{ item.value.tag }}"
      create: yes
    loop: "{{ file_tags | dict2items }}"
  - name: create multiple file secrets
    ansible.builtin.lineinfile:
      path: "/home/vagrant/{{ item.key }}"
      line: "{{ item.value.secret }}"
      create: yes
    loop: "{{ file_secrets | dict2items }}"

清单文件 hosts.yaml

all:
  children:
    encrypted_hosts_test:
      hosts:
        machine1:
          file_tags:
            fileA:
              tag: "machine1_fileA_tag"
            fileB:
              tag: "machine1_fileB_tag"
        machine2:
          file_tags:
            fileC:
              tag: "machine1_fileC_tag"
            fileD:
              tag: "machine1_fileD_tag"

明文YAML格式密钥文件 cleartext_secret.yaml

all:
  children:
    encrypted_hosts_test:
      hosts:
        machine1:
          file_secrets:
            fileA:
              secret: "234"
            fileB:
              secret: "345"
        machine2:
          file_secrets:
            fileA:
              secret: "567"
            fileB:
              secret: "789"

执行命令(明文正常运行)

ansible-playbook -i hosts.yaml -i cleartext_secret.yaml multi_file_test.yaml

明文状态下的YAML密钥文件可以正常解析,循环逻辑正常执行。

加密YAML密钥文件后的报错问题

将cleartext_secret.yaml加密为hosts.yaml.vault后,执行以下命令:

ansible-playbook --ask-vault-pass -i hosts.yaml -i hosts.yaml.vault multi_file_test.yaml 

出现如下错误:

[WARNING]:  * Failed to parse /home/mat/Repository/ansible/pi/test/hosts.yaml.vault with ini plugin: Invalid host pattern 'all:' supplied, ending in ':' is not allowed, this
character is reserved to provide a port.
[WARNING]: Unable to parse /home/mat/Repository/ansible/pi/test/hosts.yaml.vault as an inventory source

问题核心:Ansible在文件未加密时能自动识别INI/YAML格式,但加密后默认使用INI插件解析,无法识别YAML结构。

解决方法

方法一:执行命令中指定Inventory格式

在调用时通过?type=yaml参数明确告知Ansible该加密文件为YAML格式,执行命令修改为:

ansible-playbook --ask-vault-pass -i hosts.yaml -i 'hosts.yaml.vault?type=yaml' multi_file_test.yaml

方法二:修改加密文件后缀名

将加密后的文件重命名为hosts.vault.yaml(让Ansible优先识别.yaml后缀,使用YAML插件解析),执行命令保持为:

ansible-playbook --ask-vault-pass -i hosts.yaml -i hosts.vault.yaml multi_file_test.yaml

两种方法均可让Ansible正确解密并以YAML格式解析密钥文件,支持循环使用嵌套的file_secrets变量。

内容的提问来源于stack exchange,提问作者Matthew Exon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:33:20