2017-08-21 15 views
1

私は、システムの大きなリストを持つグループを持っており、そのグループから最初の3つのシステムを取得する必要があります。可能なリストを構築する

[webservers] 
web01 
web02 
web03 
web04 
web05 

そして、次のように引用されたリストを生成?:

- name: Pick the initial masters 
    lineinfile: 
    dest: "/bits/etc/web.conf" 
    state: present 
    regexp: 'node.masters' 
    line: 'node.masters: [ "web01", "web02", "web03" ]' 

私は将来的にマスタの数を変更する必要があります。このようなグループを取るためにそこに方法があります可能であればスライスを使用したいと思っています。どんな洞察もありがとう。

答えて

1

python array slice syntaxを使用してjsonフィルタにパイプすることができます。これはJinja2でのループを避け、素敵な引用出力を生成します。

- name: Pick the initial masters 
    lineinfile: 
    dest: /bits/etc/web.conf 
    state: present 
    regexp: 'node.masters' 
    line: 'node.masters: {{groups['webservers'][:3] | to_json}}' 

在庫が動的に生成されている場合Ansible FAQに述べたように順序は、必ずしも一致していないとして、グループのスライスに注意してください。これを避けるため、在庫に2番目のグループ「マスター」を作成し、注文に頼るのではなく使用するノードを指定するようアドバイスします。これには、他のメリットがあります。たとえば、すべてのプレイブックのマスター数を知り、変更する代わりに、マスターまたは非マスターをターゲットにすることができます。

[webservers] 
web[01:05] 

[masters] 
web[01:03] 
1

組み込みのgroups変数を参照できます。コメントから

- name: Pick the initial masters 
    lineinfile: 
    dest: "/bits/etc/web.conf" 
    state: present 
    regexp: 'node.masters' 
    line: "node.masters: [ \"{{ groups['webservers'][0] }}\", \"{{ groups['webservers'][1] }}\", \"{{ groups['webservers'][2] }}\" ]" 

更新答え:

ます。また、Webサーバ内のホストの任意の数をループにあなたの変数宣言で神社を使用することができます。

vars: 
    master_nodes: 3 
    master_nodes_line: "{% for item in groups['webservers'][:master_nodes] %}\"{{ item }}\"{% if not loop.last %},{% endif %}{% endfor %}" 
tasks: 
- name: Print list 
    lineinfile: 
    dest: foo 
    regexp: "node.masters" 
    line: "node.masters: [ {{ master_nodes_line }} ]" 
+0

forループを使用して動的にリストを構築できますか? group_varsに変数(たとえばmaster_nodes:3)を定義し、グループ[]内の最初のX項目を繰り返しループして行項目を作成したいと考えています。それは可能ですか? – Shibby

+0

確かに、私の答えを更新しました。 – kfreezy

関連する問題