直到不了解Ansible的人變成可以在生產環境中使用的人的學習過程
也许有些人会认为现在才开始学习Ansible?!但是,我希望能够向那些尚未使用DevOps自动化工具的人介绍Ansible。
我认为这对初学者也会有帮助。
( 其实,我想让公司新人学习Ansible )
议程如下:
1. 什么是Ansible?
2. 关于Ansible的必要知识
3. Ansible的配置
4. Ansible实践
1. Ansible是什么?
以下是与其他工具相比,Ansible的优点:
– Ad-hoc支持
– 简单易用
– SSH(无需Agent)
– 不需要DSL(不需要Ruby开发者)
– 并行 provisiong支持
– 即插即用(可以使用和开发模块和插件)
?选用Ansible作为自动化工具的原因是DevOps经常使用它作为配置管理工具的原因。
2. 关于Ansible的必备知识
1) 敏捷运维
之前出现了几次“DevOps”这个关键词。在学习Ansible之前,需要具备关于DevOps的知识。DevOps是将持续交付机制拓展至运维的实现。
为了开发一个软件,需要有能够同时开发的环境,并且要面向数千个用户,还需要管理后台的基础设施,如服务器、存储以及运营体制。这就是运营人员的角色。
在这个情况下,开发人员希望引入一种新的框架来提高开发生产力并扩展系统。然而,运营人员更关注服务和软件的安全性,并因为担心安全性无法得到保障而避免使用。
在各自的过程中,使用各自的工具追求各自的目标,这就是为什么开发和运维会发生冲突。正是在这种背景下出现了DevOps。
DevOps是一种软件开发方法论,强调软件开发人员和IT从业人员之间的沟通、合作和融合,是软件开发和IT运营之间相互依赖关系的产物。
在组织中,DevOps角色的任务是为了帮助快速生产软件产品和服务。它的目的是协调开发和运维之间的目标,并共享对于流程和工具的接近方式,以减少差距。
通过引入此类自动化工具,可以在整个开发过程中根据进展情况自由地扩大或缩小所需环境,从开发到运营,极大地提供了系统扩展性。
2) 幂等性
如果在远程主机上进行了意外更改,通过Playbook的执行可以检测到这种更改。
通过保持具有幂等性的Playbook来维护。
您将能够实现持续的远程主机状态管理!
之后,在【4. Ansible 实践】中,我们将同时运行 Ansible,并观察每个任务模块的结果,若不是”changed”而是”ok”的地方,那就是实际执行幂等性的地方,让我们一起看看吧!
当然,Ansible中也存在一些不支持幂等性的模块。
其中包括shell、command和file模块。
我认为尽量避免使用这些模块更好。
3) 你未来会怎么样
4) 库存文件
Ansible可以同时对基础架构中的多个系统进行操作。
清单文件是用于列举Ansible操作的目标系统的文件。
当然,它不是必需的。
可以按照使用方式,仅列举主机并进行设置,
也可以指定组并列举主机进行设置,还有其他各种方便的追加选项。
默认的清单文件为/etc/ansible/hosts。
因为我使用除了Ansible以外的工具,比如Capistrano,所以在ssh配置中设置它们会很方便。
因此,我只在./ansible/host文件中列出了ssh配置的主机名,然后进行分组。
分组的好处是可以在清单文件中对多个主机进行分组,并自定义执行任务。
我们稍后会在【4. Ansible实践】中看到如何使用它们。
5) 手册 or 战略手册
#./playbook.yml
---
- name: web
become: true
hosts: all
user: fusic
vars_files:
- vars.yml
roles:
- common
- apache
- php
- postgresql
我认为一旦你看了【4. Ansible实践】的例子,就能立刻理解。
3. Ansible配置
如果计划解释构成,基本上在上面的【2. 关于Ansible的必要知识】已经提到了,剩下的我将从【4. Ansible实践】开始解释。
4. Ansible实践
实习环境是用Mac电脑。
・实习计划
※ 我们将在以下代码库中分享必要的实习资源:
?leedohyung-dba/ansible_study
1) 生成不同的服务器
点击进入详细页面后,有以下的引导方法:
不要直接执行,而是将我的存储库中的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
从现在开始,所有的操作都将在主机的虚拟机中进行。
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
3) 我们将为 web_a、web_b 和 db 的每个服务器配置 SSH 设置。
Note: The translation provided is in Simplified Chinese.
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
另外,让web_group的主机们尝试安装一个名为tree的工具。
ansible web_group -i host -m yum -a 'name=tree state=present' --sudo
如果不加入-m选项,默认模块将是Command。
ansible all -i host -a "/bin/echo hello"
您可以向本地主机发送命令。
ansible "127.0.0.1," -c local -m yum -a 'name=tree state=present' --sudo
即使没有存货文件,也可以直接使用ssh配置文件中的主机名。
ansible all -i "web_a," -a "/bin/echo hello"
5) 使用Playbook来进行服务器构建
我会简要地解释其中的构成。
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
很不错的感觉呢。接下来我们尝试搭建数据库服务器。
ansible-playbook -i host db.yml
・已构建的网络服务器运行风格
接下来,使用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
安装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
※ 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
// ./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),
],
],
确认可以看到已经完成了CakePHP3应用程序的设置和准备工作。
最后创建一个表格,使用back函数生成基本的留言板页面。
bin/cake bake all users
如果一个服务器宕机了,就会立即启动另一个服务器,就像双重服务器一样,哈哈!
嗯!感觉不错呢〜 (En! ne〜)
在构图中显示了将任务备份到AWS S3。但是,根据任务内容,我们努力实现了这一点。为了让大家都能变得熟悉Playbook,请努力理解!
以上、有点冗长,但这是一篇关于那些不了解Ansible的人如何成为能在生产环境中使用它的人的学习文章。
(我努力用日语写了一下,但文档可能仍然充满了语法问题…)
谢谢!??