searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

两种自动化主机部署方式介绍

2023-08-28 04:49:58
39
0

一、背景

在DevOps开发过程中,需要实现主机部署的自动化,那么发布平台是如何控制主机的?常用的方式有哪些呢?他们有什么不同呢?下边介绍两种常用的自动化主机部署方式:Ansible和Agent。

二、Ansible方式

Ansible 是一种自动化工具,用于配置管理、应用程序部署、任务自动化和协调多台计算机,以简化和加速 IT 环境中的自动化任务。

1、特点

  • Agentless(无 Agent): 无代理,使用 SSH 协议与目标主机进行通信。
  • 基于剧本: 使用 剧本来定义所需状态和任务。
  • 声明性语法:使用声明性语法。
  • 模块化: 提供了丰富的模块。
  • 跨平台支持: 支持多种操作系统、云平台和网络设备。
  • 强大的编排:可以用于编排复杂的多阶段任务。

2、应用场景

  • 自动化配置和部署:可以用于自动化主机配置、应用程序部署和软件更新。
  • 一致性配置管理:确保多台主机的配置状态一致,避免手动操作引发的错误。
  • 自动化任务:可用于定期执行任务、文件传输、数据库备份等自动化操作。
  • 云环境管理:可以在平台上自动创建、配置和管理云资源。
  • 基础设施即代码:可以将基础设施定义为代码,实现自动创建和管理。

3、  使用例子

● 将目标主机纳入管理

了控制某主机,需要使用 Ansible 给目标主机配置公钥,通常需要具备目标主机的登录凭据,这包括 SSH 用户名和密码或 SSH 密钥。下边展示如何使用 Ansible 将公钥配置到目标主机上:

  • 在控制端生成SSH秘钥对

ssh-keygen -t rsa -b 4096 -C "xxxEmailAddr"

  • 将公钥配置到目标主机:

编写一个名为 `ssh_key_setup.yml` 的文件,内容如下:

- name: Setup SSH Public Key

  hosts: target_host  

  remote_user: remote_user  

  become: yes  # 使用 sudo 权限执行任务

  tasks:

    - name: Ensure ~/.ssh directory exists

      file:

        path: ~/.ssh

        state: directory

    - name: Add SSH public key to authorized_keys

      authorized_key:

        user: remote_user  # 替换为目标主机上的用户名

        key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"

(3)运行文件:打开终端,进入包含 `ssh_key_setup.yml` 文件的目录,运行命令:

ansible-playbook ssh_key_setup.yml --ask-pass

 

注:

  • 在这个示例中,`--ask-pass` 参数会要求输入目标主机的登录密码。如果想使用 SSH 密钥而非密码,可以使用 `--private-key` 参数来指定私钥文件。
  • 确保将 `target_host` 替换为要配置公钥的实际目标主机的主机名,将 `remote_user` 替换为目标主机上的实际用户名。

● 安装Nginx到目标主机上

公钥配置好后,下边演示如何通过 Ansible 自动安装一个基本的 Web 服务器(Nginx)到目标主机上。

(1)安装 Ansible: 首先,确保已经在控制节点上安装了 Ansible。

(2)创建 Ansible 剧本: 创建一个名为 `nginx_install.yml` 的文件,内容如下:

- name: Install Nginx

  hosts: target_host  # 替换成目标主机的主机名

  tasks:

    - name: Install Nginx package

      become: true  # 使用 sudo 权限执行任务

      apt:

        name: nginx

        state: present  # 安装 Nginx 软件包

(3) 运行剧本: 打开终端,进入包含 `nginx_install.yml` 文件的目录,运行命令:

ansible-playbook nginx_install.yml

(4)结果: Ansible 将会连接到目标主机,执行剧本中定义的任务。它会安装 Nginx 软件包并启动 Nginx 服务。

注:请确保将 `target_host` 替换为要部署到的实际目标主机的主机名。

三、  Agent方式

Agent 方式是一种自动化部署和管理的方法,通过在目标主机上安装代理软件来实现与中央管理端的通信和控制。

