web-dev-qa-db-ja.com

サーバー名のリストを取得して、それぞれにリソースURIとポートを追加するにはどうすればよいですか?

Ansibleインベントリから2つのリストをマージしました:

set_fact:
  fact1: "{{ groups['group1'] + groups[group2']|list }}

出力は次のとおりです。

fact1:
  - server01
  - server02
  - server03

上記の結果では、各要素の前にhttps://を、後ろにポート番号を追加する必要があります。次に、サーバー構成のコンマ区切りリストに変換する必要があります。

この例では、https://server01:8000,https://server02:8000,https://server03:8000が必要です。

結合を使用してみました:

set_fact:
  fact2: "{{ fact1|join(':8000,') }}"

一部は機能しましたが、最後のサーバーにポートがありませんでした。

どうすれば目標を達成できますか?

11
Adam S

ソリューション

set_fact:
  fact2: "{{ fact1 | map('regex_replace', '(.*)', 'https://\\1:8000') | join(',') }}"

説明

  1. map filter フィルターを適用します(regex_replace)リストの個々の要素に。

  2. regex_replace filter (次の正規表現を使用)は、prefixおよびsuffixを文字列に追加します。

    current_list | map('regex_replace', '(.*)', 'prefix\\1suffix')
    
  3. join filter 出力のリストをカンマ区切りの文字列に変換します。


代替

別の可能な解決策(すでに知っていることを基にして構築)は、ターゲット文字列に直接Jinja2を使用することです。

set_fact:
  fact2: "{{ 'https://' + fact1|join(':8000,https://') + ':8000' }}"
9
techraf

また、3値フィルターを使用できます。

set_fact:
  fact2: "{% for it in fact1 %}https://{{ it }}:8000{{ loop.last | ternary('', ',') }}{% endfor %}"
1
bav