我怎样才能同时使用ec2.py和localhost

时间:2014-06-03 20:32:12

标签: amazon-web-services amazon-ec2 ansible

如何使用ec2.py获取ec2主机的动态列表,并使用localhost作为主机。我一遍又一遍地用Google搜索,似乎无法找到一个好的解决方案。我遇到了一些很接近的答案,但似乎都需要将你的任务分解为两个不能同时运行的单独的剧本。

4 个答案:

答案 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

除非我在这里遗漏了什么。