2016-11-29 17 views
1

で宣言された辞書を使用してEC2を作成しているプレイブックを持っています:その後、IPを後で使用するグループに登録してください。危険なDictとタグ

dictのは、次のようになります。

servers: 
    serv1: 
    name: tag1 
    type: t2.small 
    region: us-west-1 
    image: ami-**** 
    serv2: 
    name: tag2 
    type: t2.medium 
    region: us-east-1 
    image: ami-**** 
    serv3: 
    [...] 

私はタグを使用して、単にいくつかのそれらのを作成することができますので、私は最も簡単な方法で、この脚本にタグを適用したいと思います。たとえば、--tags tag1,tag3でプレイブックを実行すると、serv1とserv3に一致するEC2のみが開始されます。

辞書にタグを適用することができていないようだと、私は次のように掛ける作業を行うことを避けるしたいと思います:

  • Creatinge EC2
  • 以前に登録に関する情報 からプライベートIPを取得
  • 登録に関する情報
  • グループにホストを追加

私は既にケースワー一度にすべてのEC2を作成するには、(キー=値が必要な--extra-varsに頼ることなく)それを達成するための方法はありますか?たとえば、EC2ループを実行する前にタグ付けされているものだけを保持して辞書をフィルタリングしますか?

+0

私はあなたの質問を受け取りますが、 '-e 'のような複雑なjson項目を指定することはできません。例えば' -e' {"test":["one"、 "two"}} '' ' – user2599522

+0

一例ですが、私はそれを使用してできるだけシンプルに保つことを避けたいと思います。タグはカンマで区切られているため、タグは完璧です。 – Hiruma

答えて

1

私は触れずに私のニーズにマッチする方法を発見他の人にも同様の必要がある場合に備えて、私はそれを共有しています。 タグに応じて辞書を組み合わせる必要があったので、私の「メイン」辞書は静的ではありませんでした。

変数にはなった:

- serv1: 
    - name: tag1 
    type: t2.small 
    region: us-west-1 
    image: ami-**** 
- serv2: 
    - name: tag2 
    type: t2.medium 
    region: us-east-1 
    image: ami-**** 
- serv3: 
[...] 

だからではなく、自分のタスクを複製、私はタグこのようなでset_fact を使用する:

- name: Combined dict 
# Declaring empty dict 
    set_fact: 
    servers: [] 
    tags: ['always'] 
- name: Add Server 1 
    set_fact: 
    servers: "{{ servers + serv1 }}" 
    tags: ['tag1'] 
- name: Add Server 2 
    set_fact: 
    servers: "{{ servers + serv2 }}" 
    tags: ['tag2'] 
[..] 

サーバごとに20行の代わりに、乗算タスク、 varsをリストからリスト、いくつかのタグ、そして全ての良いものに変更してください:)新しいサーバーを追加すると、数行しかかかりません。

1

私はあなたがこれを箱から出すことはできないと思っています。これが良いアイデアだとは思わない。
タグはAnsibleでタスクをフィルタリングするために使用されるため、すべてのタスクにtags: alwaysとマークする必要があります。

あなたは、たとえば、カスタムフィルタプラグインで(./filter_plugins/apply_tags.pyを)これを実現することができます

try: 
    from __main__ import cli 
except ImportError: 
    cli = False 

def apply_tags(src): 
    if cli: 
    tags = cli.options.tags.split(',') 
    res = {} 
    for k,v in src.iteritems(): 
     keep = True 
     if 'name' in v: 
     if v['name'] not in tags: 
      keep = False 
     if keep: 
     res[k] = v 
    return res 
    else: 
    return src 

class FilterModule(object): 

    def filters(self): 
     return { 
      'apply_tags': apply_tags 
     } 

そして、あなたの脚本で:

- debug: msg="{{ servers | apply_tags }}" 
    tags: always 
+0

'__main__'は何を参照していますか? – pepoluan

関連する問題