Ansible高级功能与实践指南
1. Ansible Galaxy简介
Ansible是一款强大的自动化工具,能让用户轻松配置、部署和管理复杂的IT基础设施。不过,创建和维护Ansible剧本可能会很耗时,特别是在大规模环境中。Ansible Galaxy的出现大大简化了这一过程,它是一个社区驱动的平台,提供了一个集中的预建角色和剧本仓库,可轻松集成到现有的Ansible项目中。
使用Ansible Galaxy,用户可以快速找到、下载并使用针对流行应用程序、服务和基础设施组件的预建角色和剧本。这些预建组件有助于加快部署时间,确保遵循最佳实践,并减少错误或不一致性的可能性。
以下是使用Ansible Galaxy安装nginx角色的步骤:
1. 确保系统已安装Ansible,运行以下命令安装nginx角色:
admin@myhome:~$ ansible-galaxy install nginxinc.nginx
默认情况下,所有安装的角色都放在
~/.ansible/roles
目录中。可以通过在主目录中创建全局Ansible配置文件
~/.ansible.cfg
来更改该目录,示例配置如下:
[defaults]
roles_path = /home/admin/myansibleroles
-
为了固定角色版本号,可创建一个
ansible_requirements.yml文件:
---
- src: nginxinc.nginx
version: 0.24.0
- 使用该文件从Ansible Galaxy安装角色,运行以下命令:
admin@myhome:~$ ansible-galaxy install -r ansible_requirements.yml
- 角色安装完成后,可在Ansible剧本中使用,示例剧本如下:
---
- name: Install and configure Nginx
hosts: webservers
become: true
roles:
- nginxinc.nginx
vars:
nginx_sites:
myapp:
template: "{{ playbook_dir }}/templates/myapp.conf.j2"
2. 处理敏感信息
在任何IT基础设施中,保护密码、令牌和证书等敏感信息至关重要。将这些敏感信息保存在Git仓库或其他公共位置存在重大安全风险,因为这些仓库通常可供多个用户访问,且版本控制系统会保留文件更改历史,可能导致敏感信息意外暴露。Ansible提供了几种管理敏感信息的方法。
2.1 Ansible Vault
Ansible Vault是Ansible提供的一个功能,可让用户对密码、密钥和证书等敏感数据进行加密和解密。它使用多种加密方法,默认使用AES 256加密算法,还支持AES 192和AES 128等其他算法。
创建新的Ansible Vault的步骤如下:
1. 运行以下命令创建新的加密vault文件:
admin@myhome:~$ ansible-vault create secrets.yml
New Vault password:
Confirm New Vault password:
输入密码后,vault文件将被创建并在默认编辑器中打开。示例
secrets.yml
文件内容如下:
somesecret: pleaseEncryptMe
secret_pgsql_password: veryPasswordyPassword
- 编辑该秘密文件,使用以下命令并输入加密密码:
ansible-vault edit secrets.yml
-
在Ansible任务中读取vault中的
pgsql_password秘密,示例任务如下:
- name: Read pgsql_password from Ansible Vault
include_vars:
file: secrets.yml
vault_password_file: /path/to/vault/password/file
vars:
pgsql_password: "{{ secret_pgsql_password }}"
为防止在调试输出中暴露敏感信息,处理敏感信息的任务可启用
no_log: True
选项。
2.2 SOPS
Secrets OPerationS (SOPS)是Mozilla开发的开源工具,可让用户在各种配置文件(包括Ansible剧本)中安全地存储和管理敏感信息。它采用混合加密方法,结合对称和非对称加密,以确保最大安全性。
创建SOPS加密的YAML文件并将其内容加载到Ansible剧本的步骤如下:
1. 创建一个名为
secrets.yaml
的YAML文件,内容如下:
postgresql_password: So.VerySecret
- 使用SOPS加密该文件:
admin@myhome:~$ sops secrets.yaml > secrets.sops.yaml
加密完成后,可安全地删除
secrets.yaml
明文文件。
3. 创建一个新的Ansible剧本
database.yml
,内容如下:
---
- hosts: dbserver
become: true
vars:
postgresql_password: "{{ lookup('community.sops.load_vars', 'secrets.sops.yaml')['postgresql_password'] }}"
tasks:
- name: Install PostgreSQL
apt:
name: postgresql
state: present
- name: Create PostgreSQL user and database
postgresql_user:
db: mydatabase
login_user: postgres
login_password: "{{ postgresql_password }}"
name: myuser
password: "{{ postgresql_password }}"
state: present
2.3 其他敏感信息管理解决方案
除了Ansible Vault和SOPS,还有其他一些工具可用于安全管理敏感数据:
| 工具名称 | 描述 |
| ---- | ---- |
| HashiCorp Vault | 用于安全存储和访问秘密的开源工具,提供安全的集中式秘密存储、访问控制和审计服务。 |
| Blackbox | 一个使用GNU Privacy Guard (GPG) 加密和解密文件的命令行实用程序,为每个需要访问加密数据的用户或团队创建单独的GPG密钥。 |
| Keywhiz | 另一个开源的秘密管理系统,提供了一种简单的方法来安全地存储和分发秘密,包括用于管理秘密的Web界面和用于访问它们的命令行工具。 |
| Azure Key Vault、AWS Secrets Manager、Google Cloud Secret Manager | 在处理云环境时可考虑使用的解决方案。 |
3. Ansible Tower及替代方案
Ansible Tower是一个集中式平台,用于管理Ansible自动化工作流,方便IT团队协作、共享知识和维护基础设施。它具有以下关键特性:
- 基于Web的界面,用于管理Ansible剧本、清单和作业运行。
- 基于角色的访问控制 (RBAC),用于管理用户权限。
- 内置仪表板,用于监控作业状态和结果。
- API,用于与其他工具和平台集成。
Ansible Tower是Red Hat公司的商业产品,其替代方案有:
| 工具名称 | 特点 | 许可模式 |
| ---- | ---- | ---- |
| Ansible AWX | 开源替代方案,提供与Ansible Tower相似的功能,但具有更高的定制性和灵活性。2017年首次发布,适合希望大规模实施Ansible自动化而无需商业许可证成本的组织。 | 开源,可从Ansible网站免费下载。 |
| Ansible Semaphore | 基于Web的应用程序,旨在简化Ansible剧本和项目的管理。2016年首次发布,是一个简单易用的开源替代方案,无需大量编码知识即可轻松自动化基础设施任务。 | 开源免费。 |
相关网站链接:
- Ansible Tower: https://access.redhat.com/products/ansible-tower-red-hat
- Ansible AWX: https://github.com/ansible/awx
- Ansible Semaphore: https://www.ansible-semaphore.com/
4. 高级调试技巧
在调试Ansible剧本运行问题时,增加详细级别以获取更多关于Ansible操作的详细输出通常很有用。Ansible有四个详细级别:
-v
、
-vv
、
-vvv
和
-vvvv
,添加的
v
越多,输出越详细。
默认情况下,Ansible以
-v
级别运行,提供执行任务的基本信息。若剧本出现问题,可增加详细级别以获取更详细输出。例如,使用
-vv
将提供有关正在执行的剧本、角色和任务的额外信息,使用
-vvv
还将显示Ansible跳过的任务。
增加Ansible剧本运行详细级别的方法有两种:
-
命令行方式
:在
ansible-playbook
命令中添加一个或多个
-v
选项。示例如下:
admin@myhome:~$ ansible-playbook playbook.yml -vv
若需要更详细的输出,可添加更多
-v
选项:
admin@myhome:~$ ansible-playbook playbook.yml -vvv
-
配置文件方式
:在
ansible.cfg文件中设置详细级别。添加以下内容:
[defaults]
verbosity = 2
上述配置将所有
ansible-playbook
命令的详细级别设置为
-vv
,可将值更改为3或4以进一步提高详细级别。
此外,若需要在详细模式下添加自定义通信(如打印变量),可使用
debug
任务。示例剧本如下:
---
- hosts: all
gather_facts: true
vars:
my_variable: "Hello, World!"
tasks:
- name: Print variable in debug mode
debug:
msg: "{{ my_variable }}"
verbosity: 2
在该剧本中,定义了一个
my_variable
变量,然后使用
debug
模块通过
msg
参数打印该变量的值。
verbosity: 2
行启用了
-vv
调试模式,会显示
debug
模块的输出。
5. Ansible剧本代码检查
Ansible代码检查是分析和验证Ansible代码语法和风格的过程,以确保其符合最佳实践和标准。检查的目的是在代码执行之前捕获潜在的错误或问题,从而节省时间和精力。
最常用的Ansible代码检查工具是
ansible-lint
,它是一个开源的命令行工具,可分析Ansible剧本和角色中的潜在问题并提供改进建议。
对示例剧本运行
ansible-lint
的步骤如下:
1. 假设示例剧本
sample-playbook.yml
内容如下:
---
- name: (Debian/Ubuntu) {{ (nginx_setup == 'uninstall') | ternary('Remove', 'Configure') }} NGINX repository
ansible.builtin.apt_repository:
filename: nginx
repo: "{{ item }}"
update_cache: true
mode: "0644"
state: "{{ (nginx_state == 'uninstall') | ternary('absent', 'present') }}"
loop: "{{ nginx_repository | default(nginx_default_repository_debian) }}"
when: nginx_manage_repo | bool
- name: (Debian/Ubuntu) {{ (nginx_setup == 'uninstall') | ternary('Unpin', 'Pin') }} NGINX repository
ansible.builtin.blockinfile:
path: /etc/apt/preferences.d/99nginx
create: true
block: |
Package: *
Pin: origin nginx.org
Pin: release o=nginx
Pin-Priority: 900
mode: "0644"
state: "{{ (nginx_state == 'uninstall') | ternary('absent', 'present') }}"
when: nginx_repository is not defined
- name: (Debian/Ubuntu) {{ nginx_setup | capitalize }} NGINX
ansible.builtin.apt:
name: nginx{{ nginx_version | default('') }}
state: "{{ nginx_state }}"
update_cache: true
allow_downgrade: "{{ omit if ansible_version['full'] is version('2.12', '<') else true }}"
ignore_errors: "{{ ansible_check_mode }}"
notify: (Handler) Run NGINX
-
在终端中执行以下命令运行
ansible-lint:
admin@myhome:~$ ansible-lint sample-playbook.yml
ansible-lint
的输出可能因Ansible和
ansible-lint
的版本以及启用的具体规则而异。对上述示例剧本运行
ansible-lint
的输出示例如下:
[WARNING]: empty path for ansible.builtin.blockinfile, path set to ''
[WARNING]: error loading version info from /usr/lib/python3.10/site-packages/ansible/modules/system/setup.py: __version__ = '2.10.7'
[WARNING]: 3.0.0 includes an experimental document syntax parser that could result in parsing errors for documents that used the previous parser. Use `--syntax-check` to verify new documents before use or consider setting `document_start_marker` to avoid using the experimental parser.
sample-playbook.yml:1:1: ELL0011: Trailing whitespace
sample-playbook.yml:7:1: ELL0011: Trailing whitespace
sample-playbook.yml:9:1: ELL0011: Trailing whitespace
sample-playbook.yml:17:1: ELL0011: Trailing whitespace
sample-playbook.yml:22:1: ELL0011: Trailing whitespace
sample-playbook.yml:26:1: ELL0011: Trailing whitespace
sample-playbook.yml:29:1: ELL0011: Trailing whitespace
sample-playbook.yml:35:1: ELL0011: Trailing whitespace
sample-playbook.yml:38:1: ELL0011: Trailing whitespace
sample-playbook.yml:41:1: ELL0011: Trailing whitespace
sample-playbook.yml:44:1: ELL0011: Trailing whitespace
sample-playbook.yml:47:1: ELL0011: Trailing whitespace
sample-playbook.yml:50:1: ELL0011: Trailing whitespace
sample-playbook.yml:53:1: ELL0011: Trailing whitespace
通过以上介绍,我们了解了Ansible Galaxy、敏感信息处理、Ansible Tower及其替代方案、高级调试技巧和剧本代码检查等内容。这些功能和技巧能帮助我们更高效地使用Ansible进行自动化运维工作。
下面用mermaid流程图展示使用Ansible Galaxy安装nginx角色的流程:
graph LR
A[确保系统安装Ansible] --> B[运行ansible-galaxy install nginxinc.nginx]
B --> C{是否更改角色目录}
C -- 是 --> D[创建~/.ansible.cfg配置文件并设置roles_path]
C -- 否 --> E[角色默认安装到~/.ansible/roles目录]
D --> E
E --> F[创建ansible_requirements.yml文件固定角色版本]
F --> G[运行ansible-galaxy install -r ansible_requirements.yml安装指定版本角色]
G --> H[在Ansible剧本中使用nginxinc.nginx角色]
同时,总结一下本文介绍的主要工具和功能:
| 工具/功能 | 描述 |
| ---- | ---- |
| Ansible Galaxy | 社区驱动平台,提供预建角色和剧本,可加速Ansible项目开发。 |
| Ansible Vault | Ansible提供的加密工具,用于保护敏感信息。 |
| SOPS | 开源工具,采用混合加密方法管理敏感信息。 |
| Ansible Tower | 商业平台,集中管理Ansible自动化工作流。 |
| Ansible AWX | 开源替代Ansible Tower,定制性强。 |
| Ansible Semaphore | 开源工具,简化Ansible剧本管理。 |
| ansible-lint | 开源命令行工具,用于检查Ansible代码。 |
超级会员免费看
777

被折叠的 条评论
为什么被折叠?



