我正在编写我的第一本Ansible剧本,我需要一点指导。我有一个由3个虚拟机组成的简单网络:
ansible01
- 我的Ansible服务器(Ubuntu)db01
- 一个数据库(再次,Ubuntu)myapp01
- 托管Java应用程序的Ubuntu VM 我已将/etc/ansible/hosts
文件配置为:
[databases]
db01.example.com
[app_servers]
myapp01.example.com
myapp02.example.com
我已正确配置SSH,我可以运行ansible all ping -m
并且Ansible能够ping数据库和应用服务器节点。到目前为止一切都很好。
我正在尝试编写三(3)个与Docker相关的剧本,以实现以下目标:
[databases]
个节点以及所有[app_servers]
个节点上运行;如果没有安装并运行,则安装Docker引擎并开始运行它。如果已安装但未运行,请重新启动它。[app_servers]
个节点上运行的所有容器。myapp01
可能有2个容器,fizz
和buzz
。我希望能够告诉Ansible重启(特别是)myapp01
的{{1}}容器,但不其fizz
容器,也不能buzz
容器1}}容器。我相信这些属于三个独立的剧本(如果我错了或者有更好的方法,请纠正我)。我对他们进行了刺伤。第一个是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
和[databases]
)都应受到影响?我知道星号(“*”)不正确。[app_servers]
中,restart_app_servers.yml
字段的正确值是多少?我如何告诉Ansible重新启动所有name
个节点?app_server
中,如何“注入”(作为参数/变量传入)节点和容器的名称?理想情况下,我想对任何节点和任何容器运行此剧本。提前致谢!
答案 0 :(得分:5)
我认为你的戏剧和剧本在这里意义不一。您在上面指定的三件事,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
然后在你的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
我假设你想要重新启动属于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
然后在Play本身:
#restart_app_servers.yml
- name: restart app servers
docker:
name: {{ item }}
state: restarted
with_items: all_containers
对于此部分,您需要直接引用您需要采取行动的容器。这可以使用动态库存来完成,例如
#sample.yml
- hosts: Tag_name_{{ public_name }}
user: {{ privileged_user }}
gather_facts: false
roles:
- example
如果您在AWS上。主机词典因基础设施而异。 然后在你列出的实际游戏中,你可以传入特定的变量。由于它是单个主机上的单个容器,因此可以通过命令行执行此操作:
ansible-playbook -i $INVENTORY_FILE -e container_name=$CONTAINER_NAME restart_single_container_on_single_host.yml
您的Play看起来像:
- name: restart a specific container
docker:
name: {{ container_name }}
state: restarted