Memo/Ansible/set_fact

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

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


dict型の中のlist型に追加する

  • set_factは新しく変数を作るイメージ
  • 例: dict1.versions + dict2.versions
  • playbook.yml
    - hosts:
      - localhost
      become: false
      gather_facts: false
      connection: local
      vars:
      - dict1:
          name: "dict1"
          versions:
          - version: "1.0"
            providers:
            - name: prov1
      - dict2:
          name: "dict2"
          versions:
          - version: "2.0"
            providers:
            - name: prov2
      tasks:
      - set_fact:
          dict3: >
            {{
              dict1
              | combine(
                  {
                    'versions': dict1.versions + dict2.versions
                  }
                , recursive=True
                )
            }}
      - debug: var=dict3
  • 実行結果
    ansible-playbook playbook.yml
    ...
    TASK [debug] ****************************************************************************************************************
    ok: [localhost] => {
        "dict3": {
            "name": "dict1",
            "versions": [
                {
                    "providers": [
                        {
                            "name": "prov1"
                        }
                    ],
                    "version": "1.0"
                },
                {
                    "providers": [
                        {
                            "name": "prov2"
                        }
                    ],
                    "version": "2.0"
                }
            ]
        }
    }
    ...

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

  • 目的
    • 外部コマンドに 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-11-21 (木) 18:44:06 (314d)