2017-01-06 3 views
3

属性(この場合はec2_tag)と一致するサーバーのリストを作成して、特定のサーバーに特定のタスクをスケジュール設定しようとしています。一致する属性に基づくリストの作成(不可能)

私は selectattr照合しようとしている

:私はAnsibleから型エラーどのように見えるかを取得していますが

servers: "{{ hostvars[inventory_hostname]|selectattr('ec2_tag_Role', 'match', 'cassandra_db_seed_node') | map(attribute='inventory_hostname') |list}}" 

:私はここ

fatal: [X.X.X.X]: FAILED! => {"failed": true, "msg": "Unexpected templating type error occurred on ({{ hostvars[inventory_hostname]|selectattr('ec2_tag_Role', 'match', 'cassandra_db_seed_node') | map(attribute='inventory_hostname') |list}}): expected string or buffer"} 

何をしないのですか?

+0

また、私は上記の構文を使用していましたが、これは特に、hostvarsによって生成されたオブジェクトのタイプに関連しています[inventory_hostname] – mosh

答えて

1

あなたはHOSTVARに応じて、アドホックグループを作成するgroup_byモジュールを使用することができます。これは、グループを作成します

- group_by: 
    key: 'ec2_tag_role_{{ ec2_tag_Role }}' 

は、後で意味しているec2_tag_role_*と呼ばれます次のグループのいずれかを使用して劇を作成できます:

- hosts: ec2_tag_role_cassandra_db_seed_node 
    tasks: 
    - name: Your tasks... 
+0

ありがとう! "{{groups2.ec2_tag_role_cassandra_db_seed_node | join( '、')}}" '{group2.ec2_tag_role_cassandra_db_seed_node | join( '、')}} {{ec2_tag_role _ {{ec2_tag_Role}}" ' – mosh

4

複雑なフィルタチェーンを作成する場合は、debugモジュールを使用して中間結果を印刷し、フィルタを1つずつ追加して目的の結果を得ます。

あなたの例では、最初のステップに間違いがあります。hostvars[inventory_hostname]は、現在のホストのファクトだけを示しているため、要素を選択するものはありません。

selectattrがdictではなくリストに適用されるため、hostvars 'の値のリストが必要です。

でも、hostvarsは特別な変数であり、実際にはdictではないので、ちょうど.values()を呼び出すことはできません。

次のコードを試してみてください。

- hosts: all 
    tasks: 
    - name: a kind of typecast for hostvars 
     set_fact: 
     hostvars_dict: "{{ hostvars }}" 
    - debug: 
     msg: "{{ hostvars_dict.values() | selectattr('ec2_tag_Role','match','cassandra_db_seed_node') | map(attribute='inventory_hostname') | list }}" 
+0

これを投票してください。なぜなら、 'hostvars'は、なぜ 'selectattr'が動作しないのか理解していますが、上記のコードは私に元のエラーを与えました。すべてを配列で囲むように見えますが。 – mosh

関連する問題