Elastic:如何使用 Ansible自动化部署 Elastic Stack - Overview(一)

在今天的文章中,我将一步一步地介绍如何使用 Ansible 来自动化部署 Elastic Stack。对于对 Ansible 还不是很熟的开发者来说,可以通过本教程对 Ansible 有一个初步的了解。这是一个系列的文章:

到最后,你可以找到所有的部署文件:https://github.com/liu-xiao-guo/elk-ansible

 

什么是 Ansible?

Ansible 是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible 是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是 ansible 所运行的模块,ansible 只是提供一种框架。ansible 不需要在远程主机上安装 client/agents,因为它们是基于 ssh 来和远程主机通讯的。ansible 目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。

 

在今天的实验中,我将使用一个本地的 Mac OS 及一个 本地的 Ubuntu OS 20.04 来进行展示。在实际的使用中,你可以使用云上的服务器来进行操作,虽然部署稍微有所不同。

我将在 Mac OS 上安装 Ansible。我将使用 Ansible 通过远程将 Webserver, Elasticsearch 及 Kibana 部署到 Ubuntu OS 机器上。

 

安装 Ansible

在  Mac OS 上安装 Ansible 非常之简单。我们首先必须安装 Python,然后我们可以使用如下的命令来进行安装:

pip3 install ansible

等安装过后,我们可以使用如下的命令来查看 ansible 的帮助信息:

ansible --help

 

建立 ssh 连接

远程安装是使用 ssh 实现的。为了能够使得 ansible 能够正常工作,我们必须把本地的 ssh 的证书拷贝到远程的机器上, 这样使得在通信的时候,不再需要密码。针对一些云平台,我们可以把本地  ansible 的机器的证书复制到相关的配置即可。如果你还没有自己的 ssh 配置,请在你的机器上按照如下的步骤来生成证书。针对我的情况,我在 MacOS 机器上先使用如下的命令来生产 ssh 证书:

ssh-keygen

上面的命令将在本机的 .ssh 目录中生成如下的证书:

$ pwd
/Users/liuxg/.ssh
$ ls
id_rsa.pub   id_rsa     

在上面,我们可以看到新生成的 id_rsh.pub 以及 id_rsa 证书。其中 id_rsh.pub 是公钥证书。我们使用如下的命令把该证书拷贝到 Ubuntu OS 的机器中:

ssh-copy-id remote_user@remote_IP

针对我的情况,我在 MacOS 机器上运行如下的命令:

ssh-copy-id liuxg@ubuntu

在上面, liuxg 是我在 Ubuntu OS 上的账号。

$ ssh-copy-id liuxg@ubuntu
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
liuxg@ubuntu's password: 

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh 'liuxg@ubuntu'"
and check to make sure that only the key(s) you wanted were added.

通过上面的命令,我们可以在 Ubuntu OS 的 .ssh 目录中查看大如下的一个叫作 authorized_keys 的文件:

$ cd .ssh
$ pwd
/home/liuxg/.ssh
liuxg@liuxgu:~/.ssh$ ls
authorized_keys  id_rsa.pub  id_rsa 

可以打开这个文件。你可以看到它和在 Mac OS  里的 id_rsa.pub 里的内容是完全一样的。这说明 Mac OS 上的证书已经被成功拷贝过来了。

紧接着,我们在 Mac OS 机器上打入如下的命令:

ssh liuxg@ubuntu

从上面我们可以看出来,我们没有输入任何的密码就可以直接登录 Ubuntu OS 的机器了。这说明我们的配置是成功的。

 

小试牛刀 - 部署一个 Webserver

在这节中,我们将使用 ansible 从 MacOS 部署一个 apache 的 Webserver 到 Ubuntu 机器中。

对于 ansible 还不是很熟的开发者来说,我们先来部署一个简单的 Webserver 来熟悉一下 ansible 的部署。首先我们创建一个如下的目录:

cd
mkdir -p ansible/elasticsearch
cd ansible/elasticsearch

