1

我正在使用 Ansible 部署到 Amazon EC2,并且设置了 ec2.py 和 ec2.ini,以便可以从 Amazon 检索服务器列表。我的服务器位于 AWS tagged rvmdocker:production,并ansible all --list返回我的标签,因为ec2_tag_rvmdocker_production.我也可以运行:

ansible -m ping tag_rvmdocker_production`

它有效。但是,如果我在静态清单文件中有该标签,然后运行:

ansible all -m ping -i production

它返回:

tag_rvmdocker_production | UNREACHABLE! => {
    "changed": false, 
    "msg": "ERROR! SSH encountered an unknown error during the connection. Werecommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue", 
    "unreachable": true
}

这是我的生产库存文件:

[dockerservers]
tag_rvmdocker_production

看起来 Ansibletag_rvmdocker_production在静态清单文件中时无法解析。

更新

我听从了 ydaetskcoR 的建议,现在收到一条新的错误消息:

$ ansible-playbook -i production app.yml 
ERROR! ERROR! production:2: Section [dockerservers:children] includes undefined group: tag_rvmdocker_production

但我知道标签存在,而且似乎 Ansible 和 ec2.py 都知道:

$ ansible tag_rvmdocker_production --list
  hosts (1):
    12.34.56.78

这是我的生产库存:

[dockerservers:children]
tag_rvmdocker_production

还有我的 app.yml 剧本文件:

---
- name: Deploy RVM app to production
  hosts: dockerservers
  remote_user: ec2-user
  become: true
  roles:
    - ec2
    - myapp

最后,我希望能够针对开发(我的 Mac 上的虚拟机)、登台或生产运行相同的剧本来启动环境。我的想法是拥有指向 EC2 上的标签或组的静态清单文件。我是否以正确的方式接近这个?

4

2 回答 2

2

我有一个类似的问题,并解决如下。

首先,我创建了一个文件夹来包含我的库存文件,并在其中放置一个指向 my 的符号链接、一个指向脚本(具有可执行状态)/etc/ec2.ini的副本(或符号链接)以及一个如下文件。ec2.pyhosts

$ ls amg-dev/*
amg-dev/ec2.ini -> /etc/ec2.ini
amg-dev/ec2.py
amg-dev/hosts

我的 EC2 实例被标记为Type = amg_dev_web

主机文件包含以下信息 - 空白的第一个条目在这里很重要。

[tag_Type_amg_dev_web]

[webservers:children]
tag_Type_amg_dev_web

[all:children]
webservers

然后,当我运行时,我ansible-playbook将文件夹的名称指定为使 Ansible 读取文件的清单,并执行脚本以询问 AWS。hostsec2.py

ansible-playbook -i amg-dev/ playbook.yml

在我的剧本中,我将这些webservers称为如下

- name: WEB | Install and configure relevant packages
  hosts: webservers
  roles:
    - common
    - web

这似乎按预期工作。

于 2016-03-29T17:27:20.230 回答
1

正如评论中所讨论的,您似乎误解了动态库存中标签的使用。

AWS EC2 动态清单脚本允许您通过标签键/值组合来定位服务器组。因此,要定位您的网络服务器,您可能有一个名为Rolethat 在这种情况下设置为web您将作为动态组定位的标记tag_Role_web

您还可以拥有包含子动态组的静态组。这与您通常在清单文件中使用组组的方式非常相似,可能会像这样使用:

[web-servers:children]
front-end-web-servers
php-web-servers

[front-end-web-servers]
www-web-1
www-web-2

[php-web-servers]
php-web-1
php-web-2

这将允许您通过使用更通用的web-servers组来通用地定位或设置上述所有 Web 服务器的组变量,然后使用更具体的组来专门配置 Web 服务器的front-end-web-servers类型php-web-servers

但是,如果您将条目放在未定义为子组的组下,则 Ansible 将假定这是一个主机,然后将尝试直接连接到该主机。

如果您有一个尝试通过动态清单访问的唯一标记实例,那么您只需将它当作一个组来使用(它恰好当前只有一个实例)。

因此,如果您想为该组定位或设置变量dockerservers,然后该组包含一个带有密钥对组合标记的实例,rvmdocker: production那么您只需执行以下操作:

[dockerservers:children]
tag_rvmdocker_production

[tag_rvmdocker_production]
于 2016-01-29T08:42:20.977 回答