我正在编写我的第一本Ansible剧本,并且需要一些转向.我有一个由3个VM组成的简单网络:
ansible01 - 我的Ansible服务器(Ubuntu)db01 - 一个DB(再次,Ubuntu)myapp01 - 托管Java应用程序的Ubuntu VM我已经/etc/ansible/hosts像这样配置了我的文件:
[databases]
db01.example.com
[app_servers]
myapp01.example.com
myapp02.example.com
Run Code Online (Sandbox Code Playgroud)
我已正确配置SSH,我可以运行ansible all ping -m,Ansible能够ping数据库和应用服务器节点.到现在为止还挺好.
我正在尝试编写三(3)个与Docker相关的剧本,它们将完成以下任务:
[databases]节点以及所有[ app_servers]节点; 如果没有安装并运行,则安装Docker引擎并开始运行它.如果已安装但未运行,请重新启动它.[app_servers]节点上运行的所有容器.myapp01有2个容器在其上运行,fizz并且buzz.我希望能够告诉Ansible重新启动(特别)myapp01的fizz容器,但不是它的buzz容器,也没有任何myapp02的容器.我相信这些属于三个单独的剧本(如果我错了或者有更好的方法,请纠正我).我对他们进行了刺伤.首先是setup_docker.yml:
- name: ensure docker engine is installed and running
docker:
name: *
state: started
Run Code Online (Sandbox Code Playgroud)
然后重新启动所有[databases],在restart_app_servers.yml:
- name: restart app servers
docker:
name: app_servers
state: restarted
Run Code Online (Sandbox Code Playgroud)
并且要在单个节点上重新启动任意容器(restart_container.yml):
- name: restart a specific container
docker:
name: %name_of_container_and node%
state: restarted
Run Code Online (Sandbox Code Playgroud)
但这里有几个问题:
setup_docker.yml,如何指定所有节点类型([databases]和[app_servers])应该受到影响?我知道星号("*")不正确.restart_app_servers.yml,该name领域的适当价值是什么?我如何告诉Ansible重启所有app_server节点?restart_container.yml,如何"注入"(作为参数/变量传入)节点和容器的名称?理想情况下,我想对任何节点和任何容器运行此playbook.提前致谢!
我认为你在这里有戏剧和剧本的含义.您在上面指定的三件事,setup_docker.yml,restart_app_servers.yml和restart_container.yml似乎是Plays.我建议创建一个Docker角色,其中包含您在此处详述的任务.
解决您的问题:
这是在Playbook级别完成的.您可以指定要由哪些任务影响的主机,例如:
#docker.yml
- hosts: all
user: {{ privileged_user }}
gather_facts: false
roles:
- install_docker
Run Code Online (Sandbox Code Playgroud)
然后在你的install_docker角色中,你会有以下几点:
- 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
Run Code Online (Sandbox Code Playgroud)
我假设你想要重新启动属于app-server组的每个节点上的所有Docker容器?我会保留每个组的所有容器名称的清单(因为这个例子相对简单).例如:
#group_vars/app-server
all_containers: [ 'container1', 'container2', 'container3',.. 'containern' ]
Run Code Online (Sandbox Code Playgroud)
从这里,您可以在Play中使用此库存重新启动每个容器.在您的Playbook中:
#restart_app_containers.yml
- hosts: app_server
user: {{ privileged_user }}
gather_facts: false
roles:
- restart_app_servers
Run Code Online (Sandbox Code Playgroud)
然后在Play本身:
#restart_app_servers.yml
- name: restart app servers
docker:
name: {{ item }}
state: restarted
with_items: all_containers
Run Code Online (Sandbox Code Playgroud)
对于此部分,您需要直接引用您需要采取行动的容器.这可以通过动态库存来完成,例如
#sample.yml
- hosts: Tag_name_{{ public_name }}
user: {{ privileged_user }}
gather_facts: false
roles:
- example
Run Code Online (Sandbox Code Playgroud)
如果您在AWS上.主机词典因基础设施而异.然后在你列出的实际游戏中,你可以传入特定的变量.由于它是单个主机上的单个容器,因此您可以通过命令行执行此操作:
ansible-playbook -i $INVENTORY_FILE -e container_name=$CONTAINER_NAME restart_single_container_on_single_host.yml
Run Code Online (Sandbox Code Playgroud)
你的Play看起来像这样:
- name: restart a specific container
docker:
name: {{ container_name }}
state: restarted
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1893 次 |
| 最近记录: |