我正在使用Ansible EC2动态库存脚本来访问EC2中的主机 . 我正在寻找的主机有一个名为 sisyphus_environment 的标签,其值为 development ,另一个标签为 sisyphus_project ,其值为 reddot ,所以我需要这些标签的交集 .

但是,我似乎无法过滤使用EC2清单正常工作的一个标签 .

我可以使用AWS CLI清楚地找到有问题的实例:

$ aws ec2 describe-instances --filters \
        Name=tag:sisyphus_environment,Values=development \
        Name=tag:sisyphus_project,Values=reddot \
        Name=tag:sisyphus_role,Values=nginx | \
    jq '.Reservations[].Instances[] | { InstanceId: .InstanceId }'
{
  "InstanceId": "i-deadbeef"
}
{
  "InstanceId": "i-cafebabe"
}

我试图用Ansible做同样的事情表示为一个静态组,由这些标签过滤的动态成员组成 .

我的ansible.cfg:

[defaults]
retry_files_enabled = false
roles_path = roles:galaxy_roles
inventory = inventory/

[ssh_connection]
ssh_args = -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no

我的EC2库存is directly sourced from upstream以及ec2.ini .

我的库存目录如下所示:

$ tree inventory/
inventory/
├── ec2.ini
├── ec2.py
└── inventory.ini

0 directories, 3 files

我必须将 inventory 命名为 .ini 扩展名,否则Ansible会尝试将其加载为YAML并失败 .

我的 inventory/inventory.ini 文件如下所示:

[tag_sisyphus_project_reddot]
# blank

[reddot:children]
tag_sisyphus_project_reddot

这完成similar to Ansible's documentation on the matter . 不幸的是,这件事很简单:

$ inventory/ec2.py --refresh-cache
...
$ ansible reddot -m command -a 'echo true'
 [WARNING]: No hosts matched, nothing to do

如果我通过标签查询,我会得到结果:

$ ansible tag_sisyphus_project_reddot -m command -a 'echo true'
10.0.0.1 | SUCCESS | rc=0 >>
true
...

我缺少一步吗?

我的Ansible版本:

$ ansible --version
ansible 2.2.0.0
  config file = /home/naftuli/Documents/Development/ansible-reddot/ansible.cfg
  configured module search path = Default w/o overrides