Ansible,将主机列表保存到变量中

时间:2021-05-01 20:04:29

标签: sql sql-server linux ansible

我有一个剧本,我首先在其中运行 SQL 语句以从数据库中获取主机列表。然后我将该列表保存到一个变量中,并希望在此主机列表上运行下一组任务。但我不确定如何执行此操作,或者是否可以将主机动态定义为 Ansible 变量?

以下是我的代码片段以及我正在尝试做的事情。

---
- hosts: all
  gather_facts: no
  tasks:

  - name: Get list of hosts
    command: sqlcmd -d testDB -q "SET NOCOUNT ON; SELECT DISTINCT HostName FROM Servers" -S "Central_Server" -h -1
    register: sql_servers

- hosts: '{{ sql_servers.stdout_lines }}'
  serial: 1
  gather_facts: no
  tasks:
........

other tasks

........

在上面的代码中,我试图将主机列表保存到 sql_servers 变量中,并希望在这些主机上运行我的第二套剧本。

1 个答案:

答案 0 :(得分:2)

您正在使用 hosts: all 运行该剧。这意味着可能有更多的主机,因此也会有更多的 sql_servers 列表。让我们连接列表。例如,无论列表的来源是什么,给定清单

shell> cat hosts
srv1 sql_servers='["a", "b"]'
srv2 sql_servers='["c", "a"]'
srv3 sql_servers='["e", "b"]'

剧情

- hosts: all
  tasks:
    - set_fact:
        srvs: "{{ ansible_play_hosts|
                  map('extract', hostvars, 'sql_servers')|
                  flatten|unique }}"
      run_once: true

给予

  srvs:
  - a
  - b
  - c
  - e

现在,使用 add_host 并创建组 sql_servers

    - add_host:
        hostname: "{{ item }}"
        groups: sql_servers
      loop: "{{ srvs }}"
      run_once: true

在下一场比赛中使用这个组。完整的简化剧本

- hosts: all
  tasks:
    - add_host:
        hostname: "{{ item }}"
        groups: sql_servers
      loop: "{{ ansible_play_hosts|
                map('extract', hostvars, 'sql_servers')|
                flatten|unique }}"
      run_once: true

- hosts: sql_servers
  tasks:
    - debug:
        var: ansible_play_hosts_all
      run_once: true

给予

  ansible_play_hosts_all:
  - a
  - b
  - c
  - e

使控制流适合您的需要。

相关问题