web-dev-qa-db-ja.com

Ansibleはすべての値を一致する変数名で置き換えます

私はAnsibleの初心者で、これについて間違った方向に進んでいる可能性がありますが、これがこの問題への対処方法を知る唯一の方法です。

4000 inoddエントリが長いiniファイルがあります。コードとして構成を試みるために、各エントリの値をsectionheader--keyname: originalvalueの形式で変数ファイルに抽出し、それらをトークンパターンおよび現在の値を含む変数の名前に置き換えました。

Ansibleが正規表現の置換を実行できることは知っていますが、これほど動的にそれを実行できる方法を見つけることができませんでした。

元のファイル:

[sectionheader1]

keyname1=value1

[sectionheader2]

keyname1=value2

トークンの置換を含むファイルがソースに保持され、デプロイ可能になりました。

[sectionheader1]

keyname1=%<sectionheader1--keyname1>

[sectionheader2]

keyname1=%<sectionheader2--keyname1>

変数:

testenvironment:
  sectionheader1--keyname1: value1
  sectionheader2--keyname1: value2
prodenvironment:
  sectionheader1--keyname1: value1 (specific to prod)
  sectionheader2--keyname1: value2 (specific to prod)

そして、アイデアは、一致する変数名が見つかったトークンパターン%<>のすべての出現と、ビオラを置き換えることです。操作している環境に固有の設定ファイルを作成しました。そしてこれで、チェックが可能になり、%<>パターンが残っている場合は、すべての変数が定義されているわけではなく、エラーをスローする可能性があることがわかります。 Octopusのデプロイは、この方法で構成ファイル内の変数の置換を処理します。これは、私が最も経験したことです。

Ansibleはこれを行う方法を持っていますか?それを行うためのスクリプトを記述して、Ansibleでそれを呼び出すことができたのですが、コードとして構成変数を置き換える組み込みの方法を望んでいました。

1
user3066571

適切なセットアップテンプレートを使用すると、dictですべてを設定できるはずです。
.iniは本質的に2つの深さディクテーションであるため、.j2テンプレートの2つのネストされたjinja2 forループを使用して、.iniをそのように扱います。

この例では、コンパクトにするためにコマンドラインでenv変数を設定していますが、インベントリ、Host_vars、またはgroup_varsファイルで設定できます。

ansible/example.yml

---
- hosts: localhost
  gather_facts: false
  vars:
    dev:
      section1:
        key1: value1
      section2:
        key1: value1
    prod:
      section1:
        key1: value2 #(specific to prod)
      section2:
        key1: value2 #(specific to prod)
  tasks:
    - template: src=example.ini.j2  dest=/tmp/ansible.ini

ansible/templates/example.ini.j2

{% for section in vars[vars.env] %}
[{{section}}]
{% for key in vars[env][section] %}
{{key}}={{vars[env][section][key]}}
{% endfor %}
{% endfor %}

$ ansible-playbook ansible/test.yml -e env=dev; cat /tmp/ansible.ini

PLAY [localhost] ********************************************************************************************************************************************

TASK [template] *********************************************************************************************************************************************
changed: [localhost]

PLAY RECAP **************************************************************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[section1]
key1=value1
[section2]
key1=value1

$ ansible-playbook ansible/test.yml -e env=prod; cat /tmp/ansible.ini

PLAY [localhost] ********************************************************************************************************************************************

TASK [template] *********************************************************************************************************************************************
changed: [localhost]

PLAY RECAP **************************************************************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[section1]
key1=value2
[section2]
key1=value2
1
84104

ini_file モジュールが使用されている可能性があります。

以下のタスク

- ini_file:
    path: /scratch/testenvironment.ini
    section: "{{ item.key.split('--').0 }}"
    option: "{{ item.key.split('--').1 }}"
    value: "{{ item.value }}"
  loop: "{{ testenvironment|dict2items }}"

与える

$ cat /scratch/testenvironment.ini 

[sectionheader2]
keyname1 = value2
[sectionheader1]
keyname1 = value1

セクションをアルファベット順にソートする必要がある場合

 loop: "{{ testenvironment|dict2items|sort(attribute='key') }}"
1
Vladimir Botka