前言
今天我们一起来学习搭建一个基于Docker的Ansible环境。首先,我假设大家对Docker和Ansible已经有了初步的了解了,如果你还不了解的话,需要先补充下相关基础知识再回来学习本篇内容。接下来,让我们一起探索Ansible吧。
部署架构
为了降低复杂度,我们从最简单的开始,一个master(主控机器)和一个slave(受控机器)
搭建Ansible环境需要什么?
相比其他类似运维工具,Ansible需要的很简单,主控机器(以下简称master)需要Python、SSH和Ansible,而被管理节点(以下简称node)只需要Python、SSH,master只需要通过ssh便可以控制node。
所以接下来我们可以看到,都是围绕着这三个工具来搭建我们的Docker环境。
构建所需环境镜像
如果要你在一台机器上搭建一套测试环境,你会怎么做?你一定会想到各种繁琐的步骤,如:yum install,export xxx,等等…,现在又有个需求来了,需要搭建一套预上线环境,这些步骤是不是又得重复一遍?如果有一个可以描述环境的文件,我又可以基于这个文件去轻松部署多个环境,岂不美哉?如果你不想因为这些繁琐的工作而幸苦加班的话,学一学Docker镜像吧,它就是你想要的那个描述环境的文件。下面我们就来编写下我们所需要的两个镜像
编写主控机器Dockerfile
主控机器的环境我们需要安装必须依赖的Python、SSH、和Ansible,Dockerfile内容如下:
FROM centos:centos7
# # 通过pip安装ansiblle
ENV LANG=en_US.UTF-8
ENV LC_ALL=en_US.UTF-8
# Update the index of available packages.
RUN yum update -y
# Install the requires package.
RUN yum install -y net-tools.x86_64 openssh-server openssh-clients python3.x86_64 sudo curl wget bash-completion openssl && yum clean all
# Install ansible
RUN pip3 install --upgrade pip && pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ansible
# Setting the root password
RUN echo 'root:root' | chpasswd
# Generate the ssh host keys.
RUN ssh-keygen -A
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
编写受控机器Dockerfile
主控机器的环境中,我们只需安装Python、SSH即可,Dockerfile内容如下:
FROM centos:centos7
# Update the index of available packages.
RUN yum update -y
# Install the requires package.
RUN yum install -y net-tools.x86_64 openssh-server openssh-clients python3.x86_64 sudo curl wget bash-completion openssl && yum clean all
# Setting the root password
RUN echo 'root:root' | chpasswd
# Generate the ssh host keys.
RUN ssh-keygen -A
EXPOSE 22
# Run ssh server daemon.
CMD ["/usr/sbin/sshd", "-D"]
写到这里,我们已经可以构建两个镜像了,基于这两个镜像,我们就可以启动一个master和一个slave,如果要启动多个slave怎么办?我们用docker compose来解决这个问题,如果看完本篇内容,你感兴趣准备自己也动手试试的话,可以按你自己的需求更改下面的docker-compose.yml文件。
通过Docker compose启动服务
启动docker compose之前,我们需要一个描述所有服务的文件,包括服务都暴露哪些端口等等。
编写docker-compose.yml文件
version: '3.7'
services:
master:
container_name: ansible-master
build: ./master
image: ansible-master
ports:
- 22:22
networks:
- internal_access
- external_access
slave1:
container_name: ansible-slave
build: ./slave
image: ansible-slave
networks:
- internal_access
networks:
internal_access:
internal: true
external_access:
启动服务
$ docker compose up -d
说明:-d参数表示后台启动
这样,我们就已经启动了两个容器,一个是master,一个是slave,最后,也是最关键的,我们需要实现主控和受控机器的无密码通信。如何实现呢?通过配置SSH公钥私钥解决:
- master上生成公钥私钥对:
$ ssh-keygen -t rsa
- 把拷贝公钥到slave:
$ ssh-copy-id -i /root/.ssh/id_rsa.pub root@ansible-slave
- 测试ssh连接是否正常:$ ssh root@ansible-slave
小结:
到这里,我们就已经搭建好了一个ansible学习环境,总写一下,我们编写了两个Dockerfile,一个docker-compose.yml,接着启动docker compose up -d,环境准备就绪,开始Ansible学习之旅吧!
参考连接
- 《Ansible自动化运维:技术与最佳实践》
- https://www.w3cschool.cn/automate_with_ansible/
- https://github.com/xiaofandev/docker.git(如果不想编写文章涉及到的3个文件,可到我的github地址clone下载直接使用即可)
最后
如果您对文章内容有疑问,欢迎留言一起交流~