代码架构_如何将基础架构用作代码

代码架构

我之前关于建立家庭实验室的文章描述了建立个人实验室以学习新技术的许多选择。 无论您选择哪种解决方案,随着服务器和应用程序的增长,如果您无法建立控制权,则维护和跟踪它们的难度将越来越大。 为避免这种情况,将基础架构视为代码是必不可少的。

本文介绍有关基础结构即代码(IaC)最佳实践的内容,并包括一个示例项目,该项目可自动部署两个虚拟机(VM),并在实施这些实践时安装KeepalivedNginx 。 您可以在GitHub上找到该项目的所有代码

为什么IaC很重要? 我的脚本还不够吗?

不,脚本还不够。 随着时间的流逝,脚本变得难以维护且难以跟踪。 IaC可以帮助您保持一致性和可伸缩性,同时节省大量时间(如果您手动执行每个任务会浪费时间)。

手动或部分自动管理服务器的文化中的问题之一是缺乏一致性和控制能力,这常常导致配置漂移和对应用程序或服务器的无证更改。 如果必须更换服务器或虚拟机,则手动安装每个软件并进行每一个配置都非常耗时。

使用IaC,通常可以从一个集中位置配置,部署和配置数百台服务器,并且可以在版本控制系统中跟踪每个配置。 如果必须修改配置文件,而不是连接到每个服务器,则可以在本地更改该文件,并将代码推送到版本控制系统。 扩大或更换损坏的服务器也是如此。 整个基础架构是集中管理的,所有代码都保存在版本控制存储库(如Git)中,而服务器所需的任何更改都仅使用此代码即可完成。 不再有独特的独角兽! (对不起,独角兽!)

IaC的主要优势之一是与JenkinsCI / CD工具的集成,使您可以进行更多测试,并创建部署管道,以自动将应用程序版本从一种环境迁移到另一种环境。

那么,你如何开始呢?

首先,对服务器所需的每个应用程序,服务和配置进行清点; 查看安装的每个软件,收集配置文件,验证其参数,然后找到可在其中复制服务器的位置。

确定所需的一切后,请记住:

  • 使用版本控制; 应该使用版本控制来跟踪所有内容。
  • 编写所有代码; 不应手动执行任何操作。 使用代码描述所需的状态。
  • 幂等。 无论执行多少次,您编写的代码中的每个结果都应始终产生相同的结果。
  • 使您的代码模块化。
  • 测试,测试,测试
  • 再次:使用版本控制。 永远不要忘记这一点。

先决条件

您需要两个安装了CentOS 7的虚拟机。 使用密钥的SSH登录应该可以正常工作。

创建一个名为homelab的目录。 这将是您的工作目录,本教程将其称为$ PWD 。 在此目录中创建另外两个目录: rolegroup_vars


   
   
$ mkdir -p homelab / { roles,group_vars }
$ cd homelab

版本控制

第一个最佳实践是始终跟踪所有内容:自动化,配置文件,模板。 像Git这样的版本控制系统,通过提供一个集中的存储库,可以在其中找到所有代码,配置,模板等,从而使用户易于协作。 它还使用户可以查看或还原文件的旧版本。

如果您没有,请在GitHub或GitLab上创建一个帐户(或使用您选择的任何其他版本控制提供程序)。

$ PWD中 ,初始化您的Git存储库:


   
   
$ echo "# IaC example" >> README.md
$ git init
$ git add README.md
$ git commit -m "First commit"
$ git remote add origin < your Git URL >
$ git push -u origin master

编码一切

IaC的主要思想是使用代码尽可能多地管理所有基础架构。 服务器,应用程序或配置中所需的任何更改都必须在代码中定义。 可以将配置文件转换为模板,以实现更大的灵活性和可重用性。 特定于应用程序或服务器的设置也必须编码,通常在变量文件中。

创建自动化程序时,记住幂等性至关重要:无论代码执行多少次,它都应始终具有相同的结果。 相同的输入,相同的结果。 例如,编写一段修改文件的代码时,必须确保如果再次执行相同的代码,则文件外观将相同。

以下步骤是自动的,并且代码是幂等的。

模块化

在将基础结构作为代码编写时,必须考虑可重用性。 您编写的大多数代码应该是可重用和可伸缩的。

编写Ansible角色时,最好的方法是遵循Unix的哲学:“编写能做一件事并做得很好的程序。” 因此,创建多个角色,每个软件一个角色:1)一个“基础”或“通用”角色,可为每个VM做好准备,而不论其用途如何; 2)安装和配置Keepalived的角色(用于高可用性); 3)安装和配置Nginx(Web服务器)的角色。 此方法允许将每个角色重用于不同类型的服务器,并在将来节省大量代码。

创建基本角色

部署虚拟机后,该角色将为虚拟机准备所需的所有步骤。 考虑每个服务器所需的任何配置或软件; 他们应该进入这个模块。 在此示例中,基本角色将:

  • 更改主机名
  • 安装安全更新
  • 启用EPEL并安装实用程序
  • 自定义欢迎消息

$ PWD / roles中创建基本角色骨架:

 $  ansible-galaxy init --offline base 

该角色的主文件是$ PWD / roles / base / tasks / main.yml 。 用以下内容进行修改:


   
   
---
# We set the hostname to the value in the inventory
- name
: Change hostname
  hostname
:
    name
: "{{ inventory_hostname }}"

- name
: Update the system
  yum
:
    name
: "*"
    state
: latest

- name
: Install basic utilities
  yum
:
    name
: [ 'epel-release', 'tmux', 'vim', 'wget', 'nfs-utils' ]
    state
: present

- name
: Copy motd
  template
:
    src
: motd.j2
    dest
: /etc/motd

通过创建文件$ PWD / roles / base / templates / motd.j2创建将替换/ etc / motd的模板文件


   
   
UNAUTHORIZED ACCESS TO THIS DEVICE IS PROHIBITED

You must have explicit, authorized permission to access or configure "{{ inventory_hostname }}". Unauthorized attempts and actions to access or use this system may result in civil and/or criminal penalties. All activities performed on this device are logged and monitored.

此代码中的每个任务都是幂等的。 无论执行代码多少次,它始终会产生完全相同的结果。 注意如何修改/ etc / motd 。 如果通过添加或附加内容(而不是使用模板)修改了文件,则幂等规则将失败,因为每次执行时都会添加新行。

创建Keepalived角色

您可以创建一个同时包含KeepalivedNginx的角色。 但是,如果您需要在没有Web服务器的情况下安装Keepalived,会发生什么情况? 代码必须重复,浪费时间,精力和简单性。 将角色保持在最小限度和直截了当的方法。

自动化代码应始终处理配置文件,以便可以在版本控制系统中对其进行跟踪。 但是,当每个主机的设置可以具有不同的值时,如何处理配置文件? 使用模板! 模板允许您使用变量和事实,从而为您带来灵活性和统一性。

$ PWD / roles中创建Keepalived角色骨架:

 $  ansible-galaxy init --offline keepalived 

修改主任务文件$ PWD / roles / keepalived / tasks / main.yml ,如下所示:


   
   
---
- name
: Install keepalived
  yum
:
    name
: "keepalived"
    state
: latest

- name
: Configure keepalived with the right settings
  template
:
    src
: keepalived.j2
    dest
: /etc/keepalived/keepalived.conf
  notify
: restart keepalived

$ PWD /角色/keepalived/handlers/main.yml


   
   
---
# handlers file for keepalived
- name
: restart keepalived
  service
:
    name
: keepalived
    enabled
: yes
    state
: restarted

并创建配置模板文件$ PWD / roles / keepalived / templates / keepalived.j2


   
   
#### File handled by Ansible.

vrrp_script chk_nginx {
  script "pidof nginx" # check the nginx process
  interval 2 # every 2 seconds
  weight 2 # add 2 points if OK
}

vrrp_instance LAB {
  interface { { keepalived_nic } } # interface to monitor
  state { { keepalived_state } }
  virtual_router_id { { keepalived_vri } }
  priority { { keepalived_priority } }
  virtual_ipaddress {
    { { keepalived_vip } }
  }
  track_script {
    chk_nginx
  }
}

Keepalived配置文件已转换为模板。 它是典型的Keepalived配置文件,但不是参数化硬编码值,而是参数化的。

