前言

今天我们一起来学习搭建一个基于Docker的Ansible环境。首先,我假设大家对Docker和Ansible已经有了初步的了解了,如果你还不了解的话,需要先补充下相关基础知识再回来学习本篇内容。接下来,让我们一起探索Ansible吧。

部署架构

为了降低复杂度,我们从最简单的开始,一个master(主控机器)和一个slave(受控机器)

docker 安装Confluence Docker 安装ansible_devops

搭建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公钥私钥解决:

  1. master上生成公钥私钥对:$ ssh-keygen -t rsa
  2. 把拷贝公钥到slave:$ ssh-copy-id -i /root/.ssh/id_rsa.pub root@ansible-slave
  3. 测试ssh连接是否正常:$ ssh root@ansible-slave

小结:

到这里,我们就已经搭建好了一个ansible学习环境,总写一下,我们编写了两个Dockerfile,一个docker-compose.yml,接着启动docker compose up -d,环境准备就绪,开始Ansible学习之旅吧!

参考连接

最后

如果您对文章内容有疑问,欢迎留言一起交流~