2017-05-09 93 views
-1

我有以下代码连接到记录器服务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相当于厨师的节点[ '名称']使用当前正在处理的主机作为变量
  • 我只是完全脱离了轨道,我是如何试图做到这一点?

回答

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。然后每个批次重复此操作。

+0

你的假设是正确的。但这实际上是我试图避免的:需要使用Ansible自身功能外部的脚本。 在Ansible世界中,常见的做法是将主机名和变量传递到脚本中,以完成大部分这样的工作? 在什么时候你只要在真正的Python中编写你自己的Ansible模块来完成一项任务? –

+0

这只是一个伪代码。您可以使用任何可用的模块进行委派,例如'haproxy'。只需将'{{inventory_hostname}}或(其他变量,请参阅techraf的答案)作为'haproxy'的'host'参数。 –

1

是否有一个Ansible等效厨师的节点的[“名称”]以使用当前正在处理的主机作为变量

ansible_hostnameansible_fqdn(从实际设备设置两者取)或​​(在清单文件中定义)取决于您要使用的内容。

相关问题