我是初学者,对ansible(和docker)不熟悉。在将playbook应用于任何暂存/生产服务器之前,我希望先测试一下。
由于我没有访问空远程服务器的权限,所以我想测试的最简单方法是使用Docker容器,然后使用Docker容器作为主机来运行我的playbook。
我有一个创建标准ubuntu容器的基本DockerFile。如何配置ansible主机以针对Docker容器运行它?此外,我怀疑我需要“运行”Docker容器,以允许ansible连接到它。
我是初学者,对ansible(和docker)不熟悉。在将playbook应用于任何暂存/生产服务器之前,我希望先测试一下。
由于我没有访问空远程服务器的权限,所以我想测试的最简单方法是使用Docker容器,然后使用Docker容器作为主机来运行我的playbook。
我有一个创建标准ubuntu容器的基本DockerFile。如何配置ansible主机以针对Docker容器运行它?此外,我怀疑我需要“运行”Docker容器,以允许ansible连接到它。
如果您的阶段和生产服务器不是 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在这篇博客文章中提供了相关信息。
这里有一个相关的工作示例: 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-ansible
和wiliamyeh/nginx
项目的作者。
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
当然,还存在一些缺点:
pip3 install docker
)。我受到了这篇博客文章的启发:https://medium.com/@andreilhicas/provision-docker-containers-with-ansible-30cc5ee6d950
.travis.yml
文件,用于使用Travis CI形成CI管道。