Ansible 全面指南:简单、高效的自动化方案

发布时间:2023年12月18日

引言

Ansible:简单、强大的自动化工具

在现代 IT 管理和运维中,自动化变得越来越重要。Ansible 作为一种简单且高效的自动化工具,从业务运维到云端部署都发挥着重要作用。
于 2012 年由 Michael DeHaan 创建,后被 Red Hat 收购。

简介和发展

起源与发展

Ansible 的诞生源于对于配置管理和自动化工具的渴望。相比于其他复杂笨重的解决方案,Ansible 的设计理念是“简单即可强大”。其基于 Python 开发,采用轻量级的 Agentless 架构,不需要在被控节点上安装任何代理程序或软件。

用途与功能

Ansible 旨在简化基础架构的自动化、配置管理和应用部署。能够轻松应对多种任务,包括但不限于系统配置、应用程序部署、网络设备配置和云端资源管理。
Ansible 通过 Playbook 和模块化的任务,将复杂的自动化工作转化为简单易懂的代码。

地位与影响

在自动化领域,Ansible 已成为业界瞩目的工具之一。简单易用、高度可扩展以及强大的社区支持,被广泛应用于各种规模和类型的基础设施管理中。从开发到运维,Ansible 提供一套全面的解决方案,使得自动化变得更加容易且高效。

Ansible 的崛起标志着自动化工具的一次革命。不仅改变了 IT 管理的方式,还推动了自动化在企业中的广泛应用,成为了现代 IT 管理的必备利器。


功能介绍

Ansible 基本概念

控制 | 被控

在 Ansible 中,有两个重要的概念:控制节点(Control Node)和被控节点(Managed Node)。控制节点是运行 Ansible 的主机,可以是开发机器或者专门用于管理的服务器。被控节点是需要被管理和控制的目标主机或服务器。

模块

模块(Module):
Ansible 通过模块来执行任务。模块是 Ansible 的基本组成单元,每个模块用于完成特定的任务,比如管理文件、安装软件包、配置服务等。Ansible 模块是幂等的,即无论执行多少次,结果都是一致的。

剧本

Playbook(剧本):
Playbook 是用 YAML 格式编写的文本文件,包含一系列任务(tasks)。每个任务都是一个模块调用,定义了要在被控节点上执行的操作。Playbook 允许定义主机配置、任务顺序和并行执行的方式。

任务

任务(Tasks):
任务是 Playbook 中的基本单元,代表着在被控节点上执行的操作。每个任务通常包含了一个模块调用,以及模块需要的参数。

运行

运行流程:
Ansible 工作流程:控制节点通过 SSH 连接到被控节点,并在被控节点上执行模块。Ansible 不需要在被控节点上安装任何额外的代理或软件,这是因为 Ansible 使用 SSH 协议来远程管理主机。

工作方式:
当运行一个 Playbook 时,Ansible 会读取控制节点上的配置文件和任务列表,然后连接到被控节点执行任务。执行结果将会反馈给控制节点,用户可以在控制节点上查看任务执行的结果和状态。


示例

在被控节点上创建目录:

** Playbook 示例:**

---
- name: # 创建目录示例
  hosts: hosts  # 指定被控节点的名称或分组
  become: yes  # 如果需要以管理员身份运行,请使用 become

  tasks:
    - name: # 创建目录
      file:
        path: /path/directory  # 指定要创建的目录路径
        state: directory  # 指定目录的状态,这里是要创建一个目录

    - name: # 打印信息
      debug:
        msg: "目录已创建"  # 运行成功后输出的信息

解释说明:

  • hosts:指定被控节点的名称或分组,可以是单个主机也可以是主机组。
  • become: yes:以管理员身份运行。
  • tasks:定义执行的任务列表。
  • file 模块:用于文件和目录操作,这里用来创建目录。
  • path:指定要创建的目录路径。
  • state:定义状态,directory 表示要创建的是目录。
  • debug 模块:用于输出调试信息。
  • msg:运行后输出的信息。

运行 Playbook

ansible-playbook create_directory.yml

Ansible 角色(Roles)

Ansible 角色是组织 Playbook 的方法,使得代码重用和管理变得更加模块化和结构化。角色可以包含特定任务、处理、模板和变量,可以使得 Playbook 更清晰、易读、易维护。

变量管理

变量是 Ansible 中的关键概念。允许将数据存储在单个位置,并在多个 Playbook 或任务中重复使用。Ansible 提供多种方式来管理变量,包括主机变量、组变量、Playbook 变量、角色变量以及外部变量文件等。
变量管理在 Ansible 中非常重要,允许将数据存储在单个位置并在多个 Playbook 或任务中重复使用。

定义

