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

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

新規登録して質問してみよう
ただいま回答率
85.37%
標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

serverspec

serverspecは、Ruby製のサーバ環境テストケース作成ツールです。

Ansible

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

Q&A

解決済

1回答

4130閲覧

Ansibleのtasks内も変数をファイルに出力したい

reisin

総合スコア3

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

serverspec

serverspecは、Ruby製のサーバ環境テストケース作成ツールです。

Ansible

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

0グッド

0クリップ

投稿2021/09/30 01:55

編集2021/09/30 02:14

実現したいこと

  • 以下サイト参考に、Ansibleの変数をyamlファイルに書き出したいです。

https://qiita.com/kentarok/items/d196c8ea4a57af6b86f7#playbook

  • 以下のwin_disk_factで、ディスクサイズをGB表字にして変数に入れる処理をしています。

https://docs.ansible.com/ansible/latest/collections/community/windows/win_disk_facts_module.html

上記ページ内にある変数「disksize_gb」も同じファイルに出力したいのですが、出力されません。出力内容にvarsを指定するだけじゃだめなのでしょうか。。。

該当Playbook

yaml

1- name: debugテスト 2 hosts: all 3 user: Administrator 4 gather_facts: no 5 environment: 6 no_proxy: 127.0.0.1,localhost 7 tasks: 8 - name: Get disk facts 9 community.windows.win_disk_facts: 10 11 - name: Output first disk size 12 debug: 13 var: ansible_facts.disks[0].size 14 15 - name: Convert first system disk into various formats 16 debug: 17 msg: '{{ disksize_gib }} vs {{ disksize_gib_human }}' 18 vars: 19 #最初のシステムディスクを取得する 20 disk: '{{ ansible_facts.disks|selectattr("system_disk")|first }}' 21 22 #ディスクサイズをギビバイトで表示 23 disksize_gib_human: '{{ disk.size|filesizeformat(true) }}' #「223.6GiB」(人間が読める形式)を返します 24 disksize_gib: '{{ (disk.size/1024|pow(3))|round|int }} GiB' #「224GiB」(GiBの値)を返します 25 26 #ディスクサイズをギガバイトで表示 27 disksize_gb_human: '{{ disk.size|filesizeformat }}' #「240.1GB」を返します(人間が読める形式) 28 disksize_gb: '{{ (disk.size/1000|pow(3))|round|int }} GB' #「240GB」(GB単位の値)を返します 29 30- name: Ansibleを基にServerSpecの設定を作成 31 hosts: localhost 32 connection: local 33 gather_facts: false 34 tasks: 35 - name: VarsをServerSpecように出力する 36 copy: 37 content: "{{ vars | to_nice_yaml }}" 38 dest: "./{{ project_name }}.yml" 39 tags: serverspec

出力内容

yaml

1長すぎて掲示できませんでした。。。

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

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

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

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

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

guest

回答1

0

ベストアンサー

playの「degugテスト」で各ホストでwin_disk_factsした結果を各変数に格納しています。
それらの変数は競合しないようにホストごとに管理されています。

例えば、host1とhost2がある場合は、host1のdisksize_gib_humanとhost2のdisksize_gib_humanがそれぞれ管理されています。
つまり、host1でdisksize_gib_humanを呼び出した時や値を格納するときはhost1のdisksize_gib_humanが使われます。host2のdisksize_gib_humanに影響はない。

では、playの「Ansibleを基にServerSpecの設定を作成」のホストはlocalhostなので、host1とhost2の変数はそのまま呼び出せないようになっています。

異なるホストの変数を取得したい時はどうするのかというとhostvars[ホスト名]から取得できます。
hostvarsをデバックしてみて頂ければピンとくるかと思います。

yaml

1- name: debugテスト 2 hosts: all 3 user: Administrator 4 gather_facts: no 5 environment: 6 no_proxy: 127.0.0.1,localhost 7 tasks: 8 - name: Get disk facts 9 community.windows.win_disk_facts: 10 11 - set_fact: 12 disksize_gib_human: '{{ disk.size|filesizeformat(true) }}' 13 disksize_gib: '{{ (disk.size/1024|pow(3))|round|int }} GiB' 14 disksize_gb_human: '{{ disk.size|filesizeformat }}' 15 disksize_gb: '{{ (disk.size/1000|pow(3))|round|int }} GB' 16