1、特点

  • 本地控制: 代理在目标主机上运行,使得本地控制和管理成为可能。这使得执行本地任务、操作和操作系统相关的配置更加灵活。
  • 复杂任务支持: Agent 可以在目标主机上执行复杂的任务、脚本和操作,而不需要将所有逻辑都从中央管理端传输。这对于分布式环境和复杂操作非常有用。
  • 实时监控: 代理可以定期向中央管理端报告状态和信息,从而实现实时监控、错误检测和故障排除。
  • 断网执行: 代理在目标主机上运行,即使网络断开,代理仍然可以继续执行预定任务,这对于不稳定的网络环境非常有用。
  • 隔离性: 每个代理可以在其本地环境中独立地执行任务,从而实现任务隔离,不同任务之间的影响较小。
  • 支持分布式环境: Agent 方式适用于分布式环境,可以在各个节点上运行代理,从而管理和控制不同位置的主机。
  • 定制性: 代理可以根据需求进行定制,允许你实现针对特定目标主机的特定配置和操作。
  • 安全性考虑: 需要注意的是,代理在目标主机上运行,因此需要确保代理的安全性,以免代理本身成为潜在的安全风险。

2、应用场景

  • 自动化部署和配置: 使用代理来实现自动化部署、配置文件管理和应用程序安装,可以在目标主机上执行必要的操作,确保一致性和可靠性。
  • 实时监控和报告: 代理可以定期向中央管理端报告主机的状态、性能指标和日志信息,帮助实时监控和问题排查。
  • 远程命令执行: 代理可以执行远程命令,使控制端可以在目标主机上执行各种操作,如文件操作、脚本执行等。
  • 安全漏洞修复: 使用代理可以在目标主机上自动执行安全漏洞修复操作,确保系统的安全性和合规性。
  • 配置管理和更新: 代理可以执行配置文件的修改和更新,确保系统的配置保持一致并满足要求。
  • 应用程序管理: 使用代理可以管理应用程序的生命周期,包括部署、启动、停止和升级等操作。
  • 分布式环境: 在分布式环境中,代理可以在不同的节点上运行,实现对多个主机的管理和控制。
  • 任务隔离: 代理可以实现任务隔离,使不同的任务在目标主机上独立运行,减少相互干扰。
  • 断网环境: 代理可以在目标主机上运行,即使网络断开,代理仍然可以执行任务,适用于不稳定的网络环境。
  • 实时配置管理: 使用代理可以实现实时配置的管理,可以快速地更新和调整配置。

3使用例子

这里演示,通过Java实现一个简单的Agent方式:

(1)"CustomAgent" 代理: 假设我们已经开发了一个 Java 类作为 "CustomAgent" 代理,它能够接收命令并在目标主机上执行。

import java.io.BufferedReader;

import java.io.InputStreamReader;

public class CustomAgent {

    public static void main(String[] args) {

        if (args.length != 1) {

            System.out.println("Usage: java CustomAgent <command>");

            System.exit(1);

        }

        String command = args[0];

        String result = executeCommand(command);

        System.out.println(result);

    }

    private static String executeCommand(String command) {

        try {

            Process process = Runtime.getRuntime().exec(command);

            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

            StringBuilder output = new StringBuilder();

            String line;

            while ((line = reader.readLine()) != null) {

                output.append(line).append("\n");

            }

            process.waitFor();

            return output.toString().trim();

        } catch (Exception e) {

            return "Command execution failed";

        }

    }

}

(2)在控制端,我们可以使用 Java 的 `ProcessBuilder` 类或其他方法与代理进行通信。下边演示如何通过 "CustomAgent" 代理执行远程命令并获取结果:

public class RemoteCommandExecutor {

    public static void main(String[] args) {

        String remoteCommand = "java CustomAgent hostname";

        String response = executeRemoteCommand(remoteCommand);

        System.out.println("Remote command response: " + response);

    }

    private static String executeRemoteCommand(String command) {

        try {

            Process process = Runtime.getRuntime().exec(command);

            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

            StringBuilder output = new StringBuilder();

            String line;

            while ((line = reader.readLine()) != null) {

                output.append(line).append("\n");

            }

            process.waitFor();

            return output.toString().trim();

        } catch (Exception e) {

            return "Command execution failed";

        }

    }

}

注:在这个示例中,我们可以通过执行控制端的 Java 类来与 "CustomAgent" 代理通信,发送命令获取主机名,并让代理返回结果。当然,实际中的代理可能需要更多、更复杂的通信能力和错误处理。

四、  对比