变量管理是指在 Ansible 中管理数据、配置和参数的过程。这些变量可以是各种类型的数据,包括字符串、数字、列表、字典等。通过合理管理变量,可以提高 Ansible Playbook 的灵活性和可维护性。

  1. 主机变量(Host Variables):

    • 与特定主机关联的变量,存储在 Inventory 文件中或动态生成的 Inventory 中。
  2. 组变量(Group Variables):

    • 与主机组关联的变量,存储在 Inventory 文件中,可在整个组中共享使用。
  3. Playbook 变量(Playbook Variables):

    • 在 Playbook 文件中定义的变量,适用于整个 Playbook。
  4. 角色变量(Role Variables):

    • 与 Ansible 角色相关联的变量,用于组织和复用任务。
示例

Ansible Playbook 中定义和使用主机名称变量:

Inventory 文件(hosts.ini):

[web_servers]
server1 ansible_host=192.168.1.101
server2 ansible_host=192.168.1.102

[db_servers]
db1 ansible_host=192.168.1.201
db2 ansible_host=192.168.1.202

Playbook 文件

---
- name: # 使用变量示例
  hosts: web_servers
  vars:
    http_port: 80
    app_name: my_app

  tasks:
    - name: # 安装 Apache
      yum:
        name: httpd
        state: present

    - name: # 创建 Web 应用目录
      file:
        path: "/var/www/{{ app_name }}"
        state: directory

    - name: # 设置防火墙规则
      firewalld:
        port: "{{ http_port }}"
        state: enabled

定义http_portapp_name 两个变量,分别用于指定 HTTP 端口和应用名称。

Ansible Vault

Ansible Vault 是用于加密敏感数据的工具,如密码、证书等。保护 Playbook 和变量文件中的敏感信息,并确保只有授权的用户可以访问和解密这些数据。

创建加密文件

使用 ansible-vault 命令,创建一个新的库文件并使用 Vault 加密:

ansible-vault create secret_vars.yml

输入密码加密文件。输入密码后,编辑器打开空文件。在文件中添加信息(如密码、密钥等)保存。每次编辑此文件时,都需要输入 Vault 密码。

编辑加密文件

编辑现有的加密文件:

ansible-vault edit secret_vars.yml

输入 Vault 密码,然后打开编辑文件。

查看加密文件内容

ansible-vault view 命令查看加密文件的内容,但不会对文件进行解密:

ansible-vault view secret_vars.yml

输入 Vault 密码才能查看文件内容。

解密文件

解密文件编辑或查看其内容:

ansible-vault decrypt secret_vars.yml

输入 Vault 密码并将文件解密。

重新加密文件

编辑或查看文件后,使用 ansible-vault encrypt 命令重新加密文件:

ansible-vault encrypt secret_vars.yml

文件进行重新加密并要求输入新的 Vault 密码。

在 Playbook 中使用加密文件:

在 Playbook 中使用加密的变量文件。 vars_files 指定要包含的加密文件:

---
- name: 使用加密文件示例
  hosts: hosts
  vars_files:
    - /path/encrypted_file.yml

Ansible Galaxy

Ansible Galaxy 是 Ansible 社区的中心,可以在这里找到大量的角色、Playbook 和剧本。通过 Ansible Galaxy,可以快速获取开源的、可重复使用的自动化内容,加快自动化过程。

安装角色或 Playbook

ansible-galaxy 命令可以从 Ansible Galaxy 安装角色或 Playbook。
安装 httpd 的角色:

ansible-galaxy install httpd

下载并安装指定角色到默认的 Ansible 角色路径(默认 /etc/ansible/roles~/.ansible/roles)。

查找角色或 Playbook

可以在 Ansible Galaxy 网站(Galaxy)上搜索需要的角色或 Playbook,包括名称和作者等信息。

您可以使用 ansible-galaxy 命令行工具来搜索 Ansible Galaxy 上的角色。以下是一个示例:

联机搜索角色
ansible-galaxy search keyword

Apache 相关角色:

ansible-galaxy search apache
联机安装角色
ansible-galaxy install geerlingguy.apache

Ansible 从 Ansible Galaxy 下载角色,安装到默认的角色路径中。

安装集合
ansible-galaxy collection install community.general

安装名为 community.general 的集合。集合是 Ansible Galaxy 中的另一种资源类型,包含模块、插件、剧本等。

指定版本号安装

还可以通过指定版本号来安装特定版本的角色或集合。

ansible-galaxy install geerlingguy.apache,1.0.0

安装 geerlingguy.apache 的 1.0.0 版本。

安装到自定义路径

使用 --roles-path 参数将角色安装到自定义路径:

