Ansible实现高可用基础设施搭建与配置
立即解锁
发布时间: 2025-08-24 00:22:11 阅读量: 1 订阅数: 3 


Ansible for DevOps:服务器和配置管理的最佳实践
# Ansible 实现高可用基础设施搭建与配置
## 1. 配置所有服务器的主剧本
为了实现整体配置,我们需要一个包含每个特定组剧本的简单剧本。在项目的根目录下创建 `configure.yml`,内容如下:
```yaml
---
- import_playbook: playbooks/varnish/main.yml
- import_playbook: playbooks/www/main.yml
- import_playbook: playbooks/db/main.yml
- import_playbook: playbooks/memcached/main.yml
```
如果已经有一些已启动的服务器,并且静态定义了库存组,如 `lamp_www`、`lamp_db` 等,就可以运行 `ansible-playbook configure.yml` 来准备好完整的高可用基础设施。
## 2. 获取所需角色
Ansible 允许在 `requirements.yml` 文件中为给定项目定义所有必需的 Ansible Galaxy 角色。在项目根目录下创建 `requirements.yml`,内容如下:
```yaml
---
roles:
- name: geerlingguy.firewall
- name: geerlingguy.repo-epel
- name: geerlingguy.varnish
- name: geerlingguy.apache
- name: geerlingguy.php
- name: geerlingguy.php-mysql
- name: geerlingguy.php-memcached
- name: geerlingguy.mysql
- name: geerlingguy.memcached
```
为确保所有必需的依赖项都已安装,在项目根目录下运行 `ansible-galaxy install -r requirements.yml`。
## 3. 通过 VirtualBox 进行本地基础设施的 Vagrantfile 配置
我们可以使用 Vagrant 和 VirtualBox 在本地构建和配置基础设施,这样可以免费进行多次测试,并且由于一切都在本地专用网络上编排,通常会有更快的测试周期。
### 3.1 Vagrantfile 基本布局
1. 定义一个基础盒子(这里是 CentOS 7)和 VM 硬件默认值。
2. 定义要构建的所有 VM,并配置特定于 VM 的 IP 地址和主机名。
3. 与最后一个 VM 一起定义 Ansible 预配器,以便 Ansible 可以在 Vagrant 构建周期结束时运行一次。
### 3.2 Vagrantfile 代码
```ruby
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
# Base VM OS configuration.
config.vm.box = "geerlingguy/centos7"
config.ssh.insert_key = false
config.vm.synced_folder '.', '/vagrant', disabled: true
# General VirtualBox VM configuration.
config.vm.provider :virtualbox do |v|
v.memory = 512
v.cpus = 1
v.linked_clone = true
v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
v.customize ["modifyvm", :id, "--ioapic", "on"]
end
# Varnish.
config.vm.define "varnish" do |varnish|
varnish.vm.hostname = "varnish.test"
varnish.vm.network :private_network, ip: "192.168.2.2"
end
# Apache.
config.vm.define "www1" do |www1|
www1.vm.hostname = "www1.test"
www1.vm.network :private_network, ip: "192.168.2.3"
www1.vm.provision "shell",
inline: "sudo yum update -y"
www1.vm.provider :virtualbox do |v|
v.customize ["modifyvm", :id, "--memory", 512]
end
end
# Apache.
config.vm.define "www2" do |www2|
www2.vm.hostname = "www2.test"
www2.vm.network :private_network, ip: "192.168.2.4"
www2.vm.provision "shell",
inline: "sudo yum update -y"
www2.vm.provider :virtualbox do |v|
v.customize ["modifyvm", :id, "--memory", 512]
end
end
# MySQL.
config.vm.define "db1" do |db1|
db1.vm.hostname = "db1.test"
db1.vm.network :private_network, ip: "192.168.2.5"
end
# MySQL.
config.vm.define "db2" do |db2|
db2.vm.hostname = "db2.test"
db2.vm.network :private_network, ip: "192.168.2.6"
end
# Memcached.
config.vm.define "memcached" do |memcached|
memcached.vm.hostname = "memcached.test"
memcached.vm.network :private_network, ip: "192.168.2.7"
# Run Ansible provisioner once for all VMs at the end.
memcached.vm.provision "ansible" do |ansible|
ansible.playbook = "configure.yml"
ansible.inventory_path = "inventories/vagrant/inventory"
ansible.limit = "all"
ansible.extra_vars = {
ansible_user: 'vagrant',
ansible_ssh_private_key_file: "~/.vagrant.d/insecure_private_key"
}
end
end
end
```
### 3.3 Ansible 预配器配置的重要值
- `ansible.inventory_path`:定义 `ansible.playbook` 的库存文件。由于我们提前知道 IP 地址,并且期望一些特殊的库存组名,因此手动为 Vagrant 预配构建库存文件更简单。
- `ansible.limit`:设置为 `all`,以便 Vagrant 知道应该连接到所有 VM 运行 Ansible 剧本,而不仅仅是当前 VM。
- `ansible.extra_vars`:包含 Ansible 的 Vagrant SSH 用户配置。
### 3.4 创建 Vagrant 库存文件
在运行 `vagrant up` 之前,需要在 `inventories/vagrant/inventory` 为 Vagrant 创建一个库存文件:
```ini
[lamp_varnish]
192.168.2.2
[lamp_www]
192.168.2.3
192.168.2.4
[a4d.lamp.db.1]
192.168.2.5
[lamp_db]
192.168.2.5 mysql_replication_role=master
192.168.2.6 mysql_replication_role=slave
[lamp_memcached]
192.168.2.7
```
现在,进入项目根目录,运行 `vagrant up`,大约十到十五分钟后,在浏览器中加载 `http://192.168.2.2/`,就可以看到高可用基础设施成功搭建。
## 4. DigitalOcean 预配器配置
### 4.1 创建 DigitalOcean 剧本
为了灵活性,在 `provisioners/digitalocean.yml` 中创建一个 DigitalOcean 水滴的剧本。剧本开头如下:
```yaml
---
- hosts: localhost
connection: local
gather_facts: fa
```
0
0
复制全文
相关推荐