Ansible 和 Agent 方式都是自动化部署和管理的方式,但它们在实现方式和应用场景上有一些不同点。

Ansible方式:

  1. 中心化管理:Ansible 是一种中心化的管理工具,通过 SSH 协议连接到目标主机来执行任务,无需在目标主机上安装代理。
  2. 无代理:Ansible 无需在目标主机上安装代理,通过 SSH 协议直接执行任务,这降低了目标主机的复杂性和安全风险。
  3. 基于模块:Ansible 提供了丰富的模块,用于执行各种任务,如文件操作、软件安装、配置修改等。
  4. 声明性语言:Ansible 使用声明性的 YAML 文件来定义任务和配置,易于阅读和维护。
  5. 剧本和角色:Ansible 使用剧本(Playbooks)和角色(Roles)来组织任务和配置,实现可重用和模块化的管理。
  6. 幂等性:Ansible 的任务具有幂等性,可以多次执行而不会对系统状态造成影响。
  7. 适用场景:Ansible 适用于各种场景,特别是在配置管理、应用程序部署、自动化任务和基础设施编排等方面。

Agent 方式:

  1. 代理运行:Agent 方式需要在目标主机上安装代理软件,代理负责接收任务、执行操作和与中央管理端通信。
  2. 本地操作:代理可以在目标主机上执行本地操作,可以执行复杂任务和访问本地资源。
  3. 实时监控:代理可以定期向中央管理端报告状态和信息,实现实时监控和问题排查。
  4. 任务隔离:代理可以实现任务隔离,不同的代理可以在同一台主机上独立执行任务。
  5. 断网环境:代理可以在目标主机上运行,即使网络断开,代理仍然可以执行任务,适用于不稳定的网络环境。
  6. 适用场景:Agent 方式适用于需要在目标主机上执行本地任务、实时监控、复杂操作和分布式环境的场景。

总结: Ansible 通常适用于集中式、无代理的自动化管理,而 Agent 方式适用于需要在目标主机上执行本地操作和实时监控的场景,我们应该根据具体的场景选择不同的方式。

0条评论
0 / 1000
g****n
3文章数
0粉丝数
g****n
3 文章 | 0 粉丝
g****n
3文章数
0粉丝数
g****n
3 文章 | 0 粉丝
原创

两种自动化主机部署方式介绍

2023-08-28 04:49:58
39
0

一、背景

在DevOps开发过程中,需要实现主机部署的自动化,那么发布平台是如何控制主机的?常用的方式有哪些呢?他们有什么不同呢?下边介绍两种常用的自动化主机部署方式:Ansible和Agent。

二、Ansible方式

Ansible 是一种自动化工具,用于配置管理、应用程序部署、任务自动化和协调多台计算机,以简化和加速 IT 环境中的自动化任务。

1、特点

  • Agentless(无 Agent): 无代理,使用 SSH 协议与目标主机进行通信。
  • 基于剧本: 使用 剧本来定义所需状态和任务。
  • 声明性语法:使用声明性语法。
  • 模块化: 提供了丰富的模块。
  • 跨平台支持: 支持多种操作系统、云平台和网络设备。
  • 强大的编排:可以用于编排复杂的多阶段任务。

2、应用场景

  • 自动化配置和部署:可以用于自动化主机配置、应用程序部署和软件更新。
  • 一致性配置管理:确保多台主机的配置状态一致,避免手动操作引发的错误。
  • 自动化任务:可用于定期执行任务、文件传输、数据库备份等自动化操作。
  • 云环境管理:可以在平台上自动创建、配置和管理云资源。
  • 基础设施即代码:可以将基础设施定义为代码,实现自动创建和管理。

3、  使用例子

● 将目标主机纳入管理

了控制某主机,需要使用 Ansible 给目标主机配置公钥,通常需要具备目标主机的登录凭据,这包括 SSH 用户名和密码或 SSH 密钥。下边展示如何使用 Ansible 将公钥配置到目标主机上:

  • 在控制端生成SSH秘钥对

ssh-keygen -t rsa -b 4096 -C "xxxEmailAddr"

  • 将公钥配置到目标主机:

编写一个名为 `ssh_key_setup.yml` 的文件,内容如下:

