美文网首页
腾讯云(cvm) Ansible Dynamic Invento

腾讯云(cvm) Ansible Dynamic Invento

作者: 偷油考拉 | 来源:发表于2023-05-28 14:44 被阅读0次
官方文档

working-with-dynamic-inventory
inventory-plugins
developing_inventory

红帽文档

ansible-dynamic-inventories
ansible-dynamic-inventory-python
ansible-plugin-inventory-files

一、使用

安装依赖:
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
python get-pip.py
pip install boto3 botocore

主要研究调用、开发py脚本,使用范例如下
https://docs.ansible.com/ansible/latest/inventory_guide/intro_dynamic_inventory.html#inventory-script-example-openstack

ansible -i openstack_inventory.py all -m ansible.builtin.ping

inventory plugins 的使用稍后介绍

二、自定义脚本开发

https://docs.ansible.com/ansible/latest/dev_guide/developing_inventory.html#developing-inventory-scripts

1) 脚本输出要求

Inventory scripts 必须接受 --list and --host <hostname> 参数。脚本也可以带其他参数,但是 Ansible 不会用到。

当使用参数 --list 时,脚本须输出一个JSON对象,包含要管理的所有组。每个组的值应该是一个对象 or 一个主机列表,对象包含主机列表、子组和组变量:

{
    "group001": {
        "hosts": ["host001", "host002"],
        "vars": {
            "var1": true
        },
        "children": ["group002"]
    },
    "group002": {
        "hosts": ["host003","host004"],
        "vars": {
            "var2": 500
        },
        "children":[]
    }

}

如果组中的任何元素为空,则可以从输出中省略它们。
脚本通过 --list 返回如上, ansible 就可以运行了。
https://docs.ansible.com/ansible/latest/dev_guide/developing_inventory.html#inventory-script-conventions

当使用参数 --host <hostname> 时,脚本须打印一个JSON对象,该对象要么为空,要么包含变量以使它们可用于templates and playbooks。比如:

{
    "VAR001": "VALUE",
    "VAR002": "VALUE"
}

打印变量是可选的。如果脚本不打印变量,那么它应该打印一个空的JSON对象。

https://docs.ansible.com/ansible/latest/dev_guide/developing_inventory.html#tuning-the-external-inventory-script

2) 写一个脚本

依赖:
pip install tencentcloud-sdk-python

三、inventory plugins 使用简介

ansible-doc -t inventory -l 查看可用插件;
ansible-doc -t inventory <plugin name> 查看指定插件使用文档;

下面以 aws 为例:

