ansible基础-加密
一 简介
注:本文demo使用ansible2.7稳定版
众所周知,ansible是很火的一个自动化部署工具,在ansible控制节点内,存放着当前环境服务的所有服务的配置信息,其中自然也包括一些敏感的信息,例如明文密码、IP地址等等。
从安全角度来讲,这些敏感数据的文件不应该以明文的形式存在。此时就用到了ansible加密的特性。
ansible通过命令行「ansible-vault」给你目标文件/字符串进行加密。在执行playbook时,通过指定相应参数来给目标文件解密,从而实现ansible vault的功能。
ansible可以加密任何部署相关的文件数据,例如:
- 主机/组变量等所有的变量文件
 - tasks、hanlders等所有的playbook文件
 - 命令行导入的文件(eg : -e @file.yaml ,-e @file.json)
 - copy,template的模块里src参数所使用的文件,甚至是二进制文件。
 - playbook里用到的某个字符串参数也可以加密(Ansible>=2.3)
 
本节主要介绍下ansible数据文件/字符串的加解密及加密文件的使用方法等知识点。
二 给文件加密
创建加密文件
ansible-vault create foo.yml
执行该命令后,交互式输入两次相同的密码,则创建加密文件成功。
给现有文件加密
ansible-vault encrypt foo.yml bar.yml baz.yml
如示例所示,该命令可以为多个文件同时加密,同样需要输入两次相同的密码,则加密成功。
案例分析
很多情况下,我们需要给主机(组)部分变量文件进行加密,而不是全加密。这里介绍下加密和非加密需要同时存在时推荐的用法。以创建组变量为例:
定义了一个「nodes」主机组
➜ inventory cat hosts.yaml
---
# inventory/hosts
nodes:
hosts:
node1:
node2:
node3:
组变量文件我们这样创建,目录结构如下:
➜ inventory tree group_vars
group_vars
└── nodes
├── vars.yaml
└── vault.yaml
文件「inventory/group_vars/nodes/vault.yaml」内容如下:
---
vault_db_name: test
vault_db_host: 127.0.0.1
上面示例中,我们为「nodes」主机组创建了一个「group_vars/nodes」目录用于存放该主机组的变量文件,其中「vars.yaml」和「vault.yaml」文件分别存放不加密和加密变量,通过这种拆分变量的方法,实现了加密和非加密同时存在的功能。
另外,为了便于识别,「vault.yaml」文件里的所有key值建议使用「vault_」开头,这样再playbook调用这些变量时,可以有很高的辨识度。
三 编辑加密文件
对加密过的文件进行编辑也是我们常遇到的,命令为:
ansible-vault edit foo.yml
这个命令会将该文件解密,并放到一个临时文件,编辑完后再保存到原文件。
四 查看加密文件
有时我们不是想编辑文件,而是简单查看下文件内容,命令为:
ansible-vault view foo.yml bar.yml baz.yml
从示例中我们可以看出,一行命令可以查看多个加密文件。
五 更改密码
给加密文件更改密码,命令为:
ansible-vault rekey foo.yml bar.yml baz.yml
先交互式输入旧的密码,然后再交互式输入两次新密码,即更改密码成功。
六 取消加密
取消加密的命令为:
ansible-vault decrypt foo.yml bar.yml baz.yml
交互式输入密码,即取消加密成功。
七 encypt_string创建加密变量
Vault ID和多密码
ansible2.4版本以后,新增了Vault ID和多密码的特性。Vault ID可以理解为为一个密码设置一个标签,用于管理员识别使用的是哪个密码,例如dev,prod,cloud等等;多密码指执行一次playbook时可以指定多个密码文件。
注:vault_id不会影响加密文件的解密,只是为了便于管理员识别是哪个密码。
encypt_string创建加密变量
在plabook文件中,我们也可以为某个字符串加密,从而达到加密变量嵌套在未加密YAML文件内的效果。
「ansible-vault encrypt_string」命令用于给某个字符串加密。
不设置vault_id,示例如下:
➜ lab-ansible ansible-vault encrypt_string --vault-id playbooks/test_vault.yaml 'maurice' --name 'the_name'
the_name: !vault |
$ANSIBLE_VAULT;1.1;AES256
...
...
设置vault_id为「dev」(给密码打标签)(加密参数也会有「dev」的标识):
➜ lab-ansible ansible-vault encrypt_string --vault-id dev@playbooks/test_vault.yaml 'maurice' --name 'the_name'
the_name: !vault |
$ANSIBLE_VAULT;1.2;AES256;dev
...
...
从stdin读取密码:
➜ lab-ansible echo -n 'maurice' | ansible-vault encrypt_string --vault-id dev@playbooks/test_vault.yaml --stdin-name 'the_name'
Reading plaintext input from stdin. (ctrl-d to end input)
the_name: !vault |
$ANSIBLE_VAULT;1.2;AES256;dev
...
...
交互式设置密码,设置完密码后按Ctrl+d:
➜ lab-ansible ansible-vault encrypt_string --vault-id dev@playbooks/test_vault.yaml --stdin-name 'the_name'
Reading plaintext input from stdin. (ctrl-d to end input)
maurice
the_name: !vault |
$ANSIBLE_VAULT;1.2;AES256;dev
...
...
八 使用加密文件
上面我们主要介绍了密码文件/变量的创建方式,接下来介绍下如何使用。
ansible执行playbook时,可以通过交互式或指定密码文件的方式来解密文件。
交互式
执行playbook时在终端以交互式的形式输入密码,示例:
ansible版本<=2.4,该方式只支持一个密码,不能指定vault_id。
ansible-playbook --ask-vault-pass site.yml
ansible2.4版本后,对应命令行如下,该方式只支持一个密码,能指定vault_id:
ansible-playbook --vault-id dev@prompt playbooks/test_vault.yaml
指定密码文件
另外一种使用方式,是将密码放在某个文件内,执行playbook时,通过指定该密码文件进行解密。
ansible版本<=2.4,可以使用「--vault-password」参数:
ansible-playbook --vault-password-file dev-password site.yml
ansible2.4版本以后,又增加了「--vault-id」的参数,用来指定密码文件:
ansible-playbook --vault-id /path/to/my/vault-password-file site.yml
从可执行脚本获取密码:
ansible-playbook --vault-id my-vault-password.py
指定密码文件同时指定vault_id:
ansible-playbook --vault-id dev@prompt site.yml
指定多vault_id+多密码文件:
ansible-playbook --vault-id dev@dev-password --vault-id prod@prompt site.yml
其他知识点
- 在仅使用多密码文件的情况下,默认的,ansible会按照命令行的排列顺序,逐个尝试。直到成功解密或失败。
 - 在使用vault_id+多密码的情况下,ansible会优先匹配与vault_id相同的加密变量(这个标识上面加密变量有提到),如果不能解密再匹配其他vault_id变量文件。
 - 除了命令行,密码文件的默认路径也可以通过ansible.cfg的「vault_password_file」或环境变量「ANSIBLE_VAULT_PASSWORD_FILE」获取。
 
