基本 sql 查询以及如何在 playbook 的清单文件中使用它来获取列表/元素=字典

问题描述 投票:0回答:1

这是基于一个简单的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-2.x
1个回答
0
投票

您可以使用 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
变量包含循环中当前主机的名称。

© www.soinside.com 2019 - 2024. All rights reserved.