■ はじめに
いままで INI 形式のインベントリファイル内での変数は ansible_host くらいしか定義してなかったので気が付かったのですが、boolean の値を定義する場合は YAML とは異なる事情があるようです。
ansibleで変数に入れたyes/noの扱いに苦しんだ - Qiita
自分なりにしらべたことや、試したことをまとめます。
ポイントは、 INI 形式では boolean 値になりそうな値の中では、大文字から始まる True / False が boolean になる点です。
INI 形式では True / False のみが boolean
以下の回答によると、大文字から始まる True や False のみを boolean として扱って、それ以外は文字列扱いになるようです。
How Exactly Does Ansible Parse Boolean Variables? - Stack Overflow
また、以下の公式サイトのページによると、INI 形式で定義した変数は python の ast.literal_eval で処理されるようです。
ini – Uses an Ansible INI file as inventory source. — Ansible Documentation
■ おためし
以下の Playbook で動作を確認します。環境は Ansible 2.7.5 です。
- hosts: localhost connection: local gather_facts: no tasks: - name: print value debug: msg: "{{ test_bool }}" - name: print type debug: msg: "{{ test_bool | type_debug }}"
type_debug フィルターで、Python としての型を確認できます。
INI 形式のインベントリファイルの場合
yes は文字列
インベントリファイル (INI)
localhost test_bool=yes
実行結果
文字列になりました。"yes" のようにダブルコーテーションがついています。
TASK [print value] *************************************************************
ok: [localhost] => {
"msg": "yes"
}
TASK [print type] **************************************************************
ok: [localhost] => {
"msg": "unicode"
}
true も文字列
インベントリファイル (INI)
localhost test_bool=true
実行結果
文字列になりました。
TASK [print value] *************************************************************
ok: [localhost] => {
"msg": "true"
}
TASK [print type] **************************************************************
ok: [localhost] => {
"msg": "unicode"
}
TRUE は文字列
インベントリファイル (INI)
localhost test_bool=TRUE
実行結果
文字列になりました。
TASK [print value] *************************************************************
ok: [localhost] => {
"msg": "TRUE"
}
TASK [print type] **************************************************************
ok: [localhost] => {
"msg": "unicode"
}
True は boolean
インベントリファイル (INI)
localhost test_bool=True
実行結果
booleanになりました。
TASK [print value] *************************************************************
ok: [localhost] => {
"msg": true
}
TASK [print type] **************************************************************
ok: [localhost] => {
"msg": "bool"
}
以降、比較のために YAML 形式でも試します。
YAML 形式のインベントリファイルの場合
yes は boolean
イベントリファイル (YAML)
all: hosts: localhost: test_bool: yes
実行結果
INI 形式のインベトリファイルで test_bool=yes と指定したときとは異なり、boolean になりました。
TASK [print value] *************************************************************
ok: [localhost] => {
"msg": true
}
TASK [print type] **************************************************************
ok: [localhost] => {
"msg": "bool"
}
vars で定義した場合
yes は boolean
イベントリファイル (INI)
ここでは変数は定義しません。
localhost
./host_vars/localhost.yml
ここに変数定義します。
test_bool: yes
実行結果
TASK [print value] *************************************************************
ok: [localhost] => {
"msg": true
}
TASK [print type] **************************************************************
ok: [localhost] => {
"msg": "bool"
}
■ まとめ
INI 形式と YAML 形式で boolean として扱う値の違いについて確認しました。
YAML 形式については、公式ドキュメントの YAML Syntax に記載されている通りyes / no / True / False などでも boolean になります。
一方、INI 形式については、boolean になりそうな値の中では、大文字から始まる True / False が boolean になります。
公式ドキュメントの Working with Inventory には、以下の注意書きがありました。
Values passed in the INI format using the
key=valuesyntax are not interpreted as Python literal structure (strings, numbers, tuples, lists, dicts, booleans, None), but as a string. For examplevar=FALSEwould create a string equal to ‘FALSE’. Do not rely on types set during definition, always make sure you specify type with a filter when needed when consuming the variable.
以下に結果をまとめます。
| フォーマット | 定義 | 結果 | 備考 |
|---|---|---|---|
| INI | test_bool=yes |
文字列 | |
| INI | test_bool=no |
文字列 | |
| INI | test_bool=true |
文字列 | |
| INI | test_bool=false |
文字列 | |
| INI | test_bool=TRUE |
文字列 | |
| INI | test_bool=FALSE |
文字列 | |
| INI | test_bool=True |
boolean | |
| INI | test_bool=False |
boolean | |
| YAML | test_bool: yes |
boolean | YAML Syntax 通り |
| YAML | test_bool: no |
boolean | YAML Syntax 通り |
| YAML | test_bool: true |
boolean | YAML Syntax 通り |
| YAML | test_bool: false |
boolean | YAML Syntax 通り |
| YAML | test_bool: True |
boolean | YAML Syntax 通り |
| YAML | test_bool: False |
boolean | YAML Syntax 通り |
| YAML | test_bool: yes |
boolean | YAML Syntax 通り |