在上面,我们在用户的 home 目录中创建一个叫做 ansible/elasticsearch 的目录。这个目录就是我们的 elasticsearch 项目的工作目录。在这个目录下,我们先创建一个叫做 inventory 的子目录,并在这个目录下创建一个叫做 hosts.yml 的文件。hosts.yml 文件的内容如下:

inventory/hosts.yml

[elk]
192.168.0.4

[webservers]
192.168.0.4

[all]
192.168.0.4

在上面,你可以依据自己的配置修改上面的 IP 地址。如上图所示,我将部署 ELK 到 elk 所描述的服务器上,同时,我将部署 Webserver 到  webservers 所表示的服务器上。如果我们想把一个配置部署到所有的机器上,我们可以选择 all。这里的服务是一个列表,我们可以添加更多的服务器单上面的列表中。

我们同时也在 elasticsearch 目录下创建另外两个子目录:playbooks 及 roles:

$ pwd
/Users/liuxg/ansible/elasticsearch
$ ls
inventory playbooks roles

接下来,我们进入 roles 目录,并打入如下的命令:

$ pwd
Users/liuxg/ansible/elasticsearch/roles
$ ansible-galaxy init webserver

这样在 roles 目录下就生产了一个叫做 webserver 的子目录:

在 webserver 的目录中,它创建了一个模板目录及文件。我们打开 files 子目录,并创建一个如下的文件:

index.html

<html>
    <body>
        <h1>This is a sample web page</h1>
    </body>
</html>

上面的 index.html 文件就是将来我们在 apache 服务器启动后所需要展示的文件。接下来,我们打开 tasks 文件目录:

我们打开 main.yml 文件,并输入如下的内容:

main.yml

---
# tasks file for webserver

- name: install apache2
  apt: 
    name: apache2
    state: latest
    update_cache: yes

- name: deploy index.html
  copy:
    src: index.html
    dest: /var/www/html/index.html

- name: starting apache2
  service:
    name: apache2
    state: started
    enabled: yes

如上所示,在 main.yml 文件中,我们创建了三个 task。在上面的 name 中它显示了任务的内容。这个名字是描述性的,供我们自己参考。在每个 task 下面,有执行的命令。这些命令组成了需要完成的功能。在上面,我们做了三件事:

  1. 安装最新的 apache2
  2. 把本地的 index.html 文件拷贝到目标机器的相应目录中
  3. 启动 apache 服务,从而使得 web server 正常工作

接下来,我们在 playbooks 目录下创建一个叫做 deploy-webserver.yml 的文件:

deploy-webserver.yml

---
# This playbook will deploy webserver
- hosts: webservers
  become: yes
  roles: 
  - ../roles/webserver

如上所示,我们将把 webserver 部署到 webservers 所描述的服务器中。这些 webservers 是我们在之前介绍的 inventory/hosts.yml 中描述的。这个 playbook 将使用 roles/webserver 角色。

接下来,我们使用如下的命令来部署 webserver:

ansible-playbook -K -i inventory/hosts.yml playbooks/deploy-webserver.yml

请注意在上面我们使用 -K 参数。这个是因为在远程机器 Ubuntu OS 上,安装时需要我们提供 sudo 命令的密码才可以完成。如果你想不输入密码,你可以参考文章 “How to set and use sudo password for Ansible Vault”。

上面命令的显示结果为:

上面显示所有的命令运行是成功的。

我们可以在 MacOS 电脑的浏览器中打入如下的命令来检查我们的 apache 服务器是否已经安装成功了 http://ubuntu:80:

上面显示我们的 apache 服务器已经完全成功了。通过这个简单的教程,我们了解了如何使用 ansible 来进行远程部署。

到目前为止,我们已经成功地部署了一个 webserver。我们回顾一个整个步骤:

  1. 安装 ansible
  2. 创建 hosts.yml 文件
  3. 创建 roles,并更新 tasks
  4. 创建 playbook
  5. 部署

在接下来教程中,我们将按照上面的步骤来分别安装 Elasticsearch。请阅读文章 “如何使用 Ansible自动化部署 Elastic Stack (二)”。

参考:

【1】elastic/ansible-elasticsearch

 

已标记关键词 清除标记