如何使用Docker测试Ansible剧本

如何使用Docker测试Ansible剧本,docker,ansible,Docker,Ansible,我是ansible(和docker)的新手。我想在任何登台/生产服务器上使用ansible playbook之前测试它 由于我无法访问空的远程服务器,我认为最简单的测试方法是使用Docker容器,然后以Docker容器作为主机运行我的playbook 我有一个基本的DockerFile,它创建了一个标准的ubuntu容器。如何配置ansible主机,以便在docker容器上运行它?此外,我怀疑我需要“运行”docker容器,以允许ansible连接到它。在docker容器中运行剧本实际上可能不是

我是ansible(和docker)的新手。我想在任何登台/生产服务器上使用ansible playbook之前测试它

由于我无法访问空的远程服务器,我认为最简单的测试方法是使用Docker容器,然后以Docker容器作为主机运行我的playbook


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

在docker容器中运行剧本实际上可能不是最好的方法,除非您的舞台和制作服务器也是docker容器。Docker ubuntu映像已被剥离,与完整安装有所不同。更好的选择可能是在Ubuntu虚拟机中运行playbook,该虚拟机与您的登台和生产安装相匹配

也就是说,为了在容器中运行ansible playbook,您应该编写一个Dockerfile来运行您的playbook。以下是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


Ansible的首席技术官Michael DeHaan提供了一个信息丰富的示例。

关于这一点,有一个工作示例:

首先,从以下列表中选择要开始的基础图像:

  • 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构建。

为了更高级的使用,Ansible Galaxy中的角色还演示了如何在Ubuntu12.04工作实例上对各种Linux发行版进行简单的集成测试


披露:我是
docker ansible
wiliamyeh/nginx
项目的作者。

我为这个不同的场景创建了一个角色:。轻松启动Docker容器,并在您的角色或剧本中使用它们作为库存进行测试

包括:

  • Ubuntu12.04和14.04以及CentOS 6和7的策划Dockerfile,将其放回发行版,删除了init系统
  • 启动ssh
还请注意,所有示例都有一个
.travis.yml
文件,用于使用travis CI形成CI管道

示例:

  • 简单:
  • 简单:
  • 高级:

除了配置本地主机(您安装了Ansible的机器),您还可以告诉Ansible:

  • 创建一个新的docker容器
  • 规定该容器
  • 摧毁那个容器
  • 为此,您需要这样一个
    hosts.yaml
    文件:

    all:
      hosts:
        mycontainer:
          ansible_connection: docker
        localhost:
          ansible_connection: local
    
    ---
    - 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.yaml
    文件:

    all:
      hosts:
        mycontainer:
          ansible_connection: docker
        localhost:
          ansible_connection: local
    
    ---
    - 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
    
    另一个剧本文件:
    destroy.yaml
    用于销毁容器:

    ---
    - name: Destroy a container
      hosts: localhost
      tasks:
        - name: destroy docker container
          docker_container:
            name: mycontainer
            state: absent
    
    还创建一个简单的角色:
    roles/simple/taksks/main.yaml

    ---
    - name: Create a file
      copy:
        content: "hi!!"
        dest: /tmp/hello
        force: yes
        mode: 0555
    
    现在要创建容器并对其进行配置,请运行:

    ansible-playbook -i ./hosts.yaml ./playbook.yml
    
    验证是否已设置容器(文件已创建):

    要销毁容器,请执行以下操作:

    ansible-playbook -i ./hosts.yaml ./destroy.yml
    
    当然也有缺点:

    • 容器必须安装python
    • 某些Ansible模块可能无法工作,因为必须安装其他python包。例如,如果要部署docker容器(在docker容器中),则必须安装docker python SDK(
      pip3安装docker

    这篇博文启发了我:

    谢谢。因此,基本上是从docker容器中“本地”部署,而不是将容器作为“主机”。我没想到。明天晚上我将对它进行一次运行,看看它如何适合我的用例。也谢谢你提醒我这可能不是最好的方法!我会考虑的。@Andre你从中得到一些结果了吗?分子是官方的测试框架: