工作原理
Ansible 分为控制端和被控端。根据其中定义的规则获取Inventory
中的管理主机列表,然后基于 SSH 协议连接到被控端主机,调取本地的各个模块对被控端机器实现批量、并发的配置管理和维护。如果任务比较复杂,可以写成PlayBook
剧本进行分发管理。
ansible的四大组件:
ansible批量安装docker
准备3台机器,1台master,2台node建立免密通道
1.安装docker依赖软件包
[root@docker playbooks]# vim installDocker.yaml
[root@docker playbooks]# ansible-playbook installDocker.yaml
这个 Playbook 任务的功能是使用 Ansible 的
yum
模块,在指定的目标主机上安装yum-utils
、device-mapper-persistent-data
和lvm2
这三个软件包,为后续安装和配置 Docker 提供必要的依赖环境。
name: Install required packages
:此任务的名称,说明了要安装必需的软件包。yum
:这是 Ansible 里的一个模块,用于在基于 RPM 的系统(如 CentOS)上管理软件包。name
:列出需要安装的软件包名称。state: present
:表示要确保这些软件包已安装。==========================================
在目标主机上验证依赖安装成功,
yum list installed
命令检查软件包安装情况
以下配置全部写到installDocker.yaml文件里:
# 指定该Playbook要在Ansible主机清单中定义的所有主机上执行
- hosts: all
# 指定以root用户的身份在远程主机上执行任务
remote_user: root
# 定义一个任务列表,包含一系列要在目标主机上执行的操作
tasks:
# 为当前任务命名,便于在执行Playbook时识别操作内容
- name: Install required packages
# 使用Ansible的yum模块,该模块用于基于RPM的Linux系统(如CentOS、Red Hat)管理软件包
yum:
# 指定要安装的软件包名称列表
name:
# yum-utils包含实用的YUM工具,例如yum-config-manager可用于管理YUM仓库
- yum-utils
# device-mapper-persistent-data为设备映射器提供持久化数据支持,是Docker存储驱动的依赖
- device-mapper-persistent-data
# lvm2是逻辑卷管理工具集,提供灵活的磁盘空间管理,也是Docker存储管理的依赖
- lvm2
# 确保指定的软件包已经安装在目标主机上
# 若软件包未安装,Ansible会使用YUM自动下载并安装;若已安装则不进行操作
state: present
2. 配置 Docker 仓库(使用阿里云的 Docker 镜像仓库)
通过
yum_repository
模块在系统中添加了 Docker 的软件仓库,并配置了必要的参数,为后续使用yum
命令安装 Docker 相关软件包做好准备。==========================================
在目标主机上验证设置 Docker 的软件仓库是否配置成功
# 任务名称,表明此任务用于添加阿里云的 Docker CE 镜像仓库
- name: Add Docker CE repository from Alibaba Cloud mirror
# 使用 shell 模块执行 shell 命令
shell: yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
args:
# creates 参数用于检查文件是否存在,如果 /etc/yum.repos.d/docker-ce.repo 已存在,该任务将不会再次执行
creates: /etc/yum.repos.d/docker-ce.repo
3. 安装 Docker CE
name: Install Docker CE
:任务名称,表明要安装 Docker CE。yum
:同样是用于管理软件包的模块。name
:列出需要安装的 Docker 相关软件包名称。state: present
:确保这些软件包已安装。
# 任务名称,表明此任务用于安装 Docker CE 及其相关组件
- name: Install Docker CE
# 使用 yum 模块来管理基于 RPM 的系统中的软件包
yum:
# 指定要安装的 Docker 相关软件包列表
name:
# Docker 社区版
- docker-ce
# Docker 社区版命令行工具
- docker-ce-cli
# 容器运行时
- containerd.io
# 确保这些软件包处于已安装状态
state: present
4. 启动并设置 Docker 服务开机自启
全部执行成功!!
在目标主机上验证设置 Docker状态
# 任务名称,表明此任务用于启动 Docker 服务并设置为开机自启
- name: Start and enable Docker service
# 使用 systemd 模块来管理系统服务
systemd:
# 指定要管理的服务名称为 docker
name: docker
# 启动 Docker 服务
state: started
# 设置 Docker 服务为开机自启
enabled: true
ansible批量配置docker
1.修改docker镜像源,拉取镜像需修改本机/etc/docker/daemon.json配置文件(没有就新建)
再使用ansible批量copy到别的机器
[root@docker playbooks]# ansible all -m copy -a 'src=/etc/docker/daemon.json dest=/etc/docker/daemon.json'
2.批量重载配置文件并重启docker
[root@docker playbooks]# ansible all -m shell -a 'systemctl daemon-reload'
[root@docker playbooks]# ansible all -m shell -a 'systemctl restart docker'
一个简单的Ansible Playbook示例,用于创建一个Nginx容器:
在目标主机验证 Nginx 容器是否正常运行:
执行成功!
# YAML 文件的起始标记,表明这是一个 YAML 格式的文件
---
# 定义一个 play,每个 play 以短横线 - 开头,play 是 Ansible Playbook 中的一个执行单元
-
# 指定此 play 要执行的目标主机,这里 all 表示所有在主机清单中定义的主机
hosts: all
# 指定以 root 用户身份连接到远程主机并执行任务
remote_user: root
# 定义变量,指定使用 Python 3 解释器来执行任务,避免因 Python 版本不一致导致库找不到的问题
vars:
ansible_python_interpreter: /usr/bin/python3
# 定义此 play 要执行的一系列任务
tasks:
# 任务名称,表明该任务用于安装 Docker SDK for Python 和 requests 库
- name: Install Docker SDK for Python and requests
# 使用 pip 模块来安装 Python 库
pip:
# 指定要安装的库名称
name:
- docker
- requests
# 指定使用 pip3 来安装库,确保安装到 Python 3 环境中
executable: pip3
# 任务名称,表明该任务用于拉取 Nginx 镜像
- name: Pull Nginx image
# 使用 docker_image 模块来管理 Docker 镜像
docker_image:
# 指定要操作的镜像名称为 nginx
name: nginx
# 确保镜像在本地存在,如果本地没有则会从镜像仓库拉取
state: present
# 显式指定镜像来源为从远程仓库拉取,避免未来版本 Ansible 的兼容性警告
source: pull
# 任务名称,表明该任务用于运行一个 Nginx 容器
- name: Run Nginx container
# 使用 docker_container 模块来管理 Docker 容器
docker_container:
# 指定要创建的容器的名称为 nginx_container
name: nginx_container
# 指定创建容器所使用的镜像为 nginx
image: nginx
# 配置容器的端口映射,将主机的 8033 端口映射到容器内部的 80 端口
ports:
- "8033:80"
# 确保容器处于启动状态,如果容器未启动则会启动它
state: started