Ansible 有没有一种方法可以同时拥有加密和非加密的主机变量?

Ansible 有没有一种方法可以同时拥有加密和非加密的主机变量?,ansible,Ansible,如果我使用ansible vault加密host\u vars/*文件,我似乎没有机会拥有非加密的主机vars,而不是驻留在清单文件中的主机vars。我遗漏了什么吗?只是不加密host\u vars/*,而是只加密需要加密的变量文件。 本文介绍了一种非常好的方法: 实际上,您拥有的是嵌套/链接的变量 这是纯文本变量文件: # var_file db_password: {{ vaulted_db_passord }} 这是要加密的变量文件: # vault_file vaulted_db_pa

如果我使用
ansible vault
加密
host\u vars/*
文件,我似乎没有机会拥有非加密的主机vars,而不是驻留在清单文件中的主机vars。我遗漏了什么吗?

只是不加密
host\u vars/*
,而是只加密需要加密的变量文件。 本文介绍了一种非常好的方法:

实际上,您拥有的是嵌套/链接的变量

这是纯文本变量文件:

# var_file
db_password: {{ vaulted_db_passord }}
这是要加密的变量文件:

# vault_file
vaulted_db_passord: a_super_secret
在你的剧本中,你提到了
db\u密码
,它将解析为加密密码。 使用这种方法,变量名仍然是可读的纯文本,但是变量值是安全加密的。

主机变量
-和
组变量
-文件实际上可能是目录。也就是说,可以创建
host\u vars/example.com/vault
host\u vars/example.com/vars
,而不是创建
host\u vars/example.com/vars
。将读取目录中的所有文件。这就解决了问题

此外,is将在
vault
文件中存储前缀为
vault
的敏感变量,并在
vars
文件中将其重新指定给非前缀变量。像这样:

vault

vault_mysql_password: '...'
vars

mysql_password: '{{ vault_mysql_password }}'

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

您可以使用此ansible功能:


Ansible将自动将vault.yml读取为加密的yaml文件

这里是一个完整的例子,所有的链接都用铅笔画了出来。这是我在做这件事时非常需要的东西。语境,语境,语境

Ansible配置 如果该文件与您的playbook位于同一目录中,Ansible将自动加载该文件

---
# File: /path/to/playbook/ansible.cfg
[defaults]
inventory   = /path/to/playbook/hosts.ini
---
# 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 }}"
主机文件 此文件定义主机组。在本例中,只有
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-Southwest-1
    地区
  • 标记有
    名称:ec2 go
剧本

---
# File: /path/to/playbook/ansible.cfg
[defaults]
inventory   = /path/to/playbook/hosts.ini
---
# 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魔术,它源自以下目录结构 你猜怎么着?在我的剧本中,我没有使用
vars_文件
访问任何这些文件,这就是魔法!当我的playbook寻址主机组
[local]
时,ansible会自动访问
/path/to/playbook/group\u vars/local
目录,并加载
vars
和加密的
vault
文件,如果我们引用了加密的var(我们现在就开始)

瓦尔斯 请注意,我们通过使用
vault\uu
预先添加裸变量来自动访问加密的vault文件。无需采取进一步行动将这些联系起来。保持var名称相同是惯用的(最佳实践),即
myVar
-->
vault\u 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_保险库;1.1;AES256 36613032373533636330363539653565343463333135633564303036653732616435663462306637 63633832373864616133386263626534653436366264610A62353739376466363666383362 65353235653166396565333231336332666135663239386162633862356534393066383265333466 646537396232662350A6133393343234376564373662316234653364386337323130663039313239 35353031393437333463346132643632323865623963373862303539363162326161396464353031 39336334346438396161386365653161653231396430646433613132376233666431663863393066 35343433623563653164353730386339316366656666306265353931393337363937376632396332 32333164393534366337663333626566366134373766373137336366366230613763333939633165 35383432666233656363316630643031366431656261386531326162343035393739653366353462 39303566376161303730333266393639666233666362313935

运行剧本: 您将需要cmdline参数
-ask vault pass
,因为该变量是从vault引用的

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

首先,链接中的信息只是间接地描述了这一特性,
group_vars
文件可能是包含加密和非加密文件的目录。重点在于能够
grep
所有变量。描述了该特征。第二,问题不是让变量名不加密。第三,你的建议基本上要早得多。问题不是让变量名不加密。我不知道,从你的回答来看,这一点不是特别清楚。