如何在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
相关产品推荐
相关产品推荐