- name: Setup SSH Public Key

  hosts: target_host  

  remote_user: remote_user  

  become: yes  # 使用 sudo 权限执行任务

  tasks:

    - name: Ensure ~/.ssh directory exists

      file:

        path: ~/.ssh

        state: directory

    - name: Add SSH public key to authorized_keys

      authorized_key:

        user: remote_user  # 替换为目标主机上的用户名

        key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"

(3)运行文件:打开终端,进入包含 `ssh_key_setup.yml` 文件的目录,运行命令:

ansible-playbook ssh_key_setup.yml --ask-pass

 

注:

  • 在这个示例中,`--ask-pass` 参数会要求输入目标主机的登录密码。如果想使用 SSH 密钥而非密码,可以使用 `--private-key` 参数来指定私钥文件。
  • 确保将 `target_host` 替换为要配置公钥的实际目标主机的主机名,将 `remote_user` 替换为目标主机上的实际用户名。

● 安装Nginx到目标主机上

公钥配置好后,下边演示如何通过 Ansible 自动安装一个基本的 Web 服务器(Nginx)到目标主机上。

(1)安装 Ansible: 首先,确保已经在控制节点上安装了 Ansible。

(2)创建 Ansible 剧本: 创建一个名为 `nginx_install.yml` 的文件,内容如下:

- name: Install Nginx

  hosts: target_host  # 替换成目标主机的主机名

  tasks:

    - name: Install Nginx package

      become: true  # 使用 sudo 权限执行任务

      apt:

        name: nginx

        state: present  # 安装 Nginx 软件包

(3) 运行剧本: 打开终端,进入包含 `nginx_install.yml` 文件的目录,运行命令:

ansible-playbook nginx_install.yml

(4)结果: Ansible 将会连接到目标主机,执行剧本中定义的任务。它会安装 Nginx 软件包并启动 Nginx 服务。

注:请确保将 `target_host` 替换为要部署到的实际目标主机的主机名。

三、  Agent方式

Agent 方式是一种自动化部署和管理的方法,通过在目标主机上安装代理软件来实现与中央管理端的通信和控制。

1、特点

  • 本地控制: 代理在目标主机上运行,使得本地控制和管理成为可能。这使得执行本地任务、操作和操作系统相关的配置更加灵活。
  • 复杂任务支持: Agent 可以在目标主机上执行复杂的任务、脚本和操作,而不需要将所有逻辑都从中央管理端传输。这对于分布式环境和复杂操作非常有用。
  • 实时监控: 代理可以定期向中央管理端报告状态和信息,从而实现实时监控、错误检测和故障排除。
  • 断网执行: 代理在目标主机上运行,即使网络断开,代理仍然可以继续执行预定任务,这对于不稳定的网络环境非常有用。
  • 隔离性: 每个代理可以在其本地环境中独立地执行任务,从而实现任务隔离,不同任务之间的影响较小。
  • 支持分布式环境: Agent 方式适用于分布式环境,可以在各个节点上运行代理,从而管理和控制不同位置的主机。
  • 定制性: 代理可以根据需求进行定制,允许你实现针对特定目标主机的特定配置和操作。
  • 安全性考虑: 需要注意的是,代理在目标主机上运行,因此需要确保代理的安全性,以免代理本身成为潜在的安全风险。

2、应用场景

  • 自动化部署和配置: 使用代理来实现自动化部署、配置文件管理和应用程序安装,可以在目标主机上执行必要的操作,确保一致性和可靠性。
  • 实时监控和报告: 代理可以定期向中央管理端报告主机的状态、性能指标和日志信息,帮助实时监控和问题排查。
  • 远程命令执行: 代理可以执行远程命令,使控制端可以在目标主机上执行各种操作,如文件操作、脚本执行等。
  • 安全漏洞修复: 使用代理可以在目标主机上自动执行安全漏洞修复操作,确保系统的安全性和合规性。
  • 配置管理和更新: 代理可以执行配置文件的修改和更新,确保系统的配置保持一致并满足要求。
  • 应用程序管理: 使用代理可以管理应用程序的生命周期,包括部署、启动、停止和升级等操作。
  • 分布式环境: 在分布式环境中,代理可以在不同的节点上运行,实现对多个主机的管理和控制。
  • 任务隔离: 代理可以实现任务隔离,使不同的任务在目标主机上独立运行,减少相互干扰。
  • 断网环境: 代理可以在目标主机上运行,即使网络断开,代理仍然可以执行任务,适用于不稳定的网络环境。
  • 实时配置管理: 使用代理可以实现实时配置的管理,可以快速地更新和调整配置。

