Ansible使用当前主机将任务作为变量

时间:2017-05-09 06:55:57

标签: deployment ansible haproxy

我有以下代码连接到记录器服务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

我想我的问题是:

  • 是否有Ansible等同于Chef的节点[' fqdn']将当前正在处理的主机用作变量
  • 我是否完全不知道我是怎么做到的?

2 个答案:

答案 0 :(得分:2)

  

是否有Ansible等效的Chef节点['fqdn']将当前正在处理的主机用作变量

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