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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2531閲覧

AnsibleでJSONを文字列として値に設定したい

Youichi256

総合スコア204

Ansible

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/12/17 05:57

実現したいこと

 JSON文字列の一部に変数を使う場合でも、文字列として扱う方法を探しています。

 以下の3パターンの動作を試してみます。

YAML

1- debug: 2 msg: "{u'aa': u'{{ 123 }}'}" 3 4- debug: 5 msg: "a{u'aa': u'{{ 123 }}'}" 6 7- debug: 8 msg: "{u'aa': u'123'}"
TASK [ansible-tower : debug] ************************************************************************************ ok: [yyyyyy] => { "msg": { "aa": "123" } } TASK [ansible-tower : debug] ************************************************************************************ ok: [yyyyyy] => { "msg": "a{u'aa': u'123'}" } TASK [ansible-tower : debug] ************************************************************************************ ok: [yyyyyy] => { "msg": "{u'aa': u'123'}" }

 Python2形式のJSON文字列で変数を使った場合は、JSONとして解釈されています。
先頭に1文字追加してJSON形式ではなくすと、文字列として解釈されています。
変数を使用しない場合は、JSON形式でも文字列として解釈されています。

発生している問題・エラーメッセージ

 具体的には、AnsibleでAnsible Towerの構築をしようとしています。
このとき、ライセンスを登録するために、tower_settingsモジュールのvalueに、Python2形式のJSON文字列を設定しようとしています。

YAML

1- name: ライセンス情報設定の準備 2 set_fact: 3 license: "{{ lookup('file', 'license.txt') }}" 4 5- name: ライセンス情報設定 6 tower_settings: 7 name: LICENSE 8 value: "{u'company_name': u'{{ license.company_name }}', u'hostname': u'{{ license.hostname }}'}"

 ところが、値がJSONとして解析された後に設定されるようで、実行エラーとなりました。

TASK [ansible-tower : ライセンス情報設定の準備] ***************************************************************************** ok: [yyyyyy] TASK [ansible-tower : ライセンス情報設定] ******************************************************************************** An exception occurred during task execution. To see the full traceback, use -vvv. The error was: ValueError: Expecting property name: line 1 column 2 (char 1) fatal: [yyyyyy]: FAILED! => {"changed": false, "module_stderr": "Traceback (most recent call last):\n File \"<stdin>\", line 102, in <module>\n File \"<stdin>\", line 94, in _ansiballz_main\n File \"<stdin>\", line 40, in invoke_module\n File \"/usr/lib64/python2.7/runpy.py\", line 176, in run_module\n fname, loader, pkg_name)\n File \"/usr/lib64/python2.7/runpy.py\", line 82, in _run_module_code\n mod_name, mod_fname, mod_loader, pkg_name)\n File \"/usr/lib64/python2.7/runpy.py\", line 72, in _run_code\n exec code in run_globals\n File \"/tmp/ansible_tower_settings_payload_kwlL7n/ansible_tower_settings_payload.zip/ansible/modules/web_infrastructure/ansible_tower/tower_settings.py\", line 104, in <module>\n File \"/tmp/ansible_tower_settings_payload_kwlL7n/ansible_tower_settings_payload.zip/ansible/modules/web_infrastructure/ansible_tower/tower_settings.py\", line 91, in main\n File \"/usr/lib/python2.7/site-packages/tower_cli/resources/setting.py\", line 125, in modify\n data=self.coerce_type(setting, value))\n File \"/usr/lib/python2.7/site-packages/tower_cli/resources/setting.py\", line 150, in coerce_type\n return json.loads(value)\n File \"/usr/lib64/python2.7/json/__init__.py\", line 338, in loads\n return _default_decoder.decode(s)\n File \"/usr/lib64/python2.7/json/decoder.py\", line 366, in decode\n obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n File \"/usr/lib64/python2.7/json/decoder.py\", line 382, in raw_decode\n obj, end = self.scan_once(s, idx)\nValueError: Expecting property name: line 1 column 2 (char 1)\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}

 value内に変数を入れない({{ }}の無い)場合は、正常に実行できます。

補足情報(FW/ツールのバージョンなど)

環境やバージョンは、以下の通りです。

$ cat /etc/centos-release CentOS Linux release 7.7.1908 (Core) $ ansible --version ansible 2.9.1 config file = /home/ssm-user/.ansible.cfg configured module search path = [u'/home/ssm-user/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Aug 7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] $ tower-cli --version Tower CLI 3.3.0

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

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

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

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

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

guest

回答2

0

解決

tower_settings で、ライセンス情報が設定できました。
ポイントは、tower_settings の value で to_json を使うことと、"eula_accepted": true を追加することでした。

YAML

1 - name: ライセンスファイル読み込み 2 set_fact: 3 org_license: "{{ lookup('file', 'license.txt') }}" 4 5 - name: ライセンスの準備 6 set_fact: 7 accept_license: >- 8 {%- set _ = org_license.update({"eula_accepted": true}) -%} 9 {{ org_license }} 10 11 - name: ライセンスの設定 12 tower_settings: 13 name: LICENSE 14 value: "{{ accept_license | to_json }}"

投稿2020/02/06 07:12

Youichi256

総合スコア204

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

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

0

自己解決

※こちらは、無理やり解決させた方法です。スマートな方法は、上の回答です。

tower_settingsモジュールでライセンスを設定する方法が見つからなかったので、tower-cliコマンドで設定する力業で対処しました。

YAML

1 - name: ライセンス情報確認の準備 2 set_fact: 3 org_license_json: "{{ lookup('file', 'license.txt') }}" 4 5 - name: ライセンス情報確認 6 command: 7 cmd: "tower-cli setting get --format json LICENSE --tower-host {{ tower_host }} --tower-username {{ tower_username }} --tower-password {{ tower_password }}" 8 check_mode: no 9 changed_when: false 10 register: get_license_all 11 12 - name: ライセンス情報解析 13 set_fact: 14 get_license_data: "{{ get_license_all.stdout }}" 15 16 - name: ライセンス情報設定の準備 17 set_fact: # JSONとして解釈されないために"で囲む 18 org_license_str: "\"{\ 19 u'company_name': u'{{ org_license_json.company_name }}', \ 20 u'hostname': u'{{ org_license_json.hostname }}', \ 21 u'instance_count': {{ org_license_json.instance_count }}, \ 22 u'license_date': {{ org_license_json.license_date }}, \ 23 u'license_key': u'{{ org_license_json.license_key }}', \ 24 u'license_type': u'{{ org_license_json.license_type }}', \ 25 u'subscription_name': u'{{ org_license_json.subscription_name }}'\ 26 }\"" 27 when: get_license_data.value != org_license_json 28 29 - name: ライセンス情報設定 30 # tower_settings ではJSON文字列がうまく渡せないのでcommandで実装 31 command: 32 cmd: "tower-cli setting modify --format json LICENSE {{ org_license_str }} --tower-host {{ tower_host }} --tower-username {{ tower_username }} --tower-password {{ tower_password }}" 33 when: get_license_data.value != org_license_json 34

投稿2020/01/08 00:46

編集2020/02/06 07:15
Youichi256

総合スコア204

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問