直到不了解Ansible的人變成可以在生產環境中使用的人的學習過程

也许有些人会认为现在才开始学习Ansible?!但是,我希望能够向那些尚未使用DevOps自动化工具的人介绍Ansible。

我认为这对初学者也会有帮助。
( 其实,我想让公司新人学习Ansible )

议程如下:
1. 什么是Ansible?
2. 关于Ansible的必要知识
3. Ansible的配置
4. Ansible实践

1. Ansible是什么?

image.png

以下是与其他工具相比,Ansible的优点:
– Ad-hoc支持
– 简单易用
– SSH(无需Agent)
– 不需要DSL(不需要Ruby开发者)
– 并行 provisiong支持
– 即插即用(可以使用和开发模块和插件)

?选用Ansible作为自动化工具的原因是DevOps经常使用它作为配置管理工具的原因。

2. 关于Ansible的必备知识

1) 敏捷运维

之前出现了几次“DevOps”这个关键词。在学习Ansible之前,需要具备关于DevOps的知识。DevOps是将持续交付机制拓展至运维的实现。

为了开发一个软件,需要有能够同时开发的环境,并且要面向数千个用户,还需要管理后台的基础设施,如服务器、存储以及运营体制。这就是运营人员的角色。

在这个情况下,开发人员希望引入一种新的框架来提高开发生产力并扩展系统。然而,运营人员更关注服务和软件的安全性,并因为担心安全性无法得到保障而避免使用。

在各自的过程中,使用各自的工具追求各自的目标,这就是为什么开发和运维会发生冲突。正是在这种背景下出现了DevOps。

image.png

DevOps是一种软件开发方法论,强调软件开发人员和IT从业人员之间的沟通、合作和融合,是软件开发和IT运营之间相互依赖关系的产物。

在组织中,DevOps角色的任务是为了帮助快速生产软件产品和服务。它的目的是协调开发和运维之间的目标,并共享对于流程和工具的接近方式,以减少差距。

通过引入此类自动化工具,可以在整个开发过程中根据进展情况自由地扩大或缩小所需环境,从开发到运营,极大地提供了系统扩展性。

2) 幂等性

image.png

如果在远程主机上进行了意外更改,通过Playbook的执行可以检测到这种更改。

通过保持具有幂等性的Playbook来维护。

您将能够实现持续的远程主机状态管理!

之后,在【4. Ansible 实践】中,我们将同时运行 Ansible,并观察每个任务模块的结果,若不是”changed”而是”ok”的地方,那就是实际执行幂等性的地方,让我们一起看看吧!

当然,Ansible中也存在一些不支持幂等性的模块。
其中包括shell、command和file模块。
我认为尽量避免使用这些模块更好。

3) 你未来会怎么样

image.png

4) 库存文件

Ansible可以同时对基础架构中的多个系统进行操作。
清单文件是用于列举Ansible操作的目标系统的文件。
当然,它不是必需的。
可以按照使用方式,仅列举主机并进行设置,
也可以指定组并列举主机进行设置,还有其他各种方便的追加选项。
默认的清单文件为/etc/ansible/hosts。

因为我使用除了Ansible以外的工具,比如Capistrano,所以在ssh配置中设置它们会很方便。
因此,我只在./ansible/host文件中列出了ssh配置的主机名,然后进行分组。
分组的好处是可以在清单文件中对多个主机进行分组,并自定义执行任务。
我们稍后会在【4. Ansible实践】中看到如何使用它们。

5) 手册 or 战略手册

image.png
#./playbook.yml
---
- name: web
  become: true
  hosts: all
  user: fusic
  vars_files:
    - vars.yml
  roles:
    - common
    - apache
    - php
    - postgresql

我认为一旦你看了【4. Ansible实践】的例子,就能立刻理解。

3. Ansible配置

image.png

如果计划解释构成,基本上在上面的【2. 关于Ansible的必要知识】已经提到了,剩下的我将从【4. Ansible实践】开始解释。

4. Ansible实践

实习环境是用Mac电脑。

・实习计划

image.png

※ 我们将在以下代码库中分享必要的实习资源:
?leedohyung-dba/ansible_study

1) 生成不同的服务器

image.png

