我正在尝试解决如何列出并使用EC2已停止的实例执行某些操作。 ec2_remote_facts是我的朋友,我可以从中获得结果。但作为一个安心的菜鸟我不能为我的生活找到如何获得返回对象的'id'组成部分。文档是粗略的,不包括返回什么类型的东西以及如何使用它。
这是我正在尝试的非常基本的剧本:
---
- name: remote facts
hosts: localhost
tasks:
- ec2_remote_facts:
region: ap-southeast-2
register: info
- name: print
debug: var=info
这很好用。
这也有效:
---
- name: remote facts
hosts: localhost
tasks:
- ec2_remote_facts:
region: ap-southeast-2
register: info
- name: print
debug: var=info.instances[0].id
我无法理解的是咒语为我提供了所有当前实例的'id'元素(3)所以我可以对所有这些实例做其他事情 - 删除,配置,启动等等。我已经看过所有循环结构和with_ *选项,我无法让它们做任何我想做的事。
毫无疑问,这将是''哦!'任何知道答案的人都会遇到问题,但我现在担心的是我不知道答案。返回的对象如下所示:
ok: [localhost] => {
"info": {
"changed": false,
"instances": [
{
"ami_launch_index": "0",
"architecture": "x86_64",
"client_token": "vpOGxxxxxxxxxxxxxx",
"ebs_optimized": false,
"groups": [
{
"id": "sg-xxxxxxxx",
"name": "launch-wizard-3"
}
],
"hypervisor": "xen",
"id": "i-01xxxxxxxxxxxxxxxx",
[...]
"tags": {},
"virtualization_type": "hvm",
"vpc_id": "vpc-xxxxxxxx"
},
{
"ami_launch_index": "1",
"architecture": "x86_64",
[snip,另外2个实例]
有人想过吗?
答案 0 :(得分:1)
我怀疑这有点晚了,但我认为你只是忘了在你的with_items变量周围添加“{{}}”。如果我这样做,对我有用,所以:
ec2_remote_facts:
region: "{{ vpc_region }}"
filters:
instance-state-name: running
vpc-id: "{{ vpc_id }}"
register: ec2_info
然后:
set_fact:
jenkins_master_instances: "{{ jenkins_master_instances|default([]) + [ item.id ]}}"
with_items: "{{ ec2_info.instances }}"
似乎对我有用。
答案 1 :(得分:1)
这应该有效:
tasks:
- ec2_remote_facts:
region: ap-southeast-2
register: thefacts
- debug: var=item.id
with_items: "{{thefacts.instances}}"
但会产生大量不必要的调试输出,因为没有理由。 所以让我们过滤掉它:
tasks:
- ec2_remote_facts:
region: ap-southeast-2
register: thefacts
- debug: var=item.0
with_together:
- "{{ thefacts.instances|map(attribute='id')|list }}"
答案 2 :(得分:0)
试试这个应该有效:
- ec2_remote_facts:
region: ap-southeast-2
register: info
- name: print
debug: var=item.id
with_items: info_instances
如果不共享debug: var=info
的完整输出。所以我可以告诉你确切的代码。
此外,如果您想使用ec2
之类的任务来停止实例,请将其用作具有相同循环{{item.instances.id}}
的变量with_items: info_instances
答案 3 :(得分:0)
你在第二次尝试时已经拥有它,有趣的是我有完全相同的问题,但是我的JSON经验让我看到它。
您的第二个代码段:
---
- name: remote facts
hosts: localhost
tasks:
- ec2_remote_facts:
region: ap-southeast-2
register: info
- name: print
debug: var=info.instances[0].id
我的补充:
---
- name: remote facts
hosts: localhost
tasks:
- ec2_remote_facts:
region: ap-southeast-2
register: info
- name: print
debug: var=info.instances[0].id
- name: Create AMI from Instance ID
ec2_ami:
aws_access_key: "{{ aws_access_key }}"
aws_secret_key: "{{ aws_secret_key }}"
region: "{{ region }}"
instance_id: "{{ ec2_remote_facts.instances[0].id }}"
欢呼帮助我解决这个问题哈哈。
Ansible的输出:
(ansible27) user@user:/etc/ansible/playbooks$ sudo ansible-playbook ec2_facts.yml
[WARNING]: Found both group and host with same name: localhost
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [EC2 Remote Facts.] *******************************************************
ok: [localhost]
TASK [Display results in JSON format.] *****************************************
ok: [localhost] => {
"changed": false,
"msg": "Most upto date instance is: i-1234567abcdefg "
}
TASK [Create AMI from instance ID.] ********************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=4 changed=1 unreachable=0 failed=0
对于你的循环问题,我假设它只是传递[1]和[2]元素说明符的情况。
答案 4 :(得分:0)
花了很多时间研究这个问题,使用Ansible Jinja2过滤器实际上非常简单。
这应该有效:
- name: DEBUG
debug:
var: info |json_query('instances[*].id')
这里描述的一些非常有用的过滤:http://docs.ansible.com/ansible/latest/playbooks_filters.html#other-useful-filters
答案 5 :(得分:0)
感谢@ hit3k
我对您的代码做了一些更改,以使其在Ansible 2.7.10下工作
- name: print the variable name
debug: msg= "{{ item.0 }}"
with_items: "{{ ec2_metadata.instances|map(attribute='instance_id')|list }}"
结果:
ok: [vpc.prod.dr] => (item=i-0739f6a14abc1e7d9) => {}
ok: [vpc.prod.dr] => (item=i-04dd1eab60bc03488) => {}
ok: [vpc.prod.dr] => (item=i-09702b90ed31cf00f) => {}
ok: [vpc.prod.dr] => (item=i-05bcaf44b1598aadd) => {}
ok: [vpc.prod.dr] => (item=i-085bfe50d2c6e5c88) => {}
ok: [vpc.prod.dr] => (item=i-0237a96d2e8869d13) => {}
ok: [vpc.prod.dr] => (item=i-0769c21225acfac01) => {}
ok: [vpc.prod.dr] => (item=i-09c55f3c6776ff263) => {}
ok: [vpc.prod.dr] => (item=i-0e8faa6ffb085558f) => {}
ok: [vpc.prod.dr] => (item=i-07e68c8c201fc6021) => {}
ok: [vpc.prod.dr] => (item=i-011a94a276e70d92c) => {}
ok: [vpc.prod.dr] => (item=i-05672115214b129bd) => {}
ok: [vpc.prod.dr] => (item=i-0cbe6652ee855f14d) => {}
ok: [vpc.prod.dr] => (item=i-055ff968821cca086) => {}
ok: [vpc.prod.dr] => (item=i-0c9a7db7a8142c240) => {}
ok: [vpc.prod.dr] => (item=i-02ca647fe24ad6c56) => {}
ok: [vpc.prod.dr] => (item=i-054542fcef48629a0) => {}
ok: [vpc.prod.dr] => (item=i-0a095641b04538a73) => {}
ok: [vpc.prod.dr] => (item=i-05434bac67259041c) => {}