3使用例子

这里演示,通过Java实现一个简单的Agent方式:

(1)"CustomAgent" 代理: 假设我们已经开发了一个 Java 类作为 "CustomAgent" 代理,它能够接收命令并在目标主机上执行。

import java.io.BufferedReader;

import java.io.InputStreamReader;

public class CustomAgent {

    public static void main(String[] args) {

        if (args.length != 1) {

            System.out.println("Usage: java CustomAgent <command>");

            System.exit(1);

        }

        String command = args[0];

        String result = executeCommand(command);

        System.out.println(result);

    }

    private static String executeCommand(String command) {

        try {

            Process process = Runtime.getRuntime().exec(command);

            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

            StringBuilder output = new StringBuilder();

            String line;

            while ((line = reader.readLine()) != null) {

                output.append(line).append("\n");

            }

            process.waitFor();

            return output.toString().trim();

        } catch (Exception e) {

            return "Command execution failed";

        }

    }

}

(2)在控制端,我们可以使用 Java 的 `ProcessBuilder` 类或其他方法与代理进行通信。下边演示如何通过 "CustomAgent" 代理执行远程命令并获取结果:

public class RemoteCommandExecutor {

    public static void main(String[] args) {

        String remoteCommand = "java CustomAgent hostname";

        String response = executeRemoteCommand(remoteCommand);

        System.out.println("Remote command response: " + response);

    }

    private static String executeRemoteCommand(String command) {

        try {

            Process process = Runtime.getRuntime().exec(command);

            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

            StringBuilder output = new StringBuilder();

            String line;

            while ((line = reader.readLine()) != null) {

                output.append(line).append("\n");

            }

            process.waitFor();

            return output.toString().trim();

        } catch (Exception e) {

            return "Command execution failed";

        }

    }

}

注:在这个示例中,我们可以通过执行控制端的 Java 类来与 "CustomAgent" 代理通信,发送命令获取主机名,并让代理返回结果。当然,实际中的代理可能需要更多、更复杂的通信能力和错误处理。

四、  对比

Ansible 和 Agent 方式都是自动化部署和管理的方式,但它们在实现方式和应用场景上有一些不同点。

Ansible方式:

  1. 中心化管理:Ansible 是一种中心化的管理工具,通过 SSH 协议连接到目标主机来执行任务,无需在目标主机上安装代理。
  2. 无代理:Ansible 无需在目标主机上安装代理,通过 SSH 协议直接执行任务,这降低了目标主机的复杂性和安全风险。
  3. 基于模块:Ansible 提供了丰富的模块,用于执行各种任务,如文件操作、软件安装、配置修改等。
  4. 声明性语言:Ansible 使用声明性的 YAML 文件来定义任务和配置,易于阅读和维护。
  5. 剧本和角色:Ansible 使用剧本(Playbooks)和角色(Roles)来组织任务和配置,实现可重用和模块化的管理。
  6. 幂等性:Ansible 的任务具有幂等性,可以多次执行而不会对系统状态造成影响。
  7. 适用场景:Ansible 适用于各种场景,特别是在配置管理、应用程序部署、自动化任务和基础设施编排等方面。

Agent 方式:

  1. 代理运行:Agent 方式需要在目标主机上安装代理软件,代理负责接收任务、执行操作和与中央管理端通信。
  2. 本地操作:代理可以在目标主机上执行本地操作,可以执行复杂任务和访问本地资源。
  3. 实时监控:代理可以定期向中央管理端报告状态和信息,实现实时监控和问题排查。
  4. 任务隔离:代理可以实现任务隔离,不同的代理可以在同一台主机上独立执行任务。
  5. 断网环境:代理可以在目标主机上运行,即使网络断开,代理仍然可以执行任务,适用于不稳定的网络环境。
  6. 适用场景:Agent 方式适用于需要在目标主机上执行本地任务、实时监控、复杂操作和分布式环境的场景。

总结: Ansible 通常适用于集中式、无代理的自动化管理,而 Agent 方式适用于需要在目标主机上执行本地操作和实时监控的场景,我们应该根据具体的场景选择不同的方式。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0