ansible-galaxy install geerlingguy.apache --roles-path /custom/roles/path

这些命令从 Ansible Galaxy 上下载并安装指定的角色或集合。

上传角色

创建角色分享社区,将角色上传到 Ansible Galaxy。登录 Ansible Galaxy 社区账户后,上传角色:

ansible-galaxy login
ansible-galaxy publish username.role_name

发布到 Ansible Galaxy 后,其他用户下载和使用。

本地角色

可以创建本地自定义的 Ansible 角色库,优势以及用途:
定制性强:可以根据特定需求创建自定义角色,以满足项目或组织的特定要求。
灵活性:可以根据需要修改和扩展角色,满足特定环境的配置需求。
无需网络:本地角色库允许在没有网络连接的情况下使用角色,适用于隔离网络或无法连接外部资源的环境。
保密性:对于包含敏感信息的角色,本地库可以确保数据不会传输到外部。
版本管理:使用版本控制工具(如 Git)来管理本地角色库,便于跟踪和控制角色的版本和变更。
可回溯性:可以根据需要回退到特定版本的角色,确保系统在更新后不会出现问题。
加速部署:在本地快速部署特定版本的角色,无需等待下载或更新远程角色。
离线部署:针对多台服务器进行快速、一致的离线部署,提高效率和一致性。

动态 Inventory

Ansible 支持多种 Inventory 类型,包括静态 Inventory 和动态 Inventory。动态 Inventory 允许 Ansible 动态地获取管理主机清单,在云环境或动态部署情况下非常有用。

实际应用
自动化部署
  • Ansible 自动化应用程序和基础设施的部署,确保环境一致性和可靠性。
部署示例

部署 Web 应用,包含前端和后端服务。应用部署到多台服务器上,并确保系统配置的一致性。

Inventory 文件(hosts.ini):

[web_servers]
server1 ansible_host=192.168.1.101
server2 ansible_host=192.168.1.102

[db_servers]
db1 ansible_host=192.168.1.201
db2 ansible_host=192.168.1.202

Playbook 文件(deploy_app.yml):

---
- name: # 自动化部署示例
  hosts: web_servers
  become: yes

  tasks:
    - name: # 安装 Web --Nginx
      yum:
        name: nginx
        state: present

    - name: # 部署前端应用
      copy:
        src: /local/path/to/frontend_files
        dest: /var/www/html
        remote_src: yes

- name: # 部署后端应用
  hosts: db_servers
  become: yes

  tasks:
    - name: # 安装数据库服务 MySQL
      yum:
        name: mysql
        state: present

    - name: # 配置数据库
      mysql_db:
        name: my_app_db
        state: present

定义两个任务,分别用于部署前端和后端服务。前端部署在 web_servers 组的服务器上,后端部署在 db_servers 组的服务器上。将不同组的任务分开,并应用到不同的主机组上。

运行 Playbook:

ansible-playbook -i hosts.ini deploy_app.yml

配置管理

  • 使用 Ansible 确保系统、服务和应用程序的统一配置,减少配置漂移和错误。
    配置管理在 Ansible 中是一个关键的应用场景,它涵盖了管理系统、服务和应用程序的统一配置。以下是一个简单的配置管理示例,演示了如何使用 Ansible 实现配置管理:
配置管理示例

配置多台服务器 Nginx 服务。

Inventory 文件(hosts.ini)

[web_servers]
server1 ansible_host=192.168.1.101
server2 ansible_host=192.168.1.102

Playbook 文件(configure_nginx.yml):

---
- name: # 配置管理示例 - Nginx
  hosts: web_servers
  become: yes

  tasks:
    - name: 安装 Nginx
      yum:
        name: nginx
        state: present

    - name: # 拷贝 Nginx 配置文件
      template:
        src: /local/path/to/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify:
        - restart nginx

  handlers:
    - name: # 重新启动 Nginx
      service:
        name: nginx
        state: restarted

使用 nginx.conf.j2 模板文件,生成 Nginx 配置文件。将文件拷贝到远程服务器 /etc/nginx/nginx.conf

模板文件(nginx.conf.j2):

# Nginx 配置模板
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    server {
        listen 80;
        server_name;

        location / {
            root /usr/share/nginx/html;
            index index.html index.htm;
        }
    }
}

运行 Playbook:

ansible-playbook -i hosts.ini configure_nginx.yml

使用相同的配置文件,在 web_servers 主机组服务器上安装并配置 Nginx。

持续集成/持续部署(CI/CD)
  • 集成 Ansible 到 CI/CD 流程中,实现自动化测试、构建和部署。

