
現在、私には次の役割があり、この役割は製品の基本的なインストールをシミュレートします。
- name: Install Server.msi primary_appserver
ansible.windows.win_package:
path: C:\product.msi
log_path: C:\InstallProduct.log
arguments:
ADDLOCAL=DB,Agent
state: present
become: true
become_method: runas
vars:
ansible_become_user: "{{ ansible_user }}"
ansible_become_password: "{{ ansible_password }}"
when: "'primary_appservers' in group_names"
インストールウィザードで追加機能を選択する「高度な」インストールをシミュレートしたい
インストールウィザードでは、1つ以上の機能を選択できます。つまり、ADDLOCAL
引数は次のようになります。ADDLOCAL=DB,Agent
- これは基本OR ADDLOCAL=DB,Agent,Feature_A
ORです。ADDLOCAL=DB,Agent,Feature_A,Feature_B
Feature_C
たとえば、インストールするには追加の引数リストが必要になるため、状況が複雑になっています。たとえばRABBIT_LOCAL_PORT
、、、...RABBIT_QUEUE_NAME
RABBIT_TTL
vars
AnsibleまたはJenkinsで使用する場合extraVars
- プレイブック\ロールの値を上書きする
プレイブック\ロールの既存の値に値を追加する方法はありますか? たとえば、Feature_a
および\またはFeature_b
- ADDLOCAL のインストールを選択すると、ロールの値は に変更されますかADDLOCAL=DB,Agent,Feature_A,Feature_B
? または、2 番目のケースで を追加するとFeature_C
、ADDLOCAL
ロールの値は に変更されADDLOCAL=DB,Agent,Feature_C
、arguments
キーにはさらに、、引数が含まれRABBIT_LOCAL_PORT
ますRABBIT_QUEUE_NAME
かRABBIT_TTL
?
答え1
望ましい動作を実装するには、次の 2 つのオプションがあります。
引数変数をリストとして扱う
引数を生成する際は、それらを構造として扱います (私の例ではリストのマップ)。ユースケースに応じて、機能や引数を追加または削除できます。ただし、このアプローチでは複雑さが増します。
- name: set default arguments
set_fact:
arguments_map:
ADDLOCAL:
- feature1
- feature2
- name: set feature3
set_fact:
arguments_map: "{{ arguments_map | combine({'ADDLOCAL':['feature3']}, recursive=True, list_merge='append') }}"
- name: set feature4
set_fact:
arguments_map: "{{ arguments_map | combine({'ADDLOCAL':['feature4'], 'RABBIT_LOCAL_PORT':5672, 'RABBIT_QUEUE_NAME':'test'}, recursive=True, list_merge='append') }}"
- name: generate arguments string
set_fact:
arguments: "{% for argument in arguments_map | dict2items %}{{ argument['key'] }}={{ (argument['value'] | join(',')) if (argument['value'] | type_debug == 'list') else (argument['value']) }} {% endfor %}"
- debug:
var: arguments
これにより、次の文字列が生成されます。
ADDLOCAL=feature1,feature2,feature3,feature4 RABBIT_LOCAL_PORT=5672 RABBIT_QUEUE_NAME=test
読みやすくするために、すべての定義済みセットを var ファイルに移動できます。
引数文字列に徐々に連結する
より単純だが柔軟性は低い:
- name: set default arguments
set_fact:
arguments: 'ADDLOCAL=DB,Agent'
- name: set feature1
set_fact:
arguments: "{{ arguments + ',feature1' }}"
- name: set feature2
set_fact:
arguments: "{{ arguments + ',feature2' }}"
- name: set additional arguments
set_fact:
arguments: "{{ arguments + ' RABBIT_LOCAL_PORT=5672 RABBIT_QUEUE_NAME=test' }}"
when: arguments is search('feature2')
- debug:
var: arguments
次の文字列を生成します:
ADDLOCAL=DB,Agent,feature1,feature2 RABBIT_LOCAL_PORT=5672 RABBIT_QUEUE_NAME=test