私は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でそれを呼び出すことができたのですが、コードとして構成変数を置き換える組み込みの方法を望んでいました。
適切なセットアップテンプレートを使用すると、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
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') }}"