1

Ansible を使用して Amazon EC2 にデプロイしています。また、Amazon からサーバーのリストを取得できるように ec2.py と ec2.ini をセットアップしています。AWS にサーバーをタグ付けし、実行できるのでタグrvmdocker:productionansible 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

tag_rvmdocker_production静的インベントリ ファイルにある場合、Ansible は解決できないようです。

アップデート

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 上の VM)、ステージング、または運用に対して同じ Playbook を実行できるようにしたいと考えています。私の考えでは、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

hosts ファイルには次の情報が含まれています。ここでは、空白の最初のエントリが重要です。

[tag_Type_amg_dev_web]

[webservers:children]
tag_Type_amg_dev_web

[all:children]
webservers

次に、実行時に、Ansible がファイルを読み取るインベントリとしてのみansible-playbookフォルダーの名前を指定し、スクリプトを実行して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 動的インベントリ スクリプトを使用すると、タグのキーと値の組み合わせによってサーバーのグループをターゲットにすることができます。したがって、Web サーバーをターゲットにするためRoleに、この場合は というタグが設定されている可能性があり、これ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 サーバーのグループ変数を一般的にターゲットまたは設定し、またはweb-serversのより具体的なグループを使用して Web サーバーのタイプを具体的に構成できます。front-end-web-serversphp-web-servers

ただし、子グループとして定義されていないグループの下にエントリを配置すると、Ansible はこれがホストであると想定し、そのホストに直接接続しようとします。

動的インベントリを介して到達しようとしている一意にタグ付けされたインスタンスがある場合は、それをグループであるかのように使用するだけです (現在、たまたま 1 つのインスタンスしか含まれていません)。

したがって、dockerserversキーペアの組み合わせでタグ付けされたインスタンスを含むグループの変数をターゲットまたは設定する場合は、次のrvmdocker: productionようにします。

[dockerservers:children]
tag_rvmdocker_production

[tag_rvmdocker_production]
于 2016-01-29T08:42:20.977 に答える