Memo/Ansible/Variables

https://dexlab.net:443/pukiwiki/index.php?Memo/Ansible/Variables
 


Variables 変数

  • yaml自体の機能でエイリアスマージができる
  • group_vars/all.yml にいれると全てのグループで有効になる
  • group_varsやhost_varsはグループ名やホスト名のディレクトリを作って、それ以下に複数のymlを入れると全て読み込む。長いymlを分割したい場合に便利
    • group_vars/web/var1.yml
    • host_vars/web01/var1.yml
  • 定数と変数の結合
      stat: path="{{ '/etc/sysconfig/network-scripts/ifcfg-' + item }}"
      with_items: "{{ ansible_interfaces }}"
  • 結合した後にフィルタ
    "{{ ('/etc/sysconfig/network-scripts/ifcfg-' + item) | dirname }}"
  • フィルターが使える。例: test.yml
    - hosts: 127.0.0.1
      gather_facts: False
      vars:
        test_list: [ aaa, bbb, ccc ]
        test_path: /tmp/parent1/child1/child2/test.txt
      tasks:
        - name: join
          debug: var="{{ test_list | join(' ') }}"
        - name: basename
          debug: var={{ test_path | basename }}
        - name: dirname
          debug: var={{ test_path | dirname }}
        - name: expanduser
          debug: var={{ '~/test' | expanduser }}
    • 実行結果
      ansible-playbook test.yml
      
      TASK: [join] ****************************************************************** 
      ok: [127.0.0.1] => {
          "aaa bbb ccc": "{{ aaa bbb ccc }}"
      }
      
      TASK: [basename] ************************************************************** 
      ok: [127.0.0.1] => {
          "test.txt": "{{ test.txt }}"
      }
      
      TASK: [dirname] *************************************************************** 
      ok: [127.0.0.1] => {
          "/tmp/parent1/child1/child2": "{{ /tmp/parent1/child1/child2 }}"
      }
      
      TASK: [expanduser] ************************************************************ 
      ok: [127.0.0.1] => {
          "/home/CURRENT_USER/test": "{{ /home/CURRENT_USER/test }}"
      }
  • var1: 0010 と定義すると先頭の0が省略され "10"になる。文字列として解釈させるには var1: "0010" とする必要がある
  • roleにデフォルト変数を設定する時は、varsではなく、defaultsを使った方が良い。varsだと、group_varsより優先度が高いため、varsの値が優先される。
    • roles/x/defaults/main.yml
      x_val1: default1

vars_files: 変数を別ファイルにして読み込む

  • 一部の変数だけを別ファイルにできる
    vars_files:
      - vars/external_vars.yml

動的にvars_filesを指定する

  • playbook.yml
    - hosts: localhost
      vars:
        - var_file1: example1.yml
      vars_files:
        - "vars/{{ var_file1 }}"
      tasks:
        - debug: var=foo
  • デフォルトでは「vars/example1.yml」が読み込まれ、-eオプションで「vars/example2.yml」を読み込む例。
    ansible-playbook playbook.yml -e "var_file1=example2.yml"

長い変数の分割

  • Memo/yaml参照。アンカー/エイリアスを使う
    • 1 yamlファイル内のみ。複数のyamlファイルに分割すると使えなかった。(ansible 2.5.3)
  • 複数のyamlファイルに分かれている場合、jinja2テンプレートの機能が使える
    long_dict1_key2:
      key1: val1
      key2: val2
    long_dict1:
      key1:
        key1: val1
        key2: val2
      key2: "{{ long_dict1_key2 }}"

変数の動的参照

ある変数を元に別の変数を参照したい場合。

  • ansible_os_family, ansible_distribution_major_version によって参照する変数の内容を変更する。ポイントはhashのkeyが数値だと参照時にエラーになる。ダブルクオートで囲んで文字列と扱う。
    - hosts: localhost
      gather_facts: true
      become: no
      connection: local
      vars:
      - os_var:
          RedHat:
            "6": /path/to/centos6
            "7": /path/to/centos7
      tasks:
      - debug: msg="{{ os_var[ansible_os_family][ansible_distribution_major_version] }}"

eval()のような使い方

TASK [debug] **********************************
ok: [localhost] => {
    "changed": false, 
    "hash1": {
        "key1": [
            "aaa", 
            "bbb", 
            "ccc"
        ]
    }
}

TASK [debug] ***********************************

ok: [localhost] => {
    "changed": false, 
    "msg": [
        "aaa", 
        "bbb", 
        "ccc"
    ]
}

hash変数のマージ

hash型変数の場合、通常はreplaceなので全て置き換わる。
hash内の一部だけ変えたい(マージ)場合、ansible.cfgで「hash_behaviour = merge」にする必要がある。

  • default.yml
    example_conf:
      var1: foo
      var2: bar
  • web.yml
    example_conf:
      var1: hoge
  • playbook.yml
      vars_files:
        - default.yml
        - web.yml
  • playbookの実行結果: デフォルトは「hash_behaviour = replace」なので「var2」が消える。
  • マージしたい場合
    • hash_behaviour
    • ansible v1.9: var1だけが上書きされ、var2はそのまま
      vi ./ansible.cfg
      ----
      [defaults]
      hash_behaviour = merge
      ----
    • ansible v2.0: include_vars_merged が使える

Magic Variables マジック変数

  • Accessing information about other hosts with magic variables
    • 定義済み変数
    • varsも参照できる
    • gather_facts: Falseでも参照できる
    • group_names: ホストが所属するグループ一覧
    • groups: グループとホスト
    • inventory_hostname: インベントリに書かれたホスト名
    • inventory_hostname_short: inventory_hostnameの初めの"."まで
    • play_hosts: Playbook対象のホスト
    • inventory_dir: インベントリ(hosts.ini)のディレクトリ
    • inventory_file: インベントリ(hosts.ini)のフルパス

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-12-04 (火) 18:12:26 (14d)