我有一个剧本,我首先在其中运行 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 变量中,并希望在这些主机上运行我的第二套剧本。
答案 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
使控制流适合您的需要。