如何使用ec2.py获取ec2主机的动态列表,并使用localhost作为主机。我一遍又一遍地用Google搜索,似乎无法找到一个好的解决方案。我遇到了一些很接近的答案,但似乎都需要将你的任务分解为两个不能同时运行的单独的剧本。
答案 0 :(得分:27)
这不是唯一的解决方案 - 已经提出了有效的建议 - 但是在使用EC2库存插件时我几乎总是在做的事情是利用我认为很多人不知道的Ansible功能:你可以使用一个目录作为库存。
Ansible在目录中查找可执行文件和平面文件并合并其结果。这非常有用,因为您可以使用平面文件为动态组创建漂亮的别名,并在其中添加localhost,可能为其设置一些变量。
$ tree inventory/staging
inventory/staging
├── base
├── ec2.ini
├── ec2.py
└── group_vars -> ../group_vars
文件base
的摘录如下所示:
[localhost]
# I need to tell Ansible which Python on my system has boto for AWS
127.0.0.1 ansible_python_interpreter=/usr/local/bin/python
# The EC2 plugin will populate these groups, but we need to add empty entries
# here to make aliases for them below.
[tag_Stage_staging]
[tag_Role_webserver]
[staging:children]
tag_Stage_staging
[webservers:children]
tag_Role_webserver
然后,您只需指向库存目录:
$ ansible -i inventory/staging webservers -m ec2_facts
# OR
$ export ANSIBLE_HOSTS=inventory/staging
$ ansible webservers -m ec2_facts
答案 1 :(得分:8)
我试图解决类似的问题。
我有一堆主机接受了Ansible主机的连接。出于安全原因,Ansible主机不允许连接到自身。但是,我需要在所有主机上运行Common play。
我指定了所有主机,排除了Ansible主机,然后添加了localhost:
- name: Common
hosts: "tag_name_*:!tag_name_ansible:localhost"
roles:
- common
即使使用EC2库存脚本,添加localhost也能正常工作。我正在使用Ansible 1.7和最新的EC2库存脚本。
答案 2 :(得分:3)
我认为你可以使用ansible-playbook命令的-l
参数来实现你想做的事。
我们做类似的事情,我们使用的ansible-playbook命令看起来与此类似
ansible-playbook -l tag_foo_bar:localhost -U username -i ec2.py playbook.yml
-l
之后的部分只是一个ansible 模式(http://docs.ansible.com/intro_patterns.html),这意味着“限制执行所有带有标记'foo = bar'和localhost主机的实例”。重要的部分是结肠,只是意味着“和”。
答案 3 :(得分:0)
@ches,如果您有多个环境,其实例标记为Role = webserver,则不会起作用。你的命令:
$ ansible -i inventory/staging webservers -m ec2_facts
将获取标记为webserver的每个实例,而不仅仅是那些属于登台环境的实例。如果您只想从分段中选择Web服务器,则仍需要运行:
$ ansible 'staging:&webservers' -i inventory/staging -m ec2_facts
除非我在这里遗漏了什么。