如何使用Docker测试Ansible剧本
我是ansible(和docker)的新手。我想在任何登台/生产服务器上使用ansible playbook之前测试它 由于我无法访问空的远程服务器,我认为最简单的测试方法是使用Docker容器,然后以Docker容器作为主机运行我的playbook如何使用Docker测试Ansible剧本,docker,ansible,Docker,Ansible,我是ansible(和docker)的新手。我想在任何登台/生产服务器上使用ansible playbook之前测试它 由于我无法访问空的远程服务器,我认为最简单的测试方法是使用Docker容器,然后以Docker容器作为主机运行我的playbook 我有一个基本的DockerFile,它创建了一个标准的ubuntu容器。如何配置ansible主机,以便在docker容器上运行它?此外,我怀疑我需要“运行”docker容器,以允许ansible连接到它。在docker容器中运行剧本实际上可能不是
我有一个基本的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管道
示例:
- 简单:
- 简单:
- 高级:
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你从中得到一些结果了吗?分子是官方的测试框架: