Ansible 运行 基于组多次任务

Ansible run task multiple times based on groups

您如何 运行 每个组的任务,而不是每个组一次?

我排除了 Run this on each host 任务 运行 每个 group_var 值一次。相反,它似乎只是选择一个然后 运行ning 它。

我计划稍后在多个服务器上打破这些,但现在它应该能够 运行 在一个自动缩放上,然后随着需求的增加轻松地将它分解成多个自动缩放组。

playbook.yml:

---
# Run with: ansible-playbook -i localhost, playbook.yml
- name: Register Groups
  hosts: localhost
  connection: local
  tasks:
    - name: Add the groups
      add_host:
        name: localhost
        ansible_connection: local
        groups: rest-api, msg-consumer

- name: Run this on each host
  hosts:
    - rest-api
    - msg-consumer
  tasks:
    - name: Say type
      debug: var=item
      with_items: run_type

group_vars/rest-api:

---
run_type: web

group_vars/msg-consumer:

---
run_type: consumer

输出 Ansible 1.8.2:

$ ansible-playbook -i localhost, playbook.yml

PLAY [Register Groups] ********************************************************

GATHERING FACTS ***************************************************************
ok: [localhost]

TASK: [Add the groups] ********************************************************
ok: [localhost]

PLAY [Run this on each host] **************************************************

GATHERING FACTS ***************************************************************
ok: [localhost]

TASK: [Say type] **************************************************************
ok: [localhost] => (item=consumer) => {
    "item": "consumer"
}

PLAY RECAP ********************************************************************
localhost                  : ok=4    changed=0    unreachable=0    failed=0

注意:可能是别的东西。我想我也可以弄乱我的剧本,但像下面这样分解任务:

---
- name: Register Groups
  hosts: localhost
  connection: local
  tasks:
    - name: Add the groups
      add_host:
        name: localhost
        ansible_connection: local
        groups: rest-api, msg-consumer

- name: Run this on each host
  hosts:
    - msg-consumer
  tasks:
    - name: Say type
      debug: var=item
      with_items: run_type

- name: Run this on each host
  hosts:
    - rest-api
  tasks:
    - name: Say type
      debug: var=item
      with_items: run_type

但是第二个剧本的输出是:

$ ansible-playbook -i localhost, playbook2.yml

PLAY [Register Groups] ********************************************************

GATHERING FACTS ***************************************************************
ok: [localhost]

TASK: [Add the groups] ********************************************************
ok: [localhost]

PLAY [Run this on each host] **************************************************

GATHERING FACTS ***************************************************************
ok: [localhost]

TASK: [Say type] **************************************************************
ok: [localhost] => (item=consumer) => {
    "item": "consumer"
}

PLAY [Run this on each host] **************************************************

GATHERING FACTS ***************************************************************
ok: [localhost]

TASK: [Say type] **************************************************************
ok: [localhost] => (item=consumer) => {
    "item": "consumer"
}

PLAY RECAP ********************************************************************
localhost                  : ok=6    changed=0    unreachable=0    failed=0

编辑:又一次访问数据的尝试,看起来 group_vars 的行为不像我预期的那样。以下输出 consumer 也两次。

-
# Run with: ansible-playbook -i localhost, playbook.yml
- name: Register Groups
  hosts: localhost
  connection: local
  tasks:
    - name: Add the groups
      add_host:
        name: localhost
        ansible_connection: local
        groups: rest-api, msg-consumer

- name: Run this on each host
  hosts:
    - msg-consumer
    - rest-api
  tasks:
    - name: What's your run type
      debug: var=hostvars[groups[item][0]]['run_type']
      with_items: group_names

目前这是我能想到的最好的:

---
- name: Register Groups
  hosts: localhost
  connection: local
  tasks:
    - name: Add new host group
      add_host:
        name: 127.0.0.1
        ansible_connection: local
        groups: new-server
        run_types:
          - rest-api
          - msg-consumer
    - name: Add another new host group
      add_host:
        name: 127.0.0.2
        ansible_connection: local
        groups: new-server
        run_types:
          - nothing

- name: Test Run Types Server 1
  hosts:
    - new-server
  tasks:
    - name: What's your run type
      debug: var=item
      with_items: run_types

注意:主机必须不同才能工作,否则它将覆盖并使用与 add_host 一起使用的最后一个变量值。

请参阅我在 Ansible run task once per database-name 下的回答。

基本上,没有 run_once_per_group,我所知道的最接近的方法是真正的 run_once,它循环组。更复杂的是,没有 group_vars 字典变量。

---
- hosts: all
  tasks:
  - name: "do this once per group"
    delegate_to: localhost
    debug:
      msg: "do something on {{hostvars[groups[item.key].0]['somevar']}} for group named {{item}}"
    run_once: yes
    with_dict: groups
    when: item.key not in ['all', 'ungrouped']

最简单的方法是为主机名使用别名而不是真实主机:

---
- name: Register Groups
  hosts: localhost
  connection: local
  tasks:
    - name: Add the rest-api alias for my app
      add_host:
        name: my-app-rest-api
        ansible_ssh_host: 127.0.0.1
        groups: rest-api

    - name: Add the msg-consumer alias for my app
      add_host:
        name: my-app-msg-consumer
        ansible_ssh_host: 127.0.0.1
        groups: msg-consumer


- name: Test Run Types
  hosts:
    - msg-consumer
    - rest-api
  tasks:
    - name: What's your run type
      debug: msg="Run Type of {{ ansible_ssh_host }} is {{ run_type }}"

现在您可以再次使用您的 group_vars:

group_vars/rest-api:

---
run_type: web

group_vars/msg-consumer:

---
run_type: consumer

输出将是:

PLAY [Register Groups] ******************************************************** 

TASK: [Add the rest-api alias for my app] ************************************* 
ok: [localhost]

TASK: [Add the msg-consumer alias for my app] ********************************* 
ok: [localhost]

PLAY [Test Run Types] ********************************************************* 

TASK: [What's your run type] ************************************************** 
ok: [my-app-msg-consumer] => {
    "msg": "Run Type of 127.0.0.1 is consumer"
}
ok: [my-app-rest-api] => {
    "msg": "Run Type of 127.0.0.1 is web"
}