九 本节应该掌握的技能
- 掌握变量文件创建、查看、编辑、更改、取消加密等方法
 - 掌握字符串加密的方法
 - 掌握含加密文件时playbook的执行方法
 
十 参考链接
- https://docs.ansible.com/ansible/latest/user_guide/vault.html
 
欢迎大家关注我的公众号:

ansible基础-加密的更多相关文章
- ansible基础-理解篇
		
1. 介绍 要说现在的部署工具,ansible可以说家喻户晓了. ansible是一个开源软件,用于软件供应.配置管理.应用部署.ansible可以通过SSH.remote PowerShell.其他 ...
 - 003.Ansible基础使用
		
一 Ansible命令用法 Ansible命令行执行方式有:Ad-Hoc.Ansible-playbook两种,Web方式其官方提供付费产品Tower.Ad-Hoc主要用于临时命令的执行,Ansibl ...
 - Ansible基础概述
		
一.Ansible简介 Ansible基于Python语言实现,由paramiko和PyYAML两个关键模块构建.Ansible的编排引擎可以出色地完成配置管理,流程控制,资源部署等多方面工作.Ans ...
 - 自动化运维工具-Ansible基础
		
目录 自动化运维工具-Ansible基础 什么是Ansible 同类型软件对比 Ansible的功能及优点 Ansible的架构 Ansible的执行流程 安装Ansible ansible配置文件 ...
 - Ansible基础使用
		