基础设施编排

  • Ansible 基础架构编排和管理,多云服务商资源管理。
    CI/CD(持续集成/持续部署)是软件开发流程中的重要环节,Ansible 可以集成到 CI/CD 流程中实现自动化测试、构建和部署。
CI/CD 示例

使用 Jenkins 进行持续集成和持续部署,代码提交后自动执行测试、构建和部署到服务器。

Jenkins Pipeline(Jenkinsfile):

pipeline {
    agent any

    stages {
        stage('Checkout') {
            steps {
                // 检出代码库
                git 'https://github.com/repo.git'
            }
        }

        stage('Test') {
            steps {
                // 执行测试(例如:单元测试)
                sh 'ansible-playbook -i inventory/test test.yml'
            }
        }

        stage('Build') {
            steps {
                // 构建应用程序(如果需要)
                sh 'ansible-playbook -i inventory/dev build.yml'
            }
        }

        stage('Deploy') {
            steps {
                // 部署到生产服务器
                sh 'ansible-playbook -i inventory/prod deploy.yml'
            }
        }
    }
}

** Ansible Playbooks(test.yml, build.yml, deploy.yml)**

编写不同的 Ansible Playbooks 来执行测试、构建和部署任务。Playbooks 可以针对不同的环境进行配置。

例如,test.yml 执行单元测试,build.yml 构建应用程序, deploy.yml 将应用程序部署到生产服务器上。

Inventory 文件(inventory/test, inventory/dev, inventory/prod)

针对不同的环境编写对应的 Inventory 文件,定义不同环境的主机信息。

流程控制
  1. 当代码提交时,Jenkins Pipeline 自动触发。
  2. Pipeline 检出代码库。
  3. 执行测试阶段,运行 test.yml
  4. 测试通过后,执行构建阶段,运行 build.yml
  5. 最后构建成功,执行部署阶段,运行 deploy.yml

Ansible 可以在不同的阶段实现自动化,确保代码变更的快速部署和持续交付。

管理和控制
模块化和角色化

在 Ansible 中,模块化和角色化是促进可重用性和可维护性的关键概念。将任务模块化,角色化进行组织管理和编排,提高复用和管理效率。

模块化示例

Playbook 模块

---
- name: # 模块示例
  hosts: hosts
  become: yes

  tasks:
    - name: # 安装指定软件包
      yum:
        name: httpd
        state: present

    - name: # 创建文件夹
      file:
        path: /path/folder
        state: directory

yumfile 是 Ansible 提供的两个模块。使用不同的模块执行任务:安装软件包、创建文件夹。

角色化示例

创建角色结构:

ansible-galaxy init roles/httpd

在roles文件夹下创建名为 httpd 的 Ansible 角色模板,包含默认的目录结构和文件。

**Playbook **

---
- name: # 角色示例
  hosts: hosts
  become: yes

  roles:
    - role

role 角色在 hosts 主机组上执行。

  • 模块化:通过使用模块,将任务细分为重复使用的功能块,提高任务的灵活性和复用性。

  • 角色化:角色是对任务和变量进行组织,更好地管理复杂配置。通过角色,在不同的环境中使用相同的任务结构,提高代码的可维护性和复用性。


小结

Ansible 有几个显著的优势使其成为自动化和配置管理的首选工具之一。
总结:

简单易用

  • 无需客户端安装:Ansible 直接在管理节点上运行,无需在被管节点上安装代理或客户端。
  • 基于 YAML 语法:易于理解和编写,简单的结构和明确的格式,使得编写 Playbooks 更为简便。

自动化能力

  • 自动化配置管理:自动化部署、配置和管理大规模的基础设施和应用程序。
  • 模块化:提供大量模块,覆盖各种任务,如软件包管理、文件操作、服务控制等。

高度灵活

  • 多平台支持:支持多种操作系统和云平台,可用于混合环境和多云场景。
  • 模块和插件:拥有丰富的模块和插件库,可扩展和定制化以满足特定需求。

可扩展性和一致性

  • 剧本重用:使用角色和剧本的方式可以使配置和任务模块化,实现剧本的重复利用和整体一致性。
  • 动态库存:能够动态管理和维护主机清单,适应不断变化的基础设施。

安全性和可靠性

  • 安全性:支持加密敏感数据、安全传输和权限管理,确保安全性和合规要求。
  • 可靠性:基于声明性配置,即使在网络故障或中断的情况下也能够恢复执行任务。

Ansible 作为一种功能强大且易于使用的自动化工具,能够满足不同规模和需求的环境。其简单的语法和丰富的功能使其成为自动化和配置管理的首选工具。


喜欢的话,请收藏 | 关注!
万一有趣的事还在后头呢!
42CF4001.png

文章来源:https://blog.csdn.net/u010691082/article/details/135013782
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。