AWS EC2 外部 inventory 脚本2
inventory 文件的核心部分,是一些名字到目的地址的映射.默认的 ec2.ini 设置适用于在 EC2 之外运行 Ansible(比如一台笔记本电脑),但这不是最有效的方式.
在 EC2 内部运行 Ansible 时,内部的 DNS 名和 IP 地址比公共 DNS 名更容易理解.你可以在 ec2.ini 文件中修改 destination_variable 变量, 改为一个实例的私有 DNS 名.对于在私有子网的 VPC 上运行 Ansible ,这种设置很重要,使得我们可以使用内部IP地址之外的方式访问到一个VPC.在 ec2.ini 文件中, vpc_destination_variable 可以命名为任意一个 boto.ec2.instance 变量.
EC2 外部 inventory 提供了一种从多个组到实例的映射:
全局 实例都属于 ec2 这个组.
实例ID
例如: i-00112233 i-a1b1c1d1
Region
属于一个 AWS region 的所有实例构成的一个组. 例如: us-east-1 us-west-2
可用性区域
所有属于 availability zone 的实例构成一个组. 例如: us-east-1a us-east-1b
安全组
实例可属于一个或多个安全组.每一个组的前缀都是 security_group_ ,符号(-) 已被转换为(_). with all characters except alphanumerics (这句没明白)例如: security_group_default security_group_webservers security_group_Pete_s_Fancy_Group
标签
每一个实例可有多个不同的 key/value 键值对,这些键值对被称为标签.标签名可以随意定义,最常见的标签是 ‘Name’.每一个键值对是这个实例自己的组. 特殊字符已转换为下划线,格式为 tag_KEY_VALUE 例如: tag_Name_Web tag_Name_redis-master-001``tag_aws_cloudformation_logical-id_WebServerGroup
使用 Ansible 与指定的服务器进行交互时,EC2 inventory 脚本被再次调用(调用时加上了命令行选项--host HOST ),这个调用会在索引缓存中进行查找,获取实例 ID,然后调用 API 访问 AWS,获取指定实例的所有信息.这些信息被转换为 playbooks 中的变量,可以进行访问.每一个变量的前缀为 ec2_,下面是一些变量的示例:
- ec2_architecture
- ec2_description
- ec2_dns_name
- ec2_id
- ec2_image_id
- ec2_instance_type
- ec2_ip_address
- ec2_kernel
- ec2_key_name
- ec2_launch_time
- ec2_monitored
- ec2_ownerId
- ec2_placement
- ec2_platform
- ec2_previous_state
- ec2_private_dns_name
- ec2_private_ip_address
- ec2_public_dns_name
- ec2_ramdisk
- ec2_region
- ec2_root_device_name
- ec2_root_device_type
- ec2_security_group_ids
- ec2_security_group_names
- ec2_spot_instance_request_id
- ec2_state
- ec2_state_code
- ec2_state_reason
- ec2_status
- ec2_subnet_id
- ec2_tag_Name
- ec2_tenancy
- ec2_virtualization_type
- ec2_vpc_id
其中 ec2_security_group_ids 和 ec2_security_group_names 变量的值为所有安全组的列表,使用逗号分隔.每一个 EC2 标签是一个格式为 ec2_tag_KEY 的变量.
要查看一个实例的完整的可用变量的列表,执行脚本:
cd plugins/inventory
./ec2.py --host ec2-12-12-12-12.compute-1.amazonaws.com注意,AWS inventory 脚本会将结果进行缓存,以避免重复的 API 调用,这个缓存的设置可在 ec2.ini 文件中配置.要显式地清空缓存,你可以加上 --refresh-cache 选项,执行脚本如下:
# ./ec2.py --refresh-cache
学员评价