使用Ansible进行服务器配置管理
这篇文章是东京学艺大学榈山研究室2020年圣诞节日历的第20天的文章。
首先
Ansible是一种配置管理工具。
本文将介绍使用Ansible进行基础架构自动化构建。
引入构建管理工具的好处
首先,我会简要地总结一下引入配置管理工具的好处。
在需要构成管理工具的背景中,云的出现扮演了重要角色。随着云的出现,基础设施资源如网络和存储等的变更可以通过软件来进行,使得基础设施资源的生命周期变得更短且频繁地改变。
基础设施资源的生命周期短且频繁更改,这意味着系统的构建和管理变更频率也增加了。在变更频率较高的云环境中手动进行系统的构建和管理将导致操作成本的增加,是低效的。
因此,配置管理工具派上用场。
在本地环境中引入配置管理工具的好处。
尽管到目前为止,配置管理工具可能给人一种只适用于云环境的印象,但是在本地环境中引入配置管理工具也能享受到很多好处。在这里,特别介绍了在实验室的服务器管理活动中引入配置管理工具的好处。
在所属研究室,我们购买并管理物理服务器,用于部署大学课程开发的Web应用程序以及研究活动的需要。
首先,作为前提,研究室的服务器会出现故障。
今年已经有两台服务器崩溃了(泪)。
每次出现故障都要整理现有的基础设施环境,这真的很麻烦,而且正在运行的系统会出现停机时间。
我们希望尽快解决这些问题。
通过引入配置管理工具,即使频繁构建和销毁系统,也能提供相同质量的环境。因此,设备购买后能够快速恢复环境。
另一个好处是可以引入基础设施即代码 (Infrastructure as Code, IoC) 的机制。
基础设施即代码的定义如下:
用代码描述基础设施的配置管理,并将软件开发过程应用于基础设施系统、应用程序、中间件的部署和配置管理。
以代码为基础的基础设施的理念简言之即是“将应用开发的经验运用于基础设施的管理”。通过这种方式,我们可以利用GitHub等工具进行版本控制,保管基础设施的配置。
在研究室的服务器管理活动中,人员更替的周期通常为2到4年。为了方便传承,这样的机制非常重要。
Ansible的工作原理
在之前的解释中,我详细介绍了引入配置管理工具的好处,但现在我想接下来讲一下真正的主题——Ansible。
Ansible使用了两种文件,一个是主机清单(Inventory),一个是剧本(Playbook)。主机清单用来描述操作的目标主机,而剧本用来描述具体的操作内容。
使用Ansible时,通过SSH连接从客户端(也称为控制节点或管理服务器)执行在服务器(目标节点)上记录在playbook中的处理流程。
将该流程绘制成图形如下所示。
示例如下
接下来,让我们实际尝试使用Ansible进行配置管理。
在这里,我们将通过使用Vagrant启动的虚拟机(CentOS 7)并使用Ansible进行环境配置。
请参考官方网站或其他信息以获取Ansible和Vagrant的安装方法?♂️
Ansible 文档(中文), https://docs.ansible.com/ansible/2.9_zh/index.html
Vagrant, https://www.vagrantup.com/
准备虚拟机
首先,添加用作虚拟机模板的Box。
vagrant box add centos/7
我选择VirtualBox作为提供商。
接下来,创建一个名为”ansible-sample”的工作目录,并创建一个称为”Vagrantfile”的文件来管理虚拟机。
mkdir ansible-sample && cd ansible-sample
vagrant init centos/7
现在,在ansible-sample目录下已经创建了Vagrantfile文件。我们使用vagrant up命令来启动虚拟机。
vagrabt up
准备库存
让我们准备Ansible的主机清单文件。
文件名将命名为hosts。
Vagrant默认接受通过本地主机的2222端口进行SSH连接。
由于本次仅为示例,所以将主机名设为sample。
[sample]
127.0.0.1
[sample:vars]
ansible_port=2222
ansible_ssh_private_key_file=./.vagrant/machines/default/virtualbox/private_key
ansible_become=yes
ansible_user=vagrant
ansible_become_methods=su
ansible_become_user=root
准备好剧本
我们将实际准备Playbook。
Ansible的Playbook通常不是单个文件,而是按照角色整理和部署的。
我們將準備以下的內容來進行本次。
-
- 服务器地区设置
-
- NTP服务器设置
- 包管理设置
我们可以按照以下的目录结构来描述它们。
.
├── Vagrantfile
├── hosts
├── roles
│ └── common
│ ├── locale // 1. サーバのロケールの設定
│ │ ├── defaults
│ │ │ └── main.yml
│ │ └── tasks
│ │ └── main.yml
│ ├── ntp // 2. NTPサーバの設定
│ │ ├── handlers
│ │ │ └── main.yml
│ │ └── tasks
│ │ └── main.yml
│ └── packages // 3. パッケージ管理の設定
│ ├── tasks
│ │ └── main.yml
│ └── vars
│ └── RedHat.yml
├── site.yml
└── webservers.yml
设置服务器的区域设置
首先,在defaults/main.yml文件中写入要设置的值。
---
locale_timezone: "Asia/Tokyo"
locale_locale: "ja_JP.UTF-8"
locale_keymap: "jp"
然后在tasks/main.yml中编写操作。在这种情况下,可以使用{{变量名}}从defaults/main.yml中提取值。
---
- name: Setup timezone
timezone:
name: "{{ locale_timezone }}"
- name: Setup locale
command: localectl set-locale LANG={{ locale_locale }}
changed_when: false
- name: Setup keymap
command: localectl set-keymap {{ locale_keymap }}
changed_when: false
包裹管理设置
接下来将进行软件包管理的设置。
由于软件包管理会因目标Linux发行版而异,因此希望增加灵活性。
由于本次的虚拟机是centOS,所以属于RedHat系列。因此,首先需要在vars/RedHat.yml文件中记录希望在RedHat系列发行版中管理的值。
---
required_packages:
- "@Development Tools"
然后在tasks/main.yml中记录实际操作。
---
- name: Add the OS specific variables
include_vars: "{{ ansible_os_family }}.yml"
- name: Update yum packages
yum:
name: "{{ item }}"
state: present
update_cache: yes
loop:
- "epel-release"
- "*"
when: ansible_os_family == 'RedHat'
- name: Instrall the required packages
package:
name: "{{ required_packages }}"
state: present
根据ansible_os_family的信息,可以通过读取var文件夹下的yml文件来进行更改,这是关键点。如果是Debian系,则可以通过准备Debian.yml来实现灵活的描述。
设置NTP服务器
我们将使用chorony进行NTP服务器的设置。
设置NTP服务器需要重新启动chorony。
这个重新启动的操作在ansible中是在handlers/main.yml中描述的。
---
- name: Restart chrony
service:
name: chronyd
state: restarted
具体的的 NTP 服务器操作在 tasks/main.yml 中进行描述。
---
- name: Install chorony
package:
name: chrony
state: present
when: not (ansible_distribution == "CentOS" and ansible_distribution_major_version == "7")
become: yes
- name: Disable default servers
replace:
dest: /etc/chrony.conf
regexp: '^(server \d+.centos.pool.ntp.org iburst)'
replace: '# \1'
become: yes
- name: Add ntp servers
blockinfile:
dest: /etc/chrony.conf
content: |
# ntp servers
server ntp.nict.jp iburst
# disabel ntp server only use client
port 0
notify:
- Restart chrony
become: yes
- name: Execute chorony makestep
command: chronyc -a makestep
changed_when: false
become: yes
- name: Enable chorony service
service:
name: chronyd
enabled: yes
become: yes
执行完chorony的重新启动所需操作之后,会通过notify来调用handlers/main.yml中的操作。
site.yml的配置
在Ansible中,您可以设置哪个主机执行哪个角色。
将这些设置整合到site.yml中。
- hosts: sample
roles:
- common/locale
- common/packages
- common/ntp
执行
现在我们要开始执行了,但我们需要确认一下是否有语法错误或者任务。您可以使用以下命令来检查语法和任务清单。
# 文法チェック
ansible-playbook -i hosts site.yml --syntax-check
# タスクの一覧を確認
ansible-playbook -i hosts site.yml --list-tasks
playbook: site.yml
play #1 (sample): sample TAGS: []
tasks:
common/locale : Setup timezone TAGS: []
common/locale : Setup locale TAGS: []
common/locale : Setup keymap TAGS: []
common/packages : Add the OS specific variables TAGS: []
common/packages : Update yum packages TAGS: []
common/packages : Instrall the required packages TAGS: []
common/ntp : Install chorony TAGS: []
common/ntp : Disable default servers TAGS: []
common/ntp : Add ntp servers TAGS: []
common/ntp : Execute chorony makestep TAGS: []
common/ntp : Enable chorony service TAGS: []
让我们实际执行一下。可以通过以下命令进行执行。
# リハーサル
ansible-playbook -i hosts site.yml --check
# 本番実行
ansible-playbook -i hosts site.yml
只要最后输出结果没有错误并且能够正常执行,就没有问题。
PLAY RECAP **********************************************************************************************************************************************************
127.0.0.1 : ok=12 changed=6 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
跳过的任务是在任务【common/ntp : 安装chorony】中安装chorony。
最后
在本文中,我们从配置管理工具的概述开始,通过示例代码解释了使用Ansible进行配置管理的例子。
只要能对某事有所帮助,我会感到幸运?。
请参考
-
- Ansible実践ガイド 第3版 (impress top gear) , https://www.amazon.co.jp/Ansible%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E7%AC%AC3%E7%89%88-impress-top-gear/dp/4295007641/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=ansible&qid=1609311074&sr=8-1
Playbookの使用 – ベストプラクティス, https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks_best_practices.html