在自动化基础结构和配置文件时,至关重要的是仔细分析应用程序配置文件,注意在整个环境中哪些值相同,并且每个服务器唯一的设置。 同样,每次处理模板时,它都应产生相同的结果。 创建变量,使用Ansible事实; 这增加了模块化和灵活性。

创建Nginx角色

这个简单的角色将使用模板来安装和配置Nginx,遵循上面讨论的相同原理。 模板将用于此角色,以使用主机的互联网协议(IP)生成index.html 。 也可以使用其他事实

修改主任务文件$ PWD / roles / nginx / tasks / main.yml ,如下所示:


   
   
---
# tasks file for nginx
- name
: Install nginx
  yum
:
    name
: 'nginx'
    state
: 'latest'
  notify
: start nginx

- name
: Create web directory
  file
:
    path
: /var/www
    state
: directory
    mode
: '0755'

- name
: Create index.html
  template
:
    src
: index.html.j2
    dest
: /var/www/index.html

- name
: Configure nginx
  template
:
    src
: lb.conf.j2
    dest
: /etc/nginx/conf.d/lb.conf
  notify
: restart nginx

修改主任务文件$ PWD / roles / nginx / handlers / main.yml ,如下所示:


   
   
---
- name
: start nginx
  systemd
:
    name
: 'nginx'
    state
: 'started'
    enabled
: yes

- name
: restart nginx
  systemd
:
    name
: 'nginx'
    state
: 'restarted'

并创建以下两个配置模板文件:

$ PWD /角色/nginx/templates/site.conf.j2:


   
   
server {
  listen { { keepalived_vip } } :80;
  root /var/www;
  location / {
  }
}

$ PWD / roles / nginx / templates / index.html.j2

 Hello, my ip is {{ ansible_default_ipv4.address }} 

放在一起

您已经创建了几个角色。 它们随时可以使用,因此请创建一个使用手册。

创建一个名为$ PWD / main.yml的文件:


   
   
---
- hosts
: webservers
  become
: yes
  roles
:
 - base
  - nginx
  - keepalived

该文件定义了哪些角色在哪里。 如果有更多角色可用,可以根据需要将其包括在内以创建不同的组合。 例如,某些服务器只能是Web服务器。 这种灵活性是编写最小功能单元如此重要的主要原因之一。

以前的角色需要变量才能起作用。 Ansible确实非常灵活,可让您定义变量文件。 本示例在group_vars$ PWD / group_vars / all )中创建一个名为all的文件。 如果需要更大的灵活性,则可以在名为host_vars的文件夹中为每个主机定义变量:


   
   
---
keepalived_nic
: eth0
keepalived_vri
: 51
keepalived_vip
: 192.168.2.180

使用首选的Keepalived接口(通常为eth0)配置keepalived_nic 。 变量keepalived_vip应该具有用作虚拟IP所需的IP。

最后,定义库存。 此清单应跟踪整个基础结构。 最好使用动态清单,这些清单直接从虚拟机管理程序收集所有信息,因此不必手动更新。 创建一个名为清单的文件,其中包含名为webservers的部分,其中包含有关两个VM的信息:


   
   
[webservers]
webserver01  ansible_user=centos ansible_host=192.168.2.101 keepalived_state=MASTER keepalived_priority=101
webserver02  ansible_user=centos ansible_host=192.168.2.102 keepalived_state=BACKUP keepalived_priority=100

变量ansible_user应该让Ansible用户用来连接服务器。 变量keepalived_state应该指示将主机配置为主服务器还是备份主机(按照Keepalived模板文件的要求)。 最后,在此处设置变量keepalived_priority ,因为主服务器的优先级应高于备份服务器的优先级。

就是这样; 您已经自动配置了两个虚拟机,安装了Keepalived和Nginx。

现在保存更改:


   
   
$ git add .
$ git commit -m "IaC playbook"
$ git push -u origin master

并部署:

 $  ansible-playbook -i inventory main.yml 

该项目研究了IaC的基本概念,但并不止于此。 通过探索如何进行自动服务器配置,单元测试以及与CI / CD工具和管道的集成来了解更多信息。 这是一个漫长的过程,但是从技术和职业角度而言都是值得的。

翻译自: https://opensource.com/article/19/7/infrastructure-code

代码架构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值