質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

Q&A

解決済

2回答

2627閲覧

Ansible Playbook 内で条件によって要素を変えたい

xotaki

総合スコア50

Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

0グッド

0クリップ

投稿2020/10/01 23:49

編集2020/10/01 23:57

Ansible Playbook 内で、変数が定義されているかどうかで要素を変えたいのですが、何か手段がありましたらご教示いただきたいです。

実現したいこと

vsphere_guest モジュール(すでに deprecated なのはご容赦ください)において、
disk2_disksize という変数が定義されていたら、「disk2:~」の要素を追加したい

task(エラーになります)

--- - name: Deploy guest VMs vsphere_guest: vcenter_hostname: "{{ esx_ipaddr }}" (snip) vm_disk: disk1: size_gd: "{{ item.disk1_disksize }}" type: thin datastore: "{{ item.disk1_datastore_name }}" {% if item.disk2_disksize is defined %} disk2: size_gd: "{{ item.disk2_disksize }}" type: thin datastore: "{{ item.disk2_datastore_name }}" {% endif %} (snip) with_item: - "{{ vms }}"

jinja2 のように、if が使えればいいのですが、これはエラーになります。

diskの情報を配列にするとスマートかな、と思いますが、要素名が「disk1」「disk2」…のようになっているので、どのようにすればいいか、この案でも書きかたが思いつきません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

かなりの無理矢理感ありますがこんな感じでできるでしょうか。
vm_disk の dict に disk2_disksize の有無で disk2 を追加するか制御しています。

vsphere_guest モジュールはよくわからないので set_fact で同じ構造を作るようにしてます)

yaml

1- name: Deploy guest VMs 2 set_fact: 3 vsphere_guest: 4 vcenter_hostname: "{{ esx_ipaddr }}" 5 vm_disk: '{{ 6 { 7 "disk1": { 8 "size_gd": item.disk1_disksize, 9 "type": "thin", 10 "datastore": item.disk1_datastore_name, 11 } 12 } | combine({ 13 "disk2": { 14 "size_gd": item.disk2_disksize, 15 "type": "thin", 16 "datastore": item.disk2_datastore_name, 17 } 18 } if item.disk2_disksize is defined else {} ) 19 }}' 20 with_items: "{{ vms }}" 21 register: res 22 23# 確認用 24- debug: 25 var: res.results | map(attribute='ansible_facts') | list

ループの中身を別ファイルにして set_fact で vm_disk を作るほうがまだは判りやすいかもしれません・・

yaml

1# main.yaml 2 3- include: deploy.yaml 4 with_items: "{{ vms }}"

yaml

1# deploy.yaml 2 3- set_fact: 4 vm_disk: 5 disk1: 6 size_gd: "{{ item.disk1_disksize }}" 7 type: thin 8 datastore: "{{ item.disk1_datastore_name }}" 9 10- set_fact: 11 vm_disk: 12 disk1: "{{ vm_disk.disk1 }}" 13 disk2: 14 size_gd: "{{ item.disk2_disksize }}" 15 type: thin 16 datastore: "{{ item.disk2_datastore_name }}" 17 when: item.disk2_disksize is defined 18 19- name: Deploy guest VMs 20 set_fact: 21 vsphere_guest: 22 vcenter_hostname: "{{ esx_ipaddr }}" 23 vm_disk: "{{ vm_disk }}" 24 25# 確認用 26- debug: 27 var: vsphere_guest

投稿2020/10/02 01:44

編集2020/10/02 01:47
ngyuki

総合スコア4516

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xotaki

2020/10/02 02:01

回答ありがとうございました。 `combine` で結合できるのですね。 `set_fact` で要素をつないでいく方法も面白いですね。 試してみます。
guest

0

ベストアンサー

もし、元の変数 vms の構造を変えられればという前提になってしまいますが、以下のような構造にしておけば、Playbook 側をだいぶシンプルにできるのではないかと思います。

yaml

1vms: 2 - name: vm1 # name や 各種値は適当 3 vm_disk: 4 disk1: 5 datastore_name: datastore101 6 type: thin 7 disksize: 101 8 disk2: 9 datastore_name: datastore102 10 type: thin 11 disksize: 102 12 - name: vm2 13 vm_disk: 14 disk1: 15 datastore_name: datastore201 16 type: thin 17 disksize: 1201

yaml

1- name: Deploy guest VMs 2 vsphere_guest: 3 vcenter_hostname: "{{ esx_ipaddr }}" 4 (snip) 5 vm_disk: "{{ item.vm_disk }}" 6 (snip) 7 loop: "{{ vms }}"

vm_disk オプションに渡す変数を予め整えておくという意味では、最初の回答者 ngyuki さんの2個目の案と同じ考え方です。

投稿2020/10/03 12:24

akira6592

総合スコア40

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xotaki

2020/10/03 14:21

ngyuki さんの回答で、`vsphere_guest` の中の構造も結局は dict なのだと理解しました。 これを理解すると、変数(vms)側で `vm_disk` を定義すればよく、結果的に `when` を 使わないでもよくなりますね。 とてもスマートな playbook になりました。動作確認も取れましたので、ベストアンサーと させていただきます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問