pipe理来自Ansible的Docker容器
我正在编写我的第一本Ansible剧本,需要一些指导。 我有一个简单的networking,包含3个虚拟机:
-
ansible01
– 我的Ansible服务器(Ubuntu) -
db01
– 一个数据库(再次,Ubuntu) -
myapp01
– 托pipeJava应用程序的Ubuntu VM
我configuration了我的/etc/ansible/hosts
文件,如下所示:
[databases] db01.example.com [app_servers] myapp01.example.com myapp02.example.com
我已经正确地configuration了SSH,并且我可以运行ansible all ping -m
而Ansible能够ping数据库和应用程序服务器节点。 到现在为止还挺好。
我正在尝试写三(3)个Docker相关的剧本,将完成以下内容:
- 确保Docker在所有
[databases]
节点以及所有[app_servers]
节点上运行; 如果未安装并运行,则安装Docker引擎并开始运行。 如果已安装但未运行,请重新启动。 - 停止/启动/重新启动所有运行特定types节点的容器(“ role ”?!?)。例如,我想告诉Ansible我想重新启动在所有
[app_servers]
节点上运行的所有容器。 - 停止/启动/重新启动在任意节点上运行的任意容器。 例如,也许
myapp01
有2个容器运行,fizz
buzz
和buzz
。 我希望能够告诉Ansible重新启动(特别是)myapp01
的fizz
容器,但不是它的buzz
容器,也不是任何myapp02
容器。
我相信这些属于三个单独的剧本(纠正我,如果我错了,或者有更好的方法)。 我刺了他们。 第一个是setup_docker.yml
:
- name: ensure docker engine is installed and running docker: name: * state: started
然后,重新启动所有[databases]
,在restart_app_servers.yml
:
- name: restart app servers docker: name: app_servers state: restarted
并重新启动单个节点上的任意容器( restart_container.yml
):
- name: restart a specific container docker: name: %name_of_container_and node% state: restarted
但是这里有几个问题:
- 在
setup_docker.yml
,如何指定所有节点types([databases]
和[app_servers]
)应该受到影响? 我知道星号(“*”)是不正确的。 - 在
restart_app_servers.yml
,name
字段的值是什么? 我如何确实告诉Ansible重新启动所有app_server
节点? - 在
restart_container.yml
,如何“注入”(作为参数/variables传入)节点和容器的名称? 理想情况下,我想运行这个剧本对任何节点和任何容器。 - 还有什么东西向你跳出来是错的?
提前致谢!
我认为你在这里有混合意义上的戏剧和手册。 上面指定的三件事情,setup_docker.yml,restart_app_servers.yml和restart_container.yml似乎是Plays。 我build议创build一个Dockerangular色,其中包含您在此处详细说明的任务。
解决您的问题:
- 在setup_docker.yml中,如何指定所有节点types([databases]和[app_servers])应该受到影响? 我知道星号(“*”)是不正确的。
这是在Playbook级别完成的。 您可以指定哪些主机受到哪些任务的影响,例如:
#docker.yml - hosts: all user: {{ privileged_user }} gather_facts: false roles: - install_docker
然后在你的install_dockerangular色中,你将会看到以下几点:
- name: Add docker apt keys apt_key: keyserver=keyserver.ubuntu.com id=36A1D7869245C8950F966E92D8576A8BA88D21E9 - name: update apt apt_repository: repo='deb https://get.docker.com/ubuntu docker main' state=present - name: Install docker apt: pkg=lxc-docker update_cache=yes
- 在restart_app_servers.yml中,name字段的值是什么? 我如何确实告诉Ansible重新启动所有app_server节点?
我假设你的意思是你希望重新启动属于应用程序服务器组的每个节点上的所有Docker容器? 我将保留每个组的所有容器名称的清单(因为这个例子相对简单)。 例如:
#group_vars/app-server all_containers: [ 'container1', 'container2', 'container3',.. 'containern' ]
从这里您可以在Play中使用这个广告资源来重新启动每个容器。 在您的Playbook中:
#restart_app_containers.yml - hosts: app_server user: {{ privileged_user }} gather_facts: false roles: - restart_app_servers
然后在播放本身:
#restart_app_servers.yml - name: restart app servers docker: name: {{ item }} state: restarted with_items: all_containers
- 在restart_container.yml中,如何“注入”(作为参数/variables传入)节点和容器的名称? 理想情况下,我想运行这个剧本对任何节点和任何容器。
对于这部分你需要直接引用你的容器,你需要采取行动。 这可以通过dynamic库存来完成,例如
#sample.yml - hosts: Tag_name_{{ public_name }} user: {{ privileged_user }} gather_facts: false roles: - example
如果你在AWS上。 主机字典会因基础设施而异。 然后在你列出的实际玩法中,你可以传入特定的variables。 由于它是单个主机上的单个容器,因此可以通过命令行执行此操作:
ansible-playbook -i $INVENTORY_FILE -e container_name=$CONTAINER_NAME restart_single_container_on_single_host.yml
你的游戏看起来像这样:
- name: restart a specific container docker: name: {{ container_name }} state: restarted