有没有办法同时拥有加密和非加密的主机变量?

时间:2015-04-14 08:53:06

标签: ansible

如果我使用host_vars/*加密ansible-vault个文件,我似乎没有机会拥有非加密的主机变量,而不是那些驻留在库存文件中的变量。我错过了什么吗?

4 个答案:

答案 0 :(得分:20)

As it turns outhost_vars - 和group_vars - 文件实际上可能是目录。也就是说,可以创建host_vars/example.comhost_vars/example.com/vault,而不是创建host_vars/example.com/vars。读取驻留在目录中的所有文件。这解决了它。

此外,the best practice用于在vault_文件中存储前缀为vault的敏感变量,并将它们重新分配给vars文件中的非前缀变量。像这样:

vault

vault_mysql_password: '...'

vars

mysql_password: '{{ vault_mysql_password }}'

这样,您就可以使用grep或任何类似的工具找到加密变量。

答案 1 :(得分:4)

只是不加密host_vars/*,而只加密您想要加密的变量文件。 本文介绍了一种非常好的方法:https://www.reinteractive.net/posts/167-ansible-real-life-good-practices

基本上你拥有的是嵌套/链式变量。

这是您的纯文本变量文件:

# var_file
db_password: {{ vaulted_db_passord }}

这是您要加密的变量文件:

# vault_file
vaulted_db_passord: a_super_secret

在您的游戏手册中,您引用db_password,它将解析为加密密码。 使用此方法,您的变量名称仍然是可读的纯文本,但变量是安全加密的。

答案 2 :(得分:3)

这是一个完整的例子,其中包含了所有链接。在我坚持这一点时,我非常需要的东西。上下文,上下文,上下文。

Ansible config

如果Ansible与您调用的playbook位于同一目录中,它将自动加载该文件。

---
# 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

Playbook通过以下属性收集有关我的任何实例的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访问任何这些文件,这就是魔法!当我的Playbook正在寻址主机组[local]时,如果我们引用加密的var(ans&#),ansible会自动访问/path/to/playbook/group_vars/local目录并加载vars和加密的vault文件39;现在就到了。)

瓦尔

请注意,我们通过在vault_之前添加裸变量来自动访问加密的保管库文件。无需进一步操作即可将这些链接起来。保持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

运行剧本:

由于从Vault中引用的ONE变量,您需要cmdline参数-ask-vault-pass

ansible-playbook gather.yml --ask-vault-pass

答案 3 :(得分:1)

您可以使用此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文件。