Memo/Ansible/set_fact

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

set_fact: 変数に値をセットする


外部コマンドを連続実行して、内部変数に取り込む

  • 目的
    • 外部コマンドに PARAM1, PARAM2 を渡して実行し、結果を内部変数の var1, var2 に入れたい。
  • playbook.local.yml
    - hosts: localhost
      gather_facts: false
      become: no
      connection: local
      vars:
      - param_dict:
          PARAM1: var1
          PARAM2: var2
    
      tasks:
      - block:
        - name: shell
          shell: echo "{{ item }} result"
          register: result
          changed_when: false
          with_items: "{{ param_dict.keys() | list }}"
    
        - set_fact:
            "{{ param_dict[item.item] }}": "{{ item.stdout | trim }}"
          with_items: "{{ result.results }}"
          loop_control:
            label: "{{ item.item }}"
    
        - debug:
            msg: "{{ _msg.split('\n') }}"
          vars:
            _msg: |
              var1: {{ var1 }}
              var2: {{ var2 }}
  • 実行
    ansible-playbook playbook.local.yml
    ...
    TASK [debug] **************************************************************************************************************************************************
    ok: [localhost] => {
        "msg": [
            "var1: PARAM1 result", 
            "var2: PARAM2 result", 
            ""
        ]
    }

「is undefined」エラー

  • ansible 2.6.4では「set_fact: var1="val1"」とすると、var1を参照する部分でエラーになる。
  • 解決:
    set_fact:
      var1: "val1"

listにdictを複数追加する

  • array1を初期化しておかないとエラーになる。
  • 初期化は「array1: "array1 | default([]) | ..."」でもOK。
  • playbook
    - hosts:
        - localhost
      become: False
      gather_facts: False
      connection: local
      vars:
        dict1:
          key1: value1
          key2: value2
        dict2:
          key3: value3
        array1: []
      tasks:
        - set_fact:
            array1: "{{ array1 + [ item ] }}"
          with_items:
            - "{{ dict1 }}"
            - "{{ dict2 }}"
        - debug: var=array1
  • 実行結果
    ansible-playbook playbook.yml
    ...
    TASK [debug] *******************************************************************
    ok: [localhost] => {
        "array1": [
            {
                "key1": "value1", 
                "key2": "value2"
            }, 
            {
                "key3": "value3"
            }
        ]
    }

複雑なdictから、簡単なdictを生成する

- hosts:
    - localhost
  become: False
  gather_facts: False
  connection: local
  vars:
    results:
    - id: "0001"
      name: user01
      state: present
    - id: "0002"
      name: user02
      state: absent
    - id: "0003"
      name: user03
      state: present
    active_users: []
  tasks:
    - set_fact:
        active_users: "{{ active_users + [ { 'id':item.id, 'name':item.name } ] }}"
      when: item.state == 'present'
      with_items: "{{ results }}"
    - debug:
        var: active_users

同じset_fact内で定義した変数の参照でエラー

  • set_fact内で定義した変数を、同じset_fact内で参照しようとすると「'var1' is undefined」エラーになる。その場合はset_factを分ける
    - hosts:
      - localhost
      become: False
      gather_facts: False
      connection: local
      tasks:
      - set_fact:
          var1: "hoge"
          var2: "{{ var1 }}" # NG
      - set_fact:
          var2: "{{ var1 }}" # OK

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-10-15 (火) 19:02:10 (28d)