使用 Ansible 管理服务器

发布:2024-10-27 11:05 阅读:16 点赞:0

一、Ansible 简介

Ansible 是一款强大的自动化工具,它允许我们通过 SSH 连接节点的方式来配置、维护和管理环境,以实现可扩展和高效的管理。Ansible 使用带有 .YML 扩展名的文件来描述要在配置节点上执行的任务。

二、使用 Ansible 的优势

  1. 简易性 Ansible 使用基于 YAML 的语言来定义任务,使其易于理解和使用。

  2. 可扩展性 Ansible 可以管理从少量服务器到大量服务器,取决于你在清单文件中配置的数量。

  3. 幂等性 Ansible 的任务具有幂等性,这意味着你可以多次运行一个 playbook,而不会在系统已经处于所需状态时引起不必要的变化。

  4. 与其他工具集成 Ansible 可以轻松地与其他工具和平台集成,如 Docker、Kubernetes 和 CI/CD 系统。

  5. 安全性 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"

四、结论

  1. 使用 Ansible 进行服务器管理为我们带来了巨大的优势,其简单性、灵活性和可扩展性使我们能够优化时间,并确保系统配置和部署的一致性,提高运营效率。

  2. Ansible 的幂等性特点保证了重复执行同一任务不会带来不必要的变更,这对于保持环境稳定非常重要。

  3. 通过集成其他工具如 Docker,我们可以更灵活地模拟和测试不同的环境配置。