yaml

1# item.keyはホスト名 2# item.valueはそのホストで使用可能な変数 3# 4# hostvarsは以下のような構造になっています 5# 6# ------------------------------------- 7# hostvars[host1][disksize_gib_human] 8# [disksize_gib] 9# hostvars[host2][disksize_gib_human] 10# [[disksize_gib]] 11# -------------------------------------- 12- debug: 13 msg: "{{ item.key }}" 14 with_dict: "{{ hostvars }}" 15 16# ANSIBLE-2019で定義されたもしくは読み込まれた変数を表示します。 17- debug: 18 msg: "{{ hostvars['ANSIBLE-2019'] }}"

なお、他のホスト変数を更新はできない。

投稿2021/09/30 02:28

編集2021/09/30 09:25
comefigo

総合スコア1051

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

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

reisin

2021/09/30 04:42

回答ありがとうございます。 hostvarsでdebugしてみました。 出力結果は長すぎて記載できませんが、同じくdisksize_gib_human等のtask内で出てきた変数は現れません。。 試しにplay「debugテスト」の対象ホストを1台に絞り、そのplay内にファイル出力するtaskを入れ、delegate_toでlocalhostを指定し出力しても同じく変数は出力されませんでした。 (上記どちらのパターンも、host_vars内の変数及びwin_disk_factsで取得している情報は出力されていましたので、ホスト別の変数は出せているみたいです。) さらにdebugでdisksize_gib_humanの出力も試してみましたが未定義の旨のエラーが出ました。 難しいです。。。
comefigo

2021/09/30 06:02

> さらにdebugでdisksize_gib_humanの出力も試してみましたが未定義の旨のエラーが出ました。 どのようなコードでしょうか?
comefigo

2021/09/30 06:13

上記のデバックコードを編集しましたので、出力結果を教えて頂けませんか?
reisin

2021/09/30 07:02

>> さらにdebugでdisksize_gib_humanの出力も試してみましたが未定義の旨のエラーが出ました。 >どのようなコードでしょうか? ⇒ 以下のようなコードでした。 debug: msg= "{{ disksize_gib_human }}" ※上記タスクは対象ホストがlocalhostではなくhost1向けのPlay「debugテスト」で実行しました。 >上記のデバックコードを編集しましたので、出力結果を教えて頂けませんか? ⇒以下Playbookにし、実行しました。 ``` - name: debugテスト hosts: all user: Administrator gather_facts: no environment: no_proxy: 127.0.0.1,localhost # 下記rolesに、rolesフォルダ内にある各ロールフォルダの名前を入力する。 tasks: - name: Get disk facts community.windows.win_disk_facts: - name: Output first disk size debug: var: ansible_facts.disks[0].size - name: Convert first system disk into various formats debug: msg: '{{ disksize_gib }} vs {{ disksize_gib_human }}' vars: #最初のシステムディスクを取得する disk: '{{ ansible_facts.disks|selectattr("system_disk")|first }}' #ディスクサイズをギビバイトで表示 disksize_gib_human: '{{ disk.size|filesizeformat(true) }}' #「223.6GiB」(人間が読める形式)を返します disksize_gib: '{{ (disk.size/1024|pow(3))|round|int }} GiB' #「224GiB」(GiBの値)を返します - debug: msg: "{{ item.key }}" <---------------- # 左記追加しました。 with_dict: "{{ hostvars }}" <--------------- ``` 出力結果は以下です。(長いのでオンラインストレージにアップロードしました。) https://drive.google.com/file/d/1_x7dOw0kN8__Fa9Seyd0EnfYM7uBnaVZ/view?usp=sharing やはりdisksize_gib_humanは出てきませんね・・・ 予想ですが、task内で使われた変数はそのtask外では使えない?のでしょうか。
comefigo

2021/09/30 16:11 編集

わざわざ共有頂きありがとうございます! いまさらですが、重大なことに気づきました。。。 playのdebugテストで各種変数が変数として代入していませんので、hostvarsでは参照できません。 上記のコードのようにdebugモジュールにvars(変数)を指定されていますが、その変数の適用範囲はそのdebugモジュールまでとなっています。プログラミング的に言うとスコープ(範囲)が限定されています。 なので、後続の処理や他のホストから参照できるようにするためには、set_factを用いて変数に値を代入します。 具体的なコードは上記に反映しますので、参照ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問