28、Ansible高级功能与实践指南

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
  1. 为了固定角色版本号,可创建一个 ansible_requirements.yml 文件:
---
- src: nginxinc.nginx
  version: 0.24.0
  1. 使用该文件从Ansible Galaxy安装角色,运行以下命令:
admin@myhome:~$ ansible-galaxy install -r ansible_requirements.yml
  1. 角色安装完成后,可在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
  1. 编辑该秘密文件,使用以下命令并输入加密密码:
ansible-vault edit secrets.yml
  1. 在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
  1. 使用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
  1. 在终端中执行以下命令运行 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代码。 |

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值