ansible基础-加密

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

其他知识点

  1. 在仅使用多密码文件的情况下,默认的,ansible会按照命令行的排列顺序,逐个尝试。直到成功解密或失败。
  2. 在使用vault_id+多密码的情况下,ansible会优先匹配与vault_id相同的加密变量(这个标识上面加密变量有提到),如果不能解密再匹配其他vault_id变量文件。
  3. 除了命令行,密码文件的默认路径也可以通过ansible.cfg的「vault_password_file」或环境变量「ANSIBLE_VAULT_PASSWORD_FILE」获取。

九 本节应该掌握的技能

  • 掌握变量文件创建、查看、编辑、更改、取消加密等方法
  • 掌握字符串加密的方法
  • 掌握含加密文件时playbook的执行方法

十 参考链接

  • https://docs.ansible.com/ansible/latest/user_guide/vault.html

 

欢迎大家关注我的公众号:

posted @ 2018-12-03 01:02 MauriceWei 阅读( ...) 评论( ...) 编辑 收藏
<think>嗯,用户现在问的是“ansible all -m ping 远程操控主机文件清单在哪个目录下”。看起来他们可能对Ansible的主机清单文件的位置不太清楚,或者在执行ansible命令时遇到了问题。首先,我需要确认用户的问题到底是什么。 用户之前已经得到了关于Ansible常用模块的介绍,其中提到了使用`ansible all -m ping`来测试主机连通性。现在他们可能是在执行这个命令时,发现Ansible找不到主机清单文件,或者不知道应该把主机清单放在哪里,所以才会问“远程操控主机文件清单在哪个目录下”。 首先,Ansible默认的主机清单文件是`/etc/ansible/hosts`。这是官方文档中提到的默认路径。但很多用户可能不会直接修改这个系统级的文件,而是使用项目目录下的自定义清单文件。这时候,用户可能需要通过`-i`参数指定清单文件的路径。例如,如果用户在项目目录下有一个`inventory`文件,他们应该使用`ansible all -i inventory -m ping`来指定。 接下来,我需要考虑用户可能的误区。他们可能误以为`ansible all -m ping`命令中的某个参数可以指定主机清单的位置,但实际上`-m`是指定模块,而主机清单的位置需要用`-i`来指定。因此,用户的问题可能是因为没有正确指定清单文件的位置,导致命令执行失败。 另外,用户可能对Ansible的主机清单文件的结构不太了解。主机清单文件可以是INI格式或YAML格式,包含主机分组、变量等信息。例如: ``` [webservers] web1.example.com web2.example.com [databases] db1.example.com ansible_ssh_user=admin ``` 这种情况下,用户需要确保清单文件中的主机地址正确,并且SSH连接参数(如用户名、密钥等)配置正确,以便Ansible能够连接到目标主机。 此外,用户可能没有正确配置SSH密钥认证,导致即使主机清单正确,`ansible all -m ping`仍然失败。这时候需要检查SSH连接是否畅通,是否有权限访问目标主机。 总结一下,用户的潜在需求是正确配置Ansible的主机清单,以便能够成功执行命令。他们可能遇到的问题包括:默认清单文件位置不正确、未使用`-i`参数指定自定义清单、清单文件格式错误、SSH连接配置问题等。需要详细解释这些方面,并提供示例和解决方案,帮助用户理解和解决问题。</think>以下是关于Ansible主机清单文件的详细说明: --- ### 一、Ansible主机清单默认路径 Ansible默认从 **`/etc/ansible/hosts`** 读取主机清单文件,这是官方预设路径。 可通过以下命令验证默认配置: ```bash ansible-config dump | grep DEFAULT_HOST_LIST ``` --- ### 二、自定义清单文件用法 实际项目中推荐使用 **自定义路径的清单文件**,需通过 `-i` 参数手动指定: ```bash # 示例:使用当前目录下的 inventory 文件 ansible all -i ./inventory -m ping # 指定绝对路径 ansible all -i /opt/ansible/my_inventory -m ping ``` --- ### 三、清单文件核心配置模式 #### 1. **基础格式(INI风格)** ```ini # 定义主机组 [web_servers] web01.example.com ansible_port=2222 # 带参数的主机 web02.example.com [db_servers:children] # 嵌套组 web_servers # 包含其他组 [all:vars] # 全局变量 ansible_user=admin ansible_ssh_private_key_file=~/.ssh/ops_key ``` #### 2. **YAML格式(Ansible 2.4+)** ```yaml all: children: web_servers: hosts: web01.example.com: ansible_port: 2222 web02.example.com: db_servers: children: web_servers: vars: ansible_user: admin ``` --- ### 四、多环境管理技巧 建议按环境拆分清单文件: ``` inventory/ ├── production/ │ ├── hosts # 生产环境主机 │ └── group_vars/ # 生产环境变量 ├── staging/ │ ├── hosts │ └── group_vars/ └── dev/ ├── hosts └── group_vars/ ``` 执行时选择对应环境: ```bash ansible all -i inventory/production/ -m ping ``` --- ### 五、常见问题排查 #### 场景1:清单文件存在但无法识别 **现象**:执行时提示 `No hosts matched` **解决方案**: ```bash # 检查清单文件语法 ansible-inventory -i your_inventory --list # 查看生效的主机列表 ansible all -i your_inventory --list-hosts ``` #### 场景2:SSH连接失败 **现象**:`UNREACHABLE! => {"changed": false, "msg": "Failed to connect..."}` **验证步骤**: 1. 手动测试SSH连接: ```bash ssh -i /path/to/key admin@host.example.com -p 2222 ``` 2. 检查清单文件中的连接参数: ```ini target_host ansible_host=192.168.1.10 ansible_user=deploy ansible_ssh_private_key_file=~/.ssh/deploy_key ``` --- ### 六、最佳实践建议 1. **版本控制**:将清单文件与playbook一起纳入Git仓库管理 2. **动态清单**:对云环境使用动态清单脚本(AWS/Azure/GCP等均支持) 3. **加密敏感数据**:使用`ansible-vault`加密包含密码等敏感信息的清单变量 --- 通过合理管理主机清单文件,您可以实现: - 多环境配置隔离 - 主机分组精细化管理 - 连接参数统一维护 - 基础设施状态可视化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值