原文转自:https://www.cnblogs.com/itzgr/p/10233932.html作者:木二 目录 一 Ansible命令用法 1.1 免密钥 1.2 Ad-Hoc基础命令 1.3 ...
 - ansible基础-安装与配置
		
一 安装 1.1 ansible架构 ansible是一个非常简单的自动化部署项目,由python编写并且开源.用于提供自动化云配置.配置文件管理.应用部署.服务编排和很多其他的IT自动化需求. an ...
 - ansible基础-优化
		
简介 当管理集群达到一定规模时,ansible达到性能瓶颈是难以避免的,此时我们可以通过一定手段提高ansible的执行效率和性能. 笔者虽未管理过超大规模服务器,但也通过查找资料和咨询大神了解了一些 ...
 - ansible基础-Jinja2模版 | 过滤器
		
Jinja2模版介绍 注:本文demo使用ansible2.7稳定版 在ansible基础-变量的「8.2 模版使用变量」章节中关于模版与变量也有所提及,有兴趣的同学可以去回顾一下. ansible通 ...
 - ansible基础-roles
		
一 简介 注:本文demo使用ansible2.7稳定版 在我看来,role是task文件.变量文件.handlers文件的集合体,这个集合体的显著特点是:可移植性和可重复执行性. 实践中,通常我们以 ...
 
随机推荐
- Scyther-Semantics and verification of Security Protocol
			
1 .本书前一节主要是介作者自己的生平经历(读完感觉作者是个神童),目标明确作者13岁代码已经写的很溜了.自己也开了网络公司,但是后面又专注于自己的计算机基础理论,修了哲学的博士学位(不得不说很多专业 ...
 - Bootstrap-datepicker3官方文档中文翻译---I18N/国际化(原文链接 http://bootstrap-datepicker.readthedocs.io/en/latest/index.html)
			
I18N/国际化 这个插件支持月份和星期名以及weekStart选项的国际化.默认是英语(“en”); 其他有效的译本语言在 js/locales/ 目录中, 只需在插件后包含您想要的地区. 想要添加 ...
 - spring security 学习一
			
1.配置基本的springboot web项目,加入security5依赖,启动项目 浏览器访问,即可出现一个默认的登录页面 2.什么都没有配置 登录页面哪里来的 一般不知从何入手,就看官方文档里是如 ...
 - golang 关于 interface 的学习整理
			
Golang-interface(四 反射) go语言学习-reflect反射理解和简单使用 为什么在Go语言中要慎用interface{} golang将interface{}转换为struct g ...
 - Keil相关问题
			
1.keil重选则器件 2. 移植FREERTOS出错 .\Objects\RTOSDemo.axf: Error: L6406E: No space in execution regions wit ...
 - BLO(bzoj1123)
			
Description Byteotia城市有n个 towns, m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n和 ...
 - .net基础学java系列(二)IDE
			
上一篇文章.net基础学java系列(一)视野 废话: "视野"这篇文章,管理员说它比较空洞!也许初学者看不懂表格中的大部分内容!多年的neter估计也有很多不知道的! 有.net ...
 - Debian+Django+uWsgi+nginx+mysql+celery
			
下载系统各种依赖 nano /etc/apt/sources.list 在Debian中使用apt-get安装软件包时经常会提示让你插入netinst的光盘: Media change: please ...
 - CF1082
			
D 乱搞题..发现只有a[i]=1是特殊的 瞎搞一下 E 发现一段的贡献是出现次数最多的-为c个数 然后考虑分别对每种颜色做一下 然后每次只有这种颜色和他们之间是有用的 然后做个最大区间和就好了 F ...
 - James Munkres Topology: Sec 22 Exer 6
			
Exercise 22.6 Recall that \(\mathbb{R}_{K}\) denotes the real line in the \(K\)-topology. Let \(Y\) ...