[root@VM_99_101_centos ~]# ansible-doc -t inventory -l
nmap                Uses nmap to find hosts to target                                                                                                                                                                                                                  
host_list           Parses a 'host list' string                                                                                                                                                                                                                        
hcloud              Ansible dynamic inventory plugin for the Hetzner Cloud                                                                                                                                                                                             
openstack           OpenStack inventory source                                                                                                                                                                                                                         
vultr               Vultr inventory source                                                                                                                                                                                                                             
aws_ec2             EC2 inventory source                                                                                                                                                                                                                               
... 略
[root@VM_99_101_centos ~]# ansible-doc -t inventory aws_ec2
> AWS_EC2    (/usr/lib/python2.7/site-packages/ansible/plugins/inventory/aws_ec2.py)

        Get inventory hosts from Amazon Web Services EC2. Uses a YAML configuration file that ends with `aws_ec2.(yml|yaml').

... 略

创建 demo.aws_ec2.yml 作为 inventory_source,如下:

# Minimal example using environment vars or instance role credentials
# Fetch all hosts in us-east-1, the hostname is the public DNS if it exists, otherwise the private IP address
plugin: aws_ec2
regions:
  - ap-southeast-1
aws_access_key: AKIASQVFPHD7RJZ6VRNN
aws_secret_key: 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

执行 ansible-inventory -i demo.aws_ec2.yml --graph 查看主机

[root@VM_99_101_centos ~]# ansible-inventory -i demo.aws_ec2.yml --graph
@all:
  |--@aws_ec2:
  |  |--ec2-54-251-25-60.ap-southeast-1.compute.amazonaws.com
  |--@ungrouped:

执行 ansible-inventory -i demo.aws_ec2.yml --list 查看所有主机详细信息

[root@VM_99_101_centos ~]# ansible-inventory -i demo.aws_ec2.yml --list
{
    "_meta": {
        "hostvars": {
            "ec2-54-251-25-60.ap-southeast-1.compute.amazonaws.com": {
                "ami_launch_index": 0, 
                "architecture": "x86_64", 
                "block_device_mappings": [
                    {
                        "device_name": "/dev/sda1", 
                        "ebs": {
                            "attach_time": "2022-11-11T16:43:48+00:00", 
                            "delete_on_termination": true, 
                            "status": "attached", 
                            "volume_id": "vol-0b90f9db3ee65ed86"
                        }
                    }
                ], 
                "capacity_reservation_specification": {
                    "capacity_reservation_preference": "open"
                }, 
                "client_token": "4a1146a1-3fb7-495d-9280-eb238587b79a", 
                "cpu_options": {
                    "core_count": 1, 
                    "threads_per_core": 1
                }, 
                "ebs_optimized": false, 
                "ena_support": true, 
                "enclave_options": {
                    "enabled": false
                }, 
                "hibernation_options": {
                    "configured": false
                }, 
                "hypervisor": "xen", 
                "image_id": "ami-07651f0c4c315a529", 
                "instance_id": "i-065925eccd49c4fa0", 
                "instance_type": "t2.micro", 
                "key_name": "aws-robin", 
                "launch_time": "2022-11-11T16:43:47+00:00", 
                "metadata_options": {
                    "http_endpoint": "enabled", 
                    "http_put_response_hop_limit": 1, 
                    "http_tokens": "optional", 
                    "state": "applied"
                }, 
                "monitoring": {
                    "state": "disabled"
                }, 
                "network_interfaces": [
                    {
                        "association": {
                            "ip_owner_id": "amazon", 
                            "public_dns_name": "ec2-54-251-25-60.ap-southeast-1.compute.amazonaws.com", 
                            "public_ip": "54.251.25.60"
                        }, 
                        "attachment": {
                            "attach_time": "2022-11-11T16:43:47+00:00", 
                            "attachment_id": "eni-attach-0f30ee3f8ee78b9bb", 
                            "delete_on_termination": true, 
                            "device_index": 0, 
                            "network_card_index": 0, 
                            "status": "attached"
                        }, 
                        "description": "", 
                        "groups": [
                            {
                                "group_id": "sg-0a4bbb4a6ebd28e51", 
                                "group_name": "launch-wizard-3"
                            }
                        ], 
                        "interface_type": "interface", 
                        "ipv6_addresses": [], 
                        "mac_address": "06:a0:44:60:cb:0c", 
                        "network_interface_id": "eni-08da0e84ee48b42aa", 
                        "owner_id": "173219461375", 
                        "private_dns_name": "ip-172-31-44-53.ap-southeast-1.compute.internal", 
                        "private_ip_address": "172.31.44.53", 
                        "private_ip_addresses": [
                            {
                                "association": {
                                    "ip_owner_id": "amazon", 
                                    "public_dns_name": "ec2-54-251-25-60.ap-southeast-1.compute.amazonaws.com", 
                                    "public_ip": "54.251.25.60"
                                }, 
                                "primary": true, 
                                "private_dns_name": "ip-172-31-44-53.ap-southeast-1.compute.internal", 
                                "private_ip_address": "172.31.44.53"
                            }
                        ], 
                        "source_dest_check": true, 
                        "status": "in-use", 
                        "subnet_id": "subnet-d1fcfe98", 
                        "vpc_id": "vpc-98daf3ff"
                    }
                ], 
                "owner_id": "173219461375", 
                "placement": {
                    "availability_zone": "ap-southeast-1a", 
                    "group_name": "", 
                    "region": "ap-southeast-1", 
                    "tenancy": "default"
                }, 
                "private_dns_name": "ip-172-31-44-53.ap-southeast-1.compute.internal", 
                "private_ip_address": "172.31.44.53", 
                "product_codes": [], 
                "public_dns_name": "ec2-54-251-25-60.ap-southeast-1.compute.amazonaws.com", 
                "public_ip_address": "54.251.25.60", 
                "requester_id": "", 
                "reservation_id": "r-04a46ce11dfd49283", 
                "root_device_name": "/dev/sda1", 
                "root_device_type": "ebs", 
                "security_groups": [
                    {
                        "group_id": "sg-0a4bbb4a6ebd28e51", 
                        "group_name": "launch-wizard-3"
                    }
                ], 
                "source_dest_check": true, 
                "state": {
                    "code": 16, 
                    "name": "running"
                }, 
                "state_transition_reason": "", 
                "subnet_id": "subnet-d1fcfe98", 
                "tags": {}, 
                "virtualization_type": "hvm", 
                "vpc_id": "vpc-98daf3ff"
            }
        }
    }, 
    "all": {
        "children": [
            "aws_ec2", 
            "ungrouped"
        ]
    }, 
    "aws_ec2": {
        "hosts": [
            "ec2-54-251-25-60.ap-southeast-1.compute.amazonaws.com"
        ]
    }
}
...
    "aws_ec2": {
        "hosts": [
            "ec2-13-213-50-61.ap-southeast-1.compute.amazonaws.com", 
            "ec2-18-136-213-37.ap-southeast-1.compute.amazonaws.com", 
            "ec2-18-139-161-121.ap-southeast-1.compute.amazonaws.com"
        ]
    }
...

执行 ansible-inventory -i demo.aws_ec2.yml --host [host] 查看某个主机详细信息

[root@VM_99_101_centos ~]# ansible-inventory -i demo.aws_ec2.yml --host ec2-54-251-25-60.ap-southeast-1.compute.amazonaws.com
{
    "ami_launch_index": 0, 
    "architecture": "x86_64", 
... 省略 ...
    "state": {
        "code": 16, 
        "name": "running"
    }, 
    "state_transition_reason": "", 
    "subnet_id": "subnet-d1fcfe98", 
    "tags": {}, 
    "virtualization_type": "hvm", 
    "vpc_id": "vpc-98daf3ff"
}

AWS Automation with boto3 of Python and Lambda Functions

https://learn.microsoft.com/en-us/azure/developer/ansible/dynamic-inventory-configure?tabs=azure-cli

https://www.zippyops.com/ansible-dynamic-inventory

使用

ansible -i ec2.py -u ubuntu us-east-1d -m ping
ansible -i ec2.py tag_OS_UBUNTU14 -m ping -u ubuntu – private-key=<keyfilename.pem>
ansible -i ec2.py tag_OS_UBUNTU14 -m shell -a "df -k" -u ubuntu – private-key=<keyfilename.pem>
ansible-playbook playbookname.yml  -i ec2.py -u ubuntu – private-key=<keyfilename.pem>
ansible --inventory scripts/nmap_inventory.py --user josevnz -m ping all
ansible -i openstack_inventory.py all -m ansible.builtin.ping
[root@VM_99_101_centos ~]# ansible all -i demo.aws_ec2.yml -m ping -u ubuntu --private-key='aws-v2ray.pem'
ec2-18-139-161-121.ap-southeast-1.compute.amazonaws.com | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    }, 
    "changed": false, 
    "ping": "pong"
}
ec2-18-136-213-37.ap-southeast-1.compute.amazonaws.com | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    }, 
    "changed": false, 
    "ping": "pong"
}
ec2-13-213-50-61.ap-southeast-1.compute.amazonaws.com | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    }, 
    "changed": false, 
    "ping": "pong"
}

四、Ansible Inventory Script

1) 脚本返回格式

{
    "_meta": {
      "hostvars": {}
    },
    "all": {
      "children": [
        "ungrouped"
      ]
    },
    "ungrouped": {
      "children": [
      ]
    }
}
{
    "_meta": {
      "hostvars": {
        "android-1c5660ab7065af69.home": {
          "ip": "192.168.1.4",
          "ports": []
        },
        "dmaf5.home": {
          "ip": "192.168.1.26",
          "ports": []
        }
      },
      "all": {
        "children": [
          "ungrouped"
        ]
      },
      "ungrouped": {
        "hosts": [
          "android-1c5660ab7065af69.home",
          "dmaf5.home",
          "macmini2",
          "new-host-2.home",
          "new-host-6.home",
          "raspberrypi"
        ]
      }
    }
}
{
    "_meta": {
        "hostvars": {
            "dmaf5.home": {
                "ip": [
                    "192.168.1.26",
                    "192.168.1.25"
                ]
            },
            "macmini2": {
                "ip": [
                    "192.168.1.16"
                ]
            },
            "raspberrypi": {
                "ip": [
                    "192.168.1.11"
                ]
            }
        }
    },
    "all": {
        "children": [
            "ungrouped"
        ]
    },
    "ungrouped": {
        "hosts": [
            "dmaf5.home",
            "macmini2",
            "raspberrypi"
        ]
    }
}

2) 范例脚本 sample.py (自带数据)

#!/usr/bin/python

import os
import sys
import argparse
try:
  import json
except ImportError:
  import simplejson as json

class ExampleInventory(object):
  def __init__(self):
    self.inventory = {}
    self.read_cli_args()
    # Called with `--list`.
    if self.args.list:
      self.inventory = self.example_inventory()
    # Called with `--host [hostname]`.
    elif self.args.host:
      # Not implemented, since we return _meta info `--list`.
      self.inventory = self.empty_inventory()
    # If no groups or vars are present, return empty inventory.
    else:
      self.inventory = self.empty_inventory()
    print json.dumps(self.inventory);
  # Example inventory for testing.
  def example_inventory(self):
   return {
     'group': {
       'hosts': ['ansible2.zippyops.com', 'ansible3.zippyops.com'],
       'vars': {
         'ansible_ssh_user': 'ansible',
         'test_variable': 'nonspecific_value'
       }
     },
     '_meta': {
       'hostvars': {
         'ansible2.zippyops.com': {
          'log_folder': '/var/log'
         },
         'ansible3.zippyops.com': {
           'log_folder': '/var/log2'
         }
       }
     }
   }
  # Empty inventory for testing.
  def empty_inventory(self):
    return {'_meta': {'hostvars': {}}}
  # Read the command line args passed to the script.
  def read_cli_args(self):
    parser = argparse.ArgumentParser()
    parser.add_argument('--list', action = 'store_true')
    parser.add_argument('--host', action = 'store')
    self.args = parser.parse_args()

# Get the inventory.
ExampleInventory()

执行结果

[root@VM_99_101_centos ~]# ./sample1.py --list
{"group": {"hosts": ["ansible2.zippyops.com", "ansible3.zippyops.com"], "vars": {"ansible_ssh_user": "ansible", "test_variable": "nonspecific_value"}}, "_meta": {"hostvars": {"ansible2.zippyops.com": {"log_folder": "/var/log"}, "ansible3.zippyops.com": {"log_folder": "/var/log2"}}}}

[root@VM_99_101_centos ~]# ansible-inventory -i sample1.py --list 
{
    "_meta": {
        "hostvars": {
            "ansible2.zippyops.com": {
                "ansible_ssh_user": "ansible", 
                "log_folder": "/var/log", 
                "test_variable": "nonspecific_value"
            }, 
            "ansible3.zippyops.com": {
                "ansible_ssh_user": "ansible", 
                "log_folder": "/var/log2", 
                "test_variable": "nonspecific_value"
            }
        }
    }, 
    "all": {
        "children": [
            "group", 
            "ungrouped"
        ]
    }, 
    "group": {
        "hosts": [
            "ansible2.zippyops.com", 
            "ansible3.zippyops.com"
        ]
    }
}
[root@VM_99_101_centos ~]# ansible-inventory -i sample1.py --host ansible2.zippyops.com
{
    "ansible_ssh_user": "ansible", 
    "log_folder": "/var/log", 
    "test_variable": "nonspecific_value"
}

[root@VM_99_101_centos ~]# ansible all -i sample1.py -m ping
ansible3.zippyops.com | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname ansible3.zippyops.com: Name or service not known", 
    "unreachable": true
}
ansible2.zippyops.com | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname ansible2.zippyops.com: Name or service not known", 
    "unreachable": true
}

五、腾讯云 inventory script

AWS EC2 范例:
https://github.com/vshn/ansible-dynamic-inventory-ec2/blob/master/ec2.py

1) 脚本

#!/usr/bin/env python
# coding=utf8
import sys
import os
import argparse
import bisect
import re
from time import time
from copy import deepcopy
from datetime import date, datetime

import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.cvm.v20170312 import cvm_client, models

SecretId="xxxxxxxxxxxxxxxxxxxx"
SecretKey="xxxxxxxxxxxxxxxxxxxx"
VpcID="vpc-xxxxxxxx"


class CvmInventory(object):

    def _empty_inventory(self):
        return {"_meta": {"hostvars": {}}}

    def _json_serial(self, obj):
        """JSON serializer for objects not serializable by default json code"""

        if isinstance(obj, (datetime, date)):
            return obj.isoformat()
        raise TypeError("Type %s not serializable" % type(obj))

    def __init__(self):
        ''' Main execution path '''

        # Inventory grouped by instance IDs, tags, security groups, regions,
        # and availability zones
        self.inventory = self._empty_inventory()

        # Get Instance by Region
        self.get_instances_by_vpc(VpcID)

        data_to_print = self.json_format_dict(self.inventory, True)
        print(data_to_print)
        

    def get_instance(self, region, instance_id):
        conn = self.connect(region)

        reservations = conn.get_all_instances([instance_id])
        for reservation in reservations:
            for instance in reservation.instances:
                return instance

    def get_host_info(self):
        ''' Get variables about a specific host '''

        instance = self.get_instance(region, instance_id)
        return self.json_format_dict(self.get_host_info_dict_from_instance(instance), True)

    def get_instances_by_vpc(self, vpcid):
        ''' Makes an AWS EC2 API call to the list of instances in a particular
        region '''
        try:
            cred = credential.Credential(SecretId, SecretKey)
            httpProfile = HttpProfile()
            httpProfile.endpoint = "cvm.tencentcloudapi.com"

            clientProfile = ClientProfile()
            clientProfile.httpProfile = httpProfile
            client = cvm_client.CvmClient(cred, "ap-shanghai", clientProfile)

            req = models.DescribeInstancesRequest()
            #  根据 limit 和 offset 循环获取
            count = 1
            cvmlist = []
            offsetx = 0
            limitx = 20
            params = {
                "Filters": [
                    {
                        "Name": "vpc-id",
                        "Values": [ vpcid ]
                    }
                ],
                "Offset": 0,
                "Limit": limitx
            }
            while offsetx < count:
                if offsetx == 0:
                        params['Offset']=offsetx
                        req.from_json_string(json.dumps(params))
                        resp = client.DescribeInstances(req)
                        resptmp = resp.InstanceSet
                        count=resp.TotalCount
                        offsetx=offsetx+limitx
                else:
                        params['Offset']=offsetx
                        req.from_json_string(json.dumps(params))
                        resp = client.DescribeInstances(req)
                        resp.InstanceSet.extend(resptmp)
                        resptmp = resp.InstanceSet
                        count=resp.TotalCount
                        offsetx=offsetx+limitx

            #print([instance.Uuid for instance in resp.InstanceSet])
            for instance in resp.InstanceSet:
                self.add_instance(instance, vpcid)  
        except TencentCloudSDKException as err:
            print(err)
            


    def add_instance(self, instance, vpcid):
        ''' Adds an instance to the inventory and index, as long as it is
        addressable '''
        dest = instance.PrivateIpAddresses[0]
        hostname = instance.InstanceName
        #print(vars(instance))

        # 按操作系统分组
        if instance.OsName:
            self.push(self.inventory, instance.OsName.split()[0], hostname)
        else:
            self.push(self.inventory, noOS, hostname)


        # 获取 hostname 属性
        self.inventory["_meta"]["hostvars"][hostname] = self.get_host_info_dict_from_instance(instance)
        # 增加 hostname 属性 ansible_host
        self.inventory["_meta"]["hostvars"][hostname]['ansible_host'] = dest

    def push(self, my_dict, key, element):
        ''' Insert an element into an array that may not have been defined in
        the dict. The elements are inserted to preserve asciibetical ordering
        of the array '''
        group_info = my_dict.setdefault(key, [])
        if isinstance(group_info, dict):
            host_list = group_info.setdefault('hosts', [])
            bisect.insort(host_list, element)
        else:
            bisect.insort(group_info, element)


    def get_host_info_dict_from_instance(self, instance):
        instance_vars = {}
        #print(vars(instance))
        instance_vars['instance.OsName'] = instance.OsName
        instance_vars['InstanceName'] = instance.InstanceName
        instance_vars['instance.Tags'] = instance.Tags
        instance_vars['instance.InstanceId'] = instance.InstanceId
        instance_vars['instance.Uuid'] = instance.Uuid
        #instance_vars['instance.Placement'] = instance.Placement
        #instance_vars['instance.InstanceState'] = instance.InstanceState
        #instance_vars['instance.IPv6Addresses'] = instance.IPv6Addresses
        #instance_vars['instance.PublicIpAddresses'] = instance.PublicIpAddresses
        #instance_vars['instance.PrivateIpAddresses'] = instance.PrivateIpAddresses
        #instance_vars['instance.CPU'] = instance.CPU
        #instance_vars['instance.Memory'] = instance.Memory
        #instance_vars['instance.SystemDisk'] = instance.SystemDisk
        #instance_vars['instance.DataDisks'] = instance.DataDisks
        
        for key in vars(instance):
            value = getattr(instance, key)

        return instance_vars


    def json_format_dict(self, data, pretty=False):
        ''' Converts a dict to a JSON object and dumps it as a formatted
        string '''

        if pretty:
            return json.dumps(data, sort_keys=True, indent=2, default=self._json_serial)
        else:
            return json.dumps(data, default=self._json_serial)


if __name__ == '__main__':
    # Run the script
    CvmInventory()

2) 执行

ansible-inventory -i cvm.py --list

[root@VM_99_101_centos ~]# ansible-inventory -i cvm.py --list
{
    "CentOS": {
        "hosts": [
            "GS_APM_out", 
            "GS_mail_reply", 
            "GS_\u7f51\u5173"
        ]
    }, 
    "Ubuntu": {
        "hosts": [
            "GS_webhook_server"
        ]
    }, 
    "_meta": {
        "hostvars": {
            "GS_APM_out": {
                "InstanceName": "GS_APM_out", 
                "ansible_host": "10.68.1.5", 
                "instance.InstanceId": "ins-988wvacj", 
                "instance.OsName": "CentOS 7.8 64\u4f4d", 
                "instance.Tags": [], 
                "instance.Uuid": "0d3e824d-1039-4a0a-9e79-a4a22ed4085e"
            }, 
            "GS_mail_reply": {
                "InstanceName": "GS_mail_reply", 
                "ansible_host": "10.68.100.9", 
                "instance.InstanceId": "ins-aiua9zyd", 
                "instance.OsName": "CentOS 8.0 64\u4f4d", 
                "instance.Tags": [], 
                "instance.Uuid": "8826dd8f-54bd-4ae0-a471-60ac7fa65575"
            }, 
            "GS_webhook_server": {
                "InstanceName": "GS_webhook_server", 
                "ansible_host": "10.68.100.15", 
                "instance.InstanceId": "ins-kmy9rulh", 
                "instance.OsName": "Ubuntu Server 20.04 LTS 64\u4f4d", 
                "instance.Tags": [], 
                "instance.Uuid": "ad2d1b33-62b9-4bd7-9b90-69573ef65337"
            }, 
            "GS_\u7f51\u5173": {
                "InstanceName": "GS_\u7f51\u5173", 
                "ansible_host": "10.68.0.7", 
                "instance.InstanceId": "ins-fgft1u8z", 
                "instance.OsName": "CentOS 8.0 64\u4f4d", 
                "instance.Tags": [], 
                "instance.Uuid": "7a55263a-027d-43b8-bbe9-56c8c42f681f"
            }
        }
    }, 
    "all": {
        "children": [
            "CentOS", 
            "Ubuntu", 
            "ungrouped"
        ]
    }
}

ansible-inventory -i cvm.py --host GS_mail_reply

[root@VM_99_101_centos ~]# ansible-inventory -i cvm.py --host GS_mail_reply
{
    "InstanceName": "GS_mail_reply", 
    "ansible_host": "10.68.100.9", 
    "instance.InstanceId": "ins-aiua9zyd", 
    "instance.OsName": "CentOS 8.0 64\u4f4d", 
    "instance.Tags": [], 
    "instance.Uuid": "8826dd8f-54bd-4ae0-a471-60ac7fa65575"
}

ansible CentOS -i cvm.py -m ping

[root@VM_99_101_centos ~]# ansible CentOS -i cvm.py -m ping
GS_mail_reply | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 10.68.100.9 port 22: Connection timed out", 
    "unreachable": true
}
GS_APM_out | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 10.68.1.5 port 22: Connection timed out", 
    "unreachable": true
}
GS_网关 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 10.68.0.7 port 22: Connection timed out", 
    "unreachable": true
}

相关文章

网友评论

      本文标题:腾讯云(cvm) Ansible Dynamic Invento

      本文链接:https://www.haomeiwen.com/subject/ctylsdtx.html