有没有办法同时拥有加密和非加密的主机变量?
Is there a way to have both encrypted and nonencrypted host vars?
如果我用 ansible-vault
加密 host_vars/*
个文件,我似乎没有机会拥有非加密的主机变量,而不是那些驻留在清单文件中的变量。我错过了什么吗?
干脆不加密host_vars/*
,而是只加密您要加密的变量文件。
这篇文章描述了一个非常好的方法:https://www.reinteractive.net/posts/167-ansible-real-life-good-practices
基本上你拥有的是 nested/chained 个变量。
这是您的纯文本变量文件:
# var_file
db_password: {{ vaulted_db_passord }}
这是您要加密的变量文件:
# vault_file
vaulted_db_passord: a_super_secret
在您的剧本中,您引用了 db_password
,它将解析为加密密码。
使用这种方法,您的变量 names 仍然是可读的纯文本,但是变量 values 是安全加密的。
As it turns out、host_vars
- 和 group_vars
- 文件实际上可能是目录。也就是说,可以创建 host_vars/example.com/vault
和 host_vars/example.com/vars
,而不是创建 host_vars/example.com
。读取目录中的所有文件。这解决了它。
另外,the best practice是将vault_
前缀的敏感变量存放在vault
文件中,在vars
文件中重新赋值给无前缀的变量。像这样:
vault
:
vault_mysql_password: '...'
vars
:
mysql_password: '{{ vault_mysql_password }}'
这样,您就可以使用 grep
或任何类似工具找到加密变量。
您可以使用这个 ansible 功能:http://docs.ansible.com/ansible/playbooks_best_practices.html#best-practices-for-variables-and-vaults
group_vars/
san_diego/
vars.yml # unecrypted yaml file
vault.yml # encrypted yaml file
Ansible 会自动读取 vault.yml 作为加密的 yaml 文件。
这是一个完整的示例,所有 link 年龄段的人都用铅笔写了进去。这是我在解决这个问题时非常需要的东西。上下文,上下文,上下文。
Ansible 配置
如果 Ansible 与您调用的 playbook 位于同一目录中,Ansible 将自动加载该文件。
---
# File: /path/to/playbook/ansible.cfg
[defaults]
inventory = /path/to/playbook/hosts.ini
主机文件
这个文件定义了主机组。在此示例中,只有 local
组是重要的。
---
[local]
localhost ansible_connection=local ansible_python_interpreter=/usr/bin/python2
[ec2]
xx.xx.xx.xx ansible_ssh_private_key_file=/path/to/ec2/keys/key.pem
用于收集关于我的具有以下属性的任何实例的 ec2 事实的剧本:
- 在
ap-southeast-1
地区
- 标记为
Name: ec2-go
剧本。
---
# File: gather.yml
- name: Gather remote EC2 facts
hosts: local
connection: local
gather_facts: False
# Necessary variables for fact gathering
vars:
params:
region: ap-southeast-1
tasks:
- name: Gather EC2 facts.
ec2_remote_facts:
aws_secret_key: "{{ secret_access_key }}"
aws_access_key: "{{ access_key_id }}"
region: "{{ params['region'] }}"
filters:
"tag:Name": ec2-go
register: ec2_facts
- name: Print the id of the first instance tagged with "Name: ec2-go"
debug:
msg: "{{ ec2_facts['instances'][0]['id'] }}"
- name: Print ALL of the ec2_facts
debug:
msg: "{{ ec2_facts }}"
现在对于由以下目录结构产生的 Ansible Vault MAGIC
/path/to/playbook
/group_vars
/local
vars
vault
你猜怎么着?我毫不费力地在我的剧本中使用 vars_files
访问这些文件中的任何一个,这就是 MAGIC!当我的剧本正在寻址主机组 [local]
时,如果我们引用加密的 var(我们'我现在就开始。
变量
请注意,我们通过在裸变量前添加 vault_
来自动访问加密的保险库文件。 link 这些不需要进一步的操作。保持 var 名称相同是惯用的(最佳实践),即 myVar
--> vault_myVar
。所有这些跳舞的好处是它使变量名可见(想想 grep
),而不是隐藏在加密文件中。
---
# File: /path/to/playbook/group_vars/local/vars
access_key_id: AKIAS_YOUR_MUM_MQTFHA
secret_access_key: "{{ vault_secret_access_key }}"
保管库(未加密)
我们用 ansible-vault encrypt vault
和密码加密这个文件。我们用 ansible-vault decrypt vault
或更安全地解密,只需编辑而不用 ansible-vault edit vault
解密:
---
# File: /path/to/playbook/group_vars/local/vault
vault_secret_access_key: youShOuLDnOTtRUstEVEryThInGYoUrEAdOniNtErnET
保管库(加密)
$ANSIBLE_VAULT;1.1;AES256
36613032373533636330363539653565343463333135633564303036653732616435663462306637
6363383237386461613338626362653465343636366264610a623537393937646635366638393362
65353235653166396565333231336332666135663239386162633862356534393066383265333466
6465373962326662350a613339343234376564373662316234653364386337323130663039313239
35353031393437333463346132643632323865623963373862303539363162326161396464353031
39336334346438396161386365653161653231396430646433613132376233666431663863393066
35343433623563653164353730386339316366656666306265353931393337363937376632396332
32333164393534366337663333626566366134373766373137336366366230613763333939633165
35383432666233656363316630643031366431656261386531326162343035393739653366353462
3930356637616130373033333266393639666233666362313935
运行 剧本:
您需要 cmdline 参数 -ask-vault-pass
因为从保管库引用的那个 ONE 变量。
ansible-playbook gather.yml --ask-vault-pass
如果我用 ansible-vault
加密 host_vars/*
个文件,我似乎没有机会拥有非加密的主机变量,而不是那些驻留在清单文件中的变量。我错过了什么吗?
干脆不加密host_vars/*
,而是只加密您要加密的变量文件。
这篇文章描述了一个非常好的方法:https://www.reinteractive.net/posts/167-ansible-real-life-good-practices
基本上你拥有的是 nested/chained 个变量。
这是您的纯文本变量文件:
# var_file
db_password: {{ vaulted_db_passord }}
这是您要加密的变量文件:
# vault_file
vaulted_db_passord: a_super_secret
在您的剧本中,您引用了 db_password
,它将解析为加密密码。
使用这种方法,您的变量 names 仍然是可读的纯文本,但是变量 values 是安全加密的。
As it turns out、host_vars
- 和 group_vars
- 文件实际上可能是目录。也就是说,可以创建 host_vars/example.com/vault
和 host_vars/example.com/vars
,而不是创建 host_vars/example.com
。读取目录中的所有文件。这解决了它。
另外,the best practice是将vault_
前缀的敏感变量存放在vault
文件中,在vars
文件中重新赋值给无前缀的变量。像这样:
vault
:
vault_mysql_password: '...'
vars
:
mysql_password: '{{ vault_mysql_password }}'
这样,您就可以使用 grep
或任何类似工具找到加密变量。
您可以使用这个 ansible 功能:http://docs.ansible.com/ansible/playbooks_best_practices.html#best-practices-for-variables-and-vaults
group_vars/
san_diego/
vars.yml # unecrypted yaml file
vault.yml # encrypted yaml file
Ansible 会自动读取 vault.yml 作为加密的 yaml 文件。
这是一个完整的示例,所有 link 年龄段的人都用铅笔写了进去。这是我在解决这个问题时非常需要的东西。上下文,上下文,上下文。
Ansible 配置
如果 Ansible 与您调用的 playbook 位于同一目录中,Ansible 将自动加载该文件。
---
# File: /path/to/playbook/ansible.cfg
[defaults]
inventory = /path/to/playbook/hosts.ini
主机文件
这个文件定义了主机组。在此示例中,只有 local
组是重要的。
---
[local]
localhost ansible_connection=local ansible_python_interpreter=/usr/bin/python2
[ec2]
xx.xx.xx.xx ansible_ssh_private_key_file=/path/to/ec2/keys/key.pem
用于收集关于我的具有以下属性的任何实例的 ec2 事实的剧本:
- 在
ap-southeast-1
地区 - 标记为
Name: ec2-go
剧本。
---
# File: gather.yml
- name: Gather remote EC2 facts
hosts: local
connection: local
gather_facts: False
# Necessary variables for fact gathering
vars:
params:
region: ap-southeast-1
tasks:
- name: Gather EC2 facts.
ec2_remote_facts:
aws_secret_key: "{{ secret_access_key }}"
aws_access_key: "{{ access_key_id }}"
region: "{{ params['region'] }}"
filters:
"tag:Name": ec2-go
register: ec2_facts
- name: Print the id of the first instance tagged with "Name: ec2-go"
debug:
msg: "{{ ec2_facts['instances'][0]['id'] }}"
- name: Print ALL of the ec2_facts
debug:
msg: "{{ ec2_facts }}"
现在对于由以下目录结构产生的 Ansible Vault MAGIC
/path/to/playbook
/group_vars
/local
vars
vault
你猜怎么着?我毫不费力地在我的剧本中使用 vars_files
访问这些文件中的任何一个,这就是 MAGIC!当我的剧本正在寻址主机组 [local]
时,如果我们引用加密的 var(我们'我现在就开始。
变量
请注意,我们通过在裸变量前添加 vault_
来自动访问加密的保险库文件。 link 这些不需要进一步的操作。保持 var 名称相同是惯用的(最佳实践),即 myVar
--> vault_myVar
。所有这些跳舞的好处是它使变量名可见(想想 grep
),而不是隐藏在加密文件中。
---
# File: /path/to/playbook/group_vars/local/vars
access_key_id: AKIAS_YOUR_MUM_MQTFHA
secret_access_key: "{{ vault_secret_access_key }}"
保管库(未加密)
我们用 ansible-vault encrypt vault
和密码加密这个文件。我们用 ansible-vault decrypt vault
或更安全地解密,只需编辑而不用 ansible-vault edit vault
解密:
---
# File: /path/to/playbook/group_vars/local/vault
vault_secret_access_key: youShOuLDnOTtRUstEVEryThInGYoUrEAdOniNtErnET
保管库(加密)
$ANSIBLE_VAULT;1.1;AES256 36613032373533636330363539653565343463333135633564303036653732616435663462306637 6363383237386461613338626362653465343636366264610a623537393937646635366638393362 65353235653166396565333231336332666135663239386162633862356534393066383265333466 6465373962326662350a613339343234376564373662316234653364386337323130663039313239 35353031393437333463346132643632323865623963373862303539363162326161396464353031 39336334346438396161386365653161653231396430646433613132376233666431663863393066 35343433623563653164353730386339316366656666306265353931393337363937376632396332 32333164393534366337663333626566366134373766373137336366366230613763333939633165 35383432666233656363316630643031366431656261386531326162343035393739653366353462 3930356637616130373033333266393639666233666362313935
运行 剧本:
您需要 cmdline 参数 -ask-vault-pass
因为从保管库引用的那个 ONE 变量。
ansible-playbook gather.yml --ask-vault-pass