我有以下代码连接到记录器服务haproxies并消耗第一个记录器虚拟机。Ansible使用当前主机的任务作为变量
然后在一个单独的任务中连接到主机的记录器列表,其中第一个主机已耗尽并执行服务重新加载。
- name: Haproxy Warmup
hosts: role_max_logger_lb
tasks:
- name: analytics-backend 8300 range
haproxy: 'state=disabled host=maxlog-rwva1-{{ env }}-1.example.com backend=analytics-backend socket=/var/run/admin.sock'
become: true
when: warmup is defined and buildnum is defined
- name: logger-backend 8200
haproxy: 'state=disabled host=maxlog-rwva1-prod-1.example.com :8200 backend=logger-backend socket=/var/run/admin.sock'
become: true
when: warmup is defined and buildnum is defined
- name: Warmup Deploy
hosts: "role_max_logger"
serial: 1
tasks:
- shell: pm2 gracefulReload max-logger
when: warmup is defined and buildnum is defined
- pause: prompt="First host has been deployed to. Please verify the logs before continuing. Ctrl-c to exit, Enter to continue deployment."
when: warmup is defined and buildnum is defined
此代码是非常糟糕的,当我尝试将它扩大到与几个haproxies几个服务做滚动重启不起作用。我需要以某种方式从haproxy后端消耗所有应用程序虚拟机的33%,然后连接到不同的列表并在那里执行33%的重新启动过程。然后恢复到排空列表的34-66%,然后在重新启动列表中以34%和66%恢复。
- name: 33% at a time drain
hosts: "role_max_logger_lb"
serial: "33%"
tasks:
- name: analytics-backend 8300 range
haproxy: 'state=disabled host=maxlog-rwva1-prod-1.example.com
backend=analytics-backend socket=/var/run/admin.sock'
become: true
when: warmup is defined and buildnum is defined
- name: logger-backend 8200
haproxy: 'state=disabled host=maxlog-rwva1-prod-1.example.com:8200 backend=logger-backend socket=/var/run/admin.sock'
become: true
when: buildnum is defined and service is defined
- name: 33% at a time deploy
hosts: "role_max_logger"
serial: "33%"
tasks:
- shell: pm2 gracefulReload {{ service }}
when: buildnum is defined and service is defined
- pause: prompt="One third of machines in the pool have been deployed to. Enter to continue"
我可以在厨师做到这一点很容易,只是查询在给定角色注册的所有节点厨师服务器,做我所有的逻辑在现实红宝石。如果重要的话,我在这里打电话的主机名单实际上是从我的厨师服务器上撕下来的,并以json的形式提供。
我不知道什么是适当的Ansible方式做到这一点,而无需放入任意脚本来完成所有肮脏的工作。
我在想,也许我可以在部署中的Ansible中的shell命令里面做一些超级黑客行为,如果有一种方法可以将正在处理的当前主机从主机中取出列表,就像Chef中的节点['fqdn']的Ansible等价物。
ssh maxlog-lb-rwva1-food-1.example.com 'echo "disable server logger-backend/maxlog-rwva1-food-1.example.com:8200" | socat stdio /run/admin.sock'
或者,也许有一种方法可以让我换我整个事情的串行33%,包括子扮演的是做事情。有点像这一点,但再次我不知道如何正确地在我的应用程序服务器的thirded列表通过分次
- name: Deployer
hosts: role_max_logger
serial: "33%"
- include: drain.yml
- include: reboot.yml
基本上我不知道我在做什么内,我可以想出一系列试图做到这一点的方法,但它们看起来都很糟糕,而且过于沉闷。如果我要走上这些破烂不堪的道路,我最好还是写一个大的shell脚本或实际的红宝石来做这件事。
为此,阅读大量官方Ansible文档已经过分简化了并非真正映射到我的情况的示例。 特别是在这里负载平衡器与应用程序服务器位于同一主机上。
- hosts: webservers
serial: 5
tasks:
- name: take out of load balancer pool
command: /usr/bin/take_out_of_pool {{ inventory_hostname }}
delegate_to: 127.0.0.1
http://docs.ansible.com/ansible/playbooks_delegation.html
我想我的问题是:
- 是否有Ansible相当于厨师的节点[ '名称']使用当前正在处理的主机作为变量
- 我只是完全脱离了轨道,我是如何试图做到这一点?
你的假设是正确的。但这实际上是我试图避免的:需要使用Ansible自身功能外部的脚本。 在Ansible世界中,常见的做法是将主机名和变量传递到脚本中,以完成大部分这样的工作? 在什么时候你只要在真正的Python中编写你自己的Ansible模块来完成一项任务? –
这只是一个伪代码。您可以使用任何可用的模块进行委派,例如'haproxy'。只需将'{{inventory_hostname}}或(其他变量,请参阅techraf的答案)作为'haproxy'的'host'参数。 –