使用 Ansible 管理服务器
一、Ansible 简介
Ansible 是一款强大的自动化工具,它允许我们通过 SSH 连接节点的方式来配置、维护和管理环境,以实现可扩展和高效的管理。Ansible 使用带有 .YML 扩展名的文件来描述要在配置节点上执行的任务。
二、使用 Ansible 的优势
-
简易性 Ansible 使用基于 YAML 的语言来定义任务,使其易于理解和使用。
-
可扩展性 Ansible 可以管理从少量服务器到大量服务器,取决于你在清单文件中配置的数量。
-
幂等性 Ansible 的任务具有幂等性,这意味着你可以多次运行一个 playbook,而不会在系统已经处于所需状态时引起不必要的变化。
-
与其他工具集成 Ansible 可以轻松地与其他工具和平台集成,如 Docker、Kubernetes 和 CI/CD 系统。
-
安全性 Ansible 提供了安全地管理和审计敏感配置的方法。
三、实践示例
(一)准备工作
对于本次实验,我们将使用 Docker 工具来创建容器并模拟使用 Ansible 脚本管理服务器的过程。
首先,我们需要从 GitHub 存储库克隆 Dockerfile 文件,这些文件将作为构建管理员节点和受控节点的基础:
# 克隆存储库
git clone https://github.com/evergel/Welcome_to_Ansible.git
# 切换到目录
cd Welcome_to_Ansible/
在此目录下,我们会看到三个关键文件:
-
Dockerfile_controller
:这是用于构建控制器节点镜像的基础 Dockerfile 文件。 -
Dockerfile_slave
:这是用于构建受控节点镜像的基础 Dockerfile 文件。 -
.ansible.cfg
:这是将在构建控制器节点镜像时复制的配置文件。
(二)构建镜像
构建控制器节点的镜像
# 创建控制器节点的镜像,安装 Ansible
docker build -f Dockerfile_controller -t img_controller .
# Dockerfile_controller 关键点:
# 安装必要的工具(SSH, Ansible, Python3)
RUN apk update && \
apk add --no-cache iproute2 net-tools openssh ansible python3
# 复制配置文件
COPY .ansible.cfg /home/ansible/.ansible.cfg
# 设置 Ansible 配置路径
ENV ANSIBLE_CONFIG=/home/ansible/.ansible.cfg
# 创建并配置 ansible 用户
RUN adduser -D ansible && \
mkdir -p /home/ansible/.ssh && \
chown -R ansible:ansible /home/ansible/.ssh && \
chmod 700 /home/ansible/.ssh
# 生成 SSH 密钥对
USER ansible
WORKDIR /home/ansible/.ssh
RUN ssh-keygen -t rsa -b 4096 -f id_rsa -q -N "" && \
cp id_rsa.pub authorized_keys && \
chmod 600 id_rsa id_rsa.pub authorized_keys
构建受控节点的镜像
# 创建受控节点的镜像
docker build -f Dockerfile_slave -t img_slave .
# Dockerfile_slave 关键点:
# 安装必要的工具(SSH, Python3)
RUN apk update && \
apk add --no-cache sudo openssh bash python3
# 创建 ansible 用户并设置密码
RUN adduser -D -s /bin/bash ansible && \
echo "ansible:gG930" | chpasswd
# 为 ansible 用户分配 sudo 权限
RUN echo "ansible ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
(三)创建容器
创建好镜像后,我们可以运行以下命令来启动容器:
# 启动控制器节点容器
docker run -d --name ansible_controller img_controller:latest
# 启动受控节点容器
docker run -d --name ansible_slave img_slave:latest
docker run -d --name ansible_slave1 img_slave:latest
docker run -d --name ansible_slave2 img_slave:latest
检查创建的容器 IP 地址:
docker container inspect ansible_slave| grep IPAddress
(四)配置 SSH 密钥
进入控制器节点容器并复制 SSH 密钥至受控节点:
# 进入控制器节点容器
docker exec -it -u ansible ansible_controller sh
# 复制 SSH 密钥至受控节点
ssh ansible@<ip_ansible_slave>
ssh ansible@<ip_ansible_slave2>
ssh ansible@<ip_ansible_slave3>
输入之前设置的密码 gG930
。
(五)创建清单文件
创建一个名为 inventory
的清单文件,指定要管理的节点:
# 创建清单文件
cd $HOME
vi inventory
# 添加节点
[all]
172.17.0.3
172.17.0.4
172.17.0.5
[group1]
172.17.0.3
172.17.0.4
(六)创建并执行 Playbook
示例 Playbook 1:更新包并安装新软件
# 创建 Playbook 文件
vi play1.yml
# 添加以下内容
- name: Configuracion inicial de servidores remotos
hosts: "{{ target_hosts | default('all') }}"
become: true
vars:
packages:
- vim
- git
- curl
tasks:
- name: Actualizar el índice de paquetes
apk:
update_cache: yes
- name: Actualizar todos los paquetes
apk:
upgrade: yes
register: upgrade_result
- name: Instalar paquetes necesarios
apk:
name: "{{ packages }}"
state: present
执行 Playbook:
ansible-playbook play1.yml -e "target_hosts=group1"
示例 Playbook 2:创建管理员用户
# 创建 Playbook 文件
vi create_user.yml
# 添加以下内容
---
- name: Crear usuario y asignar permisos
hosts: "{{ target_hosts }}"
become: yes
vars:
usuario: "{{ usuario }}"
tasks:
- name: Crear usuario
user:
name: "{{ usuario }}"
append: yes
- name: Asignar permisos de sudo
lineinfile:
dest: /etc/sudoers
line: "{{ usuario }} ALL=(ALL) NOPASSWD:ALL"
state: present
执行 Playbook:
ansible-playbook create_user.yml -e "usuario=usua_admin" -e "target_hosts=all"
四、结论
-
使用 Ansible 进行服务器管理为我们带来了巨大的优势,其简单性、灵活性和可扩展性使我们能够优化时间,并确保系统配置和部署的一致性,提高运营效率。
-
Ansible 的幂等性特点保证了重复执行同一任务不会带来不必要的变更,这对于保持环境稳定非常重要。
-
通过集成其他工具如 Docker,我们可以更灵活地模拟和测试不同的环境配置。