点击进入详细页面后,有以下的引导方法:
不要直接执行,而是将我的存储库中的vagrant/Vagrantfile文件复制到您的目录中,并将其中box的名称更改为在Vagrant Cloud中找到的box名称,然后再执行。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.define "host" do |node|
    node.vm.box = "geerlingguy/centos7"
    node.vm.hostname = "host"
    node.vm.network :private_network, ip: "192.168.43.51"
  end

  config.vm.define "web.a" do |node|
    node.vm.box = "geerlingguy/centos7"
    node.vm.hostname = "web.a"
    node.vm.network :private_network, ip: "192.168.43.52"
  end

  config.vm.define "web.b" do |node|
    node.vm.box = "geerlingguy/centos7"
    node.vm.hostname = "web.b"
    node.vm.network :private_network, ip: "192.168.43.53"
  end

  config.vm.define "db" do |node|
    node.vm.box = "geerlingguy/centos7"
    node.vm.hostname = "db"
    node.vm.network :private_network, ip: "192.168.43.55"
  end

  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--cableconnected1", "on"]
  end
end
vagrant up
image.png
image.png

从现在开始,所有的操作都将在主机的虚拟机中进行。

2) 在主机服务器上安装Ansible。

在访问Host服务器的ssh之后,安装附加软件包EPEL。

# ssh アクセス
vagrant ssh host

# EPELインストール
wget https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

# 有効にする
sudo rpm -Uvh epel-release-6-8.noarch.rpm

然后,使用yum来安装Ansible。

# Ansibleインストール
sudo yum -y install ansible

# バージョン確認
ansible --version
image.png

3) 我们将为 web_a、web_b 和 db 的每个服务器配置 SSH 设置。

Note: The translation provided is in Simplified Chinese.

image.png

4) Ansible指令

Ansible命令有以下两个选项:
– ansible: 是用于定义主机状态的命令。
– ansible-playbook: 是将状态定义为主机Playbook的命令。
* 详细使用方法可参考文档。

首先,让我们试试使用ansible命令。
我们将创建一个ansible目录来进行学习,
在其中生成一个名为host的清单文件。

[web_group]
web_a
web_b

[db_group]
db

※ 默认的清单文件:/etc/ansible/hosts

让我们向每个主机进行Ping测试。

ansible all -i host -m ping
image.png

另外,让web_group的主机们尝试安装一个名为tree的工具。

ansible web_group -i host -m yum -a 'name=tree state=present' --sudo
image.png

如果不加入-m选项,默认模块将是Command。

ansible all -i host -a "/bin/echo hello"
image.png

您可以向本地主机发送命令。

ansible "127.0.0.1," -c local -m yum -a 'name=tree state=present' --sudo
image.png

即使没有存货文件,也可以直接使用ssh配置文件中的主机名。

ansible all -i "web_a,"  -a "/bin/echo hello"
image.png

5) 使用Playbook来进行服务器构建

image.png

我会简要地解释其中的构成。

Ansible剧本的组织结构

.
├── host  ? 【インベントリファイル】
├── db.yml  ? 【DBサーバのPlaybook】
├── web.yml  ? 【WEBサーバのPlaybook】
├── roles  ? 【それぞれの状態定義(タスク)があるroleたち】
│   ├── apache
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── ...
│   ├── aws-cli
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── ...
│   ├── common
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── ...
│   ├── php
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── ...
│   └── postgresql
│       ├── tasks
│       │   └── main.yml
│       └── ...
└── vars.yml  ? 【交通で使う変数定義】

根据上面的【2.Ansible相关知识】介绍,我们有各种Playbook,每个Playbook包含一个或多个play。
而play的目的是将每个主机的特定角色和任务进行映射。
现在我来解释一下web.yml的Playbook。

---
- name: web
  # Ansible1.9からはsudo/suの代わりにbecomeを使う
  become: true
  # webグループだけにタスクする
  hosts: web_group
  user: vagrant
  vars_files:
    - vars.yml
  roles:
    - common
    - apache
    - php

我們定義了執行權限、主機(群組)、使用者、編輯以及角色。

我在Playbook和每个状态定义文件(任务)中详细地解释了正在做什么的说明注释,请您查看。如果您不了解模块的使用方法,请查阅文档。例如,关于copy模块,可以参考?这里的内容…

如果您自行更改了vars.yml文件中定义的main_username等内容后,
在您大致理解其他部分的情况下,我会感到非常高兴。

使用Ansible进行服务器建设。

好的,首先我们来构建 web_a 服务器和 web_b 服务器。

ansible-playbook -i host web.yml
image.png

很不错的感觉呢。接下来我们尝试搭建数据库服务器。

ansible-playbook -i host db.yml
image.png

・已构建的网络服务器运行风格

接下来,使用Ansible命令将./index.php文件部署到每台Web服务器上,并确认其是否正常运行。
※尽管可以通过scp、mount等简单完成,但出于练习的目的。

ansible all -i "web_a," -m template -a "src=./index.php dest=/var/www/html/index.php owner=lee group=lee" --extra-vars '{"host_name":"WEB_A"}'  --sudo
ansible all -i "web_b," -m template -a "src=./index.php dest=/var/www/html/index.php owner=lee group=lee" --extra-vars '{"host_name":"WEB_B"}'  --sudo
image.png

安装CakePHP3应用程序并对数据库服务器进行操作测试。

下一步,我们来尝试在每个Web服务器上安装CakePHP3的框架吧!

但是,在此之前,有几个关于Ansible的改进事项是必要的。
这些事项如下:

为了使外部能够访问DB服务器,需要在postgresql.conf文件中添加以下行来进行设置。

#./ansible/roles/postgresql/files/postgresql.conf

...
listen_addresses = '*'
...

在pg_hba.conf中添加以下行。

#./ansible/roles/postgresql/templates/pg_hba.conf2.j2

...
host all all 0.0.0.0/0 trust

然后,我们要生成数据库吗?我会添加以下行。

#./ansible/roles/postgresql/tasks/main.yml

...
# データベースを作成
- name: create database
  become: true
  become_user: postgres
  postgresql_db: name={{ db_name }} login_password={{db_user_password}} 
#./ansible/vars.yml

...
db_name: ansible_std
...

随后,在重新运行ansible时,只会对添加的部分进行修改(幂等性?)。

ansible-playbook -i host db.yml
image.png
※ ansibleコマンドにはテストするための-Cオプションがあります。
実際は反映しなく、状態定義の実装に失敗があるか確認するための目的です。
ansibleは残念ながら失敗した時、失敗する前のやつがRollBackされないです。
なので、冪等性がないモジュールが含めているTaskでしたら、
一回テストすることをオススメします。

现在我们已经准备好了环境,接下来要部署CakePHP应用程序。
在每个Web服务器上安装CakePHP3框架如下所示。
然后,我们可以直接在web_a和web_b上进行操作。
虽然使用Ansible也可以完成以下任务,但由于这是应用程序配置而非环境配置,
因此使用其他工具如Capistrano可能更为合适。

# composer.phar設置
curl -s http://getcomposer.org/installer | php

# CakePHPアプリケーション設置
php composer.phar create-project --prefer-dist cakephp/app lee
image.png
// ./lee/config/app.php

'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Postgres',
        'persistent' => false,
        'host' => '192.168.43.55',
        'port' => '5432',
        'username' => 'postgres',
        'password' => '1q2w3e',
        'database' => 'ansible_std',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'flags' => [],
        'cacheMetadata' => true,
        'log' => false,
        'quoteIdentifiers' => false,
        'url' => env('192.168.43.55', null),
    ],
],
image.png

确认可以看到已经完成了CakePHP3应用程序的设置和准备工作。

最后创建一个表格,使用back函数生成基本的留言板页面。

bin/cake bake all users
image.png
image.png

如果一个服务器宕机了,就会立即启动另一个服务器,就像双重服务器一样,哈哈!

image.png

嗯!感觉不错呢〜 (En! ne〜)

在构图中显示了将任务备份到AWS S3。但是,根据任务内容,我们努力实现了这一点。为了让大家都能变得熟悉Playbook,请努力理解!

以上、有点冗长,但这是一篇关于那些不了解Ansible的人如何成为能在生产环境中使用它的人的学习文章。

(我努力用日语写了一下,但文档可能仍然充满了语法问题…)
谢谢!??

广告
将在 10 秒后关闭
bannerAds