如何使用Docker测试Ansible Playbook

25

我是初学者,对ansible(和docker)不熟悉。在将playbook应用于任何暂存/生产服务器之前,我希望先测试一下。

由于我没有访问空远程服务器的权限,所以我想测试的最简单方法是使用Docker容器,然后使用Docker容器作为主机来运行我的playbook。

我有一个创建标准ubuntu容器的基本DockerFile。如何配置ansible主机以针对Docker容器运行它?此外,我怀疑我需要“运行”Docker容器,以允许ansible连接到它。


2
Molecule是官方的测试框架:https://www.jeffgeerling.com/blog/2018/testing-your-ansible-roles-molecule - sajjadG
4个回答

17

如果您的阶段和生产服务器不是 Docker 容器,那么在 Docker 容器中运行 Playbook 可能并不是最好的选择。Docker ubuntu 镜像被精简了,与完整安装有一些差异。更好的选择可能是在与您的阶段和生产环境相匹配的 Ubuntu VM 中运行 Playbook。

话虽如此,为了在容器内运行 ansible playbook,您应编写一个运行 Playbook 的 Dockerfile。以下是一个样例 Dockerfile:

 # Start with the ubuntu image
 FROM ubuntu
 # Update apt cache
 RUN apt-get -y update
 # Install ansible dependencies
 RUN apt-get install -y python-yaml python-jinja2 git
 # Clone ansible repo (could also add the ansible PPA and do an apt-get install instead)
 RUN git clone http://github.com/ansible/ansible.git /tmp/ansible

 # Set variables for ansible
 WORKDIR /tmp/ansible
 ENV PATH /tmp/ansible/bin:/sbin:/usr/sbin:/usr/bin
 ENV ANSIBLE_LIBRARY /tmp/ansible/library
 ENV PYTHONPATH /tmp/ansible/lib:$PYTHON_PATH

 # add playbooks to the image. This might be a git repo instead
 ADD playbooks/ /etc/ansible/
 ADD inventory /etc/ansible/hosts
 WORKDIR /etc/ansible

 # Run ansible using the site.yml playbook 
 RUN ansible-playbook /etc/ansible/site.yml -c local

Ansible清单文件应该如下所示

[local]
localhost

那么你只需执行docker build . (其中.代表playbooks和Dockerfile所在目录的根目录),然后针对生成的镜像运行docker run

Ansible的CTO Michael DeHaan在这篇博客文章中提供了相关信息。


2
谢谢。基本上,您是从Docker容器内部进行“本地”部署,而不是容器作为“主机”。我没有想到这一点。我明天晚上会试一下,看看它如何适用于我的用例。还要感谢您提醒我可能不是最佳方法!我会考虑这个建议的。 - Andre
@Andre 你从中得到了一些结果吗? - Tuukka Mustonen

16

这里有一个相关的工作示例: https://github.com/William-Yeh/docker-ansible

首先,从以下列表中选择您想要开始使用的基础映像:

  • williamyeh/ansible:debian8-onbuild
  • williamyeh/ansible:debian7-onbuild
  • williamyeh/ansible:ubuntu14.04-onbuild
  • williamyeh/ansible:ubuntu12.04-onbuild
  • williamyeh/ansible:centos7-onbuild
  • williamyeh/ansible:centos6-onbuild

第二步,将以下 Dockerfile 与您的 playbook 目录一起放置:

FROM williamyeh/ansible:ubuntu14.04-onbuild

# ==> Specify playbook filename;   default = "playbook.yml"
#ENV PLAYBOOK   playbook.yml

# ==> Specify inventory filename;  default = "/etc/ansible/hosts"
#ENV INVENTORY  inventory.ini

# ==> Executing Ansible...
RUN ansible-playbook-wrapper

第三步, docker build .

对于更高级的用法,Ansible Galaxy中的角色williamyeh/nginx还演示了如何在Travis CI的Ubuntu 12.04工作实例上对各种Linux发行版进行简单的集成测试。

声明: 我是docker-ansiblewiliamyeh/nginx项目的作者。


5
除了为安装了Ansible的本地主机(provisioning localhost)提供服务外,您还可以告诉Ansible:
1. 创建一个新的Docker容器, 2. 为该容器进行配备(provision that container), 3. 销毁该容器。
为了使这个过程工作,您需要一个名为hosts.yaml的文件:
all:
  hosts:
    mycontainer:
      ansible_connection: docker
    localhost:
      ansible_connection: local

下面是一个名为playbook.yaml的文件:

---
- name: Create a container to be provisioned later
  hosts: localhost
  tasks:
    - name: create docker container
      docker_container:
        name: mycontainer
        image: python:2.7.16-slim-stretch
        command: ["sleep", "1d"]

- name: Provision the container created above
  hosts: mycontainer
  roles:
    - simple

还有另一个playbook文件:destroy.yaml 用于销毁容器:

---
- name: Destroy a container
  hosts: localhost
  tasks:
    - name: destroy docker container
      docker_container:
        name: mycontainer
        state: absent

创建一个简单的角色:roles/simple/tasks/main.yaml
---
- name: Create a file
  copy:
    content: "hi!!"
    dest: /tmp/hello
    force: yes
    mode: 0555

现在要创建一个容器并进行配置,请运行:

ansible-playbook -i ./hosts.yaml ./playbook.yml

确认容器已经被配置(文件已被创建):

docker exec mycontainer cat /tmp/hello

销毁容器,请运行以下命令:
ansible-playbook -i ./hosts.yaml ./destroy.yml

当然,还存在一些缺点:

  • 容器必须安装Python。
  • 有些Ansible模块可能无法正常工作,因为需要安装额外的Python包。例如,如果你想要在Docker容器中部署Docker容器,则必须安装Docker Python SDK (pip3 install docker)。

我受到了这篇博客文章的启发:https://medium.com/@andreilhicas/provision-docker-containers-with-ansible-30cc5ee6d950


4
我为这种情况创建了一个角色:https://github.com/chrismeyersfsu/provision_docker。可以轻松地启动Docker容器并在你的角色或playbook中使用它们,作为清单来进行测试。
包括:
  • Ubuntu 12.04和14.04以及CentOS 6和7的策划Dockerfile,并重新引入被删除的发行版init系统。
  • 启动ssh
此外,请注意所有示例都有一个.travis.yml文件,用于使用Travis CI形成CI管道。
示例:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接