我有以下代码连接到记录器服务haproxies并排空第一个记录器VM。
然后在一个单独的任务中连接到主机的记录器列表,其中第一个主机被耗尽并重新加载服务。
- 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后端以某种方式耗尽所有应用VM的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"
我可以在Chef中更容易地做到这一点,只需查询Chef服务器以查找在给定角色中注册的所有节点,并在真正的ruby中完成我的所有逻辑。如果主机列表很重要,我在这里打电话实际上是从我的Chef服务器上扯下来的,并以json的形式输入。
我不知道什么是正确的Ansible方式,而不能使用任意脚本来完成所有肮脏的工作。
我想也许我可以在部署的Ansible中的shell命令中做一些像hacky这样的东西,如果有一种方法可以将正在处理的当前主机拉出主机列表,这可能会有效,就像Chef中的Ansible等效节点[' fqdn']。
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%的连续剧中,并包含做事情的子剧本。有点像这样,但我再也不知道如何在子播放中正确传递我的app服务器列表
- name: Deployer
hosts: role_max_logger
serial: "33%"
- include: drain.yml
- include: reboot.yml
基本上我不知道我在做什么,我可以想到尝试这样做的一些方法,但它们看起来都很可怕而且过于迟钝。如果我要沿着这条崎岖不平的道路走下去,我可能最好只写一个大的shell脚本或实际的红宝石来做这件事。
为此阅读了大量官方Ansible文档,过分简化了不能真正映射到我的情况的示例。 特别是负载均衡器与app服务器位于同一主机上。
- 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
我想我的问题是:
答案 0 :(得分:2)
是否有Ansible等效的Chef节点['fqdn']将当前正在处理的主机用作变量
ansible_hostname
,ansible_fqdn
(均来自实际机器设置)或inventory_hostname
(在广告资源文件中定义),具体取决于您要使用的内容。
答案 1 :(得分:1)
正如您所正确指出的,您需要使用委托来执行此任务。
以下是一些伪代码:
- name: 33% at a time deploy
hosts: role_max_logger
serial: 33%
tasks:
- name: take out of lb
shell: take_out_host.sh --name={{ inventory_hostname }}
delegate_to: "{{ item }}"
with_items: "{{ groups['role_max_logger_lb'] }}"
- name: reload backend
shell: reload_service.sh
- name: add back to lb
shell: add_host.sh --name={{ inventory_hostname }}
delegate_to: "{{ item }}"
with_items: "{{ groups['role_max_logger_lb'] }}"
我假设组role_max_logger
定义了要重新加载后端服务的服务器,组role_max_logger_lb
定义了带有负载均衡器的服务器。
这个剧本从role_max_logger
获取所有主持人,将它们分成33%的批次;然后对于批处理中的每个主机,它在每个负载均衡器上执行take_out_host.sh
,将当前后端主机名作为参数传递;在负载均衡器上禁用当前批次的所有主机后,将重新加载后端服务;之后,主机会像第一个任务一样被添加回LB.然后对每批次重复此操作。