这是基于一个简单的sql查询。
select ip_address from servers where hostname like "web%";
这将返回一组在某种变量中设置的元组。
服务器1:1.1.1.1
服务器2:2.2.2.2
对
服务器1:1.1.1.1
服务器2:2.2.2.2
服务器x:x.x.x.x
现在我想使用此查询来生成清单或直接在剧本中运行它。 如果我知道服务器的数量并且它是固定的,那么我可以根据固定的返回数量提供一个 id 值。 但如果我想要返回每个 ip_address 的 id 增量,那么 playbook 会是什么样子?
已知sql查询结果数量为2
---
- hosts: all
tasks:
- name: add some web servers
when: inventory_hostname in groups["web_servers"]
add_server_cluster:
server_cluster:
name: "web servers"
servers:
-
id: "1"
ip: {{server1}}
-
id: "2"
ip: {{server2}}
sql查询结果数量可变
---
- hosts: all
tasks:
- name: add some web servers
when: inventory_hostname in groups["web_servers"]
add_server_cluster:
server_cluster:
name: "web servers"
servers:
-
id: {{start at 1 and increment for each ip_address returned}}
ip: {{start at first ip_address and continue for all returns}}
您可以使用 Ansible 的动态清单功能。此功能允许您从外部系统动态生成库存。您可以使用 Python 编写自定义动态清单脚本,以从 SQL 数据库获取数据并将其格式化为 Ansible 可以理解的清单格式。
如何执行此操作的基本示例:
#!/usr/bin/env python
import sys
import json
import pymssql
def dynamic_inventory():
conn = pymssql.connect(host='dbsever', user='username', password='password', database='inventory_db')
cursor = conn.cursor()
cursor.execute("select ip_address from servers where hostname like 'web%';")
rows = cursor.fetchall()
inventory = {'all': {'hosts': []}, '_meta': {'hostvars': {}}}
for i, row in enumerate(rows, start=1):
host = {'id': str(i), 'ip': row[0]}
inventory['all']['hosts'].append(host)
inventory['_meta']['hostvars'][host] = host
print(json.dumps(inventory))
if __name__ == "__main__":
dynamic_inventory()
dynamic_inventory
函数连接到SQL数据库,执行SQL查询以获取服务器的IP地址,并以Ansible期望的格式生成库存。然后,它以 JSON 格式打印清单,这正是 Ansible 对动态清单脚本的期望。
要在剧本中使用此脚本,您可以将其传递给
-i
命令的 ansible-playbook
选项:
ansible-playbook -i dynamic_inventory.py playbook.yml
在剧本中,您可以使用
hostvars
变量访问服务器的 IP 地址和 ID:
- hosts: all
tasks:
- name: add some web servers
add_server_cluster:
server_cluster:
name: "web servers"
servers:
-
id: "{{ hostvars[inventory_hostname].id }}"
ip: "{{ hostvars[inventory_hostname].ip }}"
add_server_cluster
任务使用hostvars
变量来访问每个服务器的IP地址和ID。 inventory_hostname
变量包含循环中当前主机的名称。