pyramid13
pyramid13

Reputation: 286

store stdout to custome variables with set_fact

I have this output

- name: debug versions
  debug: var=get_version.stdout
  tags:
    - get_version

my output:

ok: [workstation] => {
    "get_version.stdout": "kubeadm_version: \"{{ kube_version }}\"\ncrun_version: 1.4.4\nrunc_version: v1.1.1\nkata_containers_version: 2.2.3\nyouki_version: 0.0.1\ngvisor_version: 20210921\ncontainerd_version: 1.6.3\ncri_dockerd_version: v0.2.0\ndocker_containerd_version: 1.4.12\ncalico_version: \"v3.22.2\"\ncalico_ctl_version: \"{{ calico_version }}\"\ncalico_cni_version: \"{{ calico_version }}\"\ncalico_flexvol_version: \"{{ calico_version }}\"\ncalico_policy_version: \"{{ calico_version }}\"\ncalico_typha_version: \"{{ calico_version }}\"\ncalico_apiserver_version: \"{{ calico_version }}\"\nflannel_version: \"v0.17.0\"\nflannel_cni_version: \"v1.0.1\"\ncni_version: \"v1.0.1\"\nweave_version: 2.8.1\npod_infra_version: \"3.3\"\ncilium_version: \"v1.11.1\"\nkube_ovn_version: \"v1.8.1\"\nkube_router_version: \"v1.4.0\"\nmultus_version: \"v3.8\"\nhelm_version: \"v3.8.2\"\nnerdctl_version: \"0.19.0\"\nkrew_version: \"v0.4.2\"\nkube_major_version: \"{{ kube_version | regex_replace('^v([0-9])+\\\\.([0-9]+)\\\\.[0-9]+', 'v\\\\1.\\\\2') }}\"\netcd_version: \"{{ etcd_supported_versions[kube_major_version] }}\"\ncrictl_version: \"{{ crictl_supported_versions[kube_major_version] }}\"\nnetcheck_version: \"v1.2.2\"\ncoredns_version: \"{{ 'v1.8.6' if (kube_version is version('v1.23.0','>=')) else 'v1.8.0' }}\"\nnodelocaldns_version: \"1.21.1\"\ndnsautoscaler_version: 1.8.5\nmetrics_server_version: \"v0.5.2\"\ncert_manager_version: \"v1.8.0\"\nmetallb_version: v0.12.1"
}

I want to access each tools version value. e.g: v0.12.1 for metallb_version or 1.6.3 for containerd_version

Upvotes: 0

Views: 227

Answers (2)

Vladimir Botka
Vladimir Botka

Reputation: 68404

shell> cat conf.j2
kubeadm_version: "{{ kube_version }}"
crun_version: 1.4.4
runc_version: v1.1.1
kata_containers_version: 2.2.3
youki_version: 0.0.1
gvisor_version: 20210921
containerd_version: 1.6.3
cri_dockerd_version: v0.2.0
docker_containerd_version: 1.4.12
calico_version: "v3.22.2"
calico_ctl_version: "{{ calico_version }}"
calico_cni_version: "{{ calico_version }}"
calico_flexvol_version: "{{ calico_version }}"
calico_policy_version: "{{ calico_version }}"
calico_typha_version: "{{ calico_version }}"
calico_apiserver_version: "{{ calico_version }}"
flannel_version: "v0.17.0"
flannel_cni_version: "v1.0.1"
cni_version: "v1.0.1"
weave_version: 2.8.1
pod_infra_version: "3.3"
cilium_version: "v1.11.1"
kube_ovn_version: "v1.8.1"
kube_router_version: "v1.4.0"
multus_version: "v3.8"
helm_version: "v3.8.2"
nerdctl_version: "0.19.0"
krew_version: "v0.4.2"
kube_major_version: "{{ kube_version | regex_replace('^v([0-9])+\\.([0-9]+)\\.[0-9]+', 'v\\1.\\2') }}"
etcd_version: "{{ etcd_supported_versions[kube_major_version] }}"
crictl_version: "{{ crictl_supported_versions[kube_major_version] }}"
netcheck_version: "v1.2.2"
coredns_version: "{{ 'v1.8.6' if (kube_version is version('v1.23.0','>=')) else 'v1.8.0' }}"
nodelocaldns_version: "1.21.1"
dnsautoscaler_version: 1.8.5
metrics_server_version: "v0.5.2"
cert_manager_version: "v1.8.0"
metallb_version: v0.12.1

What you see is the raw content of the file

    - command: cat conf.j2
      register: get_version
    - debug:
        var: get_version.stdout

rendered by the Ansible default callback plugin (ANSIBLE_STDOUT_CALLBACK=default)

ok: [localhost] => {
    "get_version.stdout": "kubeadm_version: \"{{ kube_version }}\"\ncrun_version: 1.4.4\nrunc_version: v1.1.1\nkata_containers_version: 2.2.3\nyouki_version: 0.0.1\ngvisor_version: 20210921\ncontainerd_version: 1.6.3\ncri_dockerd_version: v0.2.0\ndocker_containerd_version: 1.4.12\ncalico_version: \"v3.22.2\"\ncalico_ctl_version: \"{{ calico_version }}\"\ncalico_cni_version: \"{{ calico_version }}\"\ncalico_flexvol_version: \"{{ calico_version }}\"\ncalico_policy_version: \"{{ calico_version }}\"\ncalico_typha_version: \"{{ calico_version }}\"\ncalico_apiserver_version: \"{{ calico_version }}\"\nflannel_version: \"v0.17.0\"\nflannel_cni_version: \"v1.0.1\"\ncni_version: \"v1.0.1\"\nweave_version: 2.8.1\npod_infra_version: \"3.3\"\ncilium_version: \"v1.11.1\"\nkube_ovn_version: \"v1.8.1\"\nkube_router_version: \"v1.4.0\"\nmultus_version: \"v3.8\"\nhelm_version: \"v3.8.2\"\nnerdctl_version: \"0.19.0\"\nkrew_version: \"v0.4.2\"\nkube_major_version: \"{{ kube_version | regex_replace('^v([0-9])+\\\\.([0-9]+)\\\\.[0-9]+', 'v\\\\1.\\\\2') }}\"\netcd_version: \"{{ etcd_supported_versions[kube_major_version] }}\"\ncrictl_version: \"{{ crictl_supported_versions[kube_major_version] }}\"\nnetcheck_version: \"v1.2.2\"\ncoredns_version: \"{{ 'v1.8.6' if (kube_version is version('v1.23.0','>=')) else 'v1.8.0' }}\"\nnodelocaldns_version: \"1.21.1\"\ndnsautoscaler_version: 1.8.5\nmetrics_server_version: \"v0.5.2\"\ncert_manager_version: \"v1.8.0\"\nmetallb_version: v0.12.1"
}

The same in a quotation block for better readability

ok: [localhost] => { "get_version.stdout": "kubeadm_version: "{{ kube_version }}"\ncrun_version: 1.4.4\nrunc_version: v1.1.1\nkata_containers_version: 2.2.3\nyouki_version: 0.0.1\ngvisor_version: 20210921\ncontainerd_version: 1.6.3\ncri_dockerd_version: v0.2.0\ndocker_containerd_version: 1.4.12\ncalico_version: "v3.22.2"\ncalico_ctl_version: "{{ calico_version }}"\ncalico_cni_version: "{{ calico_version }}"\ncalico_flexvol_version: "{{ calico_version }}"\ncalico_policy_version: "{{ calico_version }}"\ncalico_typha_version: "{{ calico_version }}"\ncalico_apiserver_version: "{{ calico_version }}"\nflannel_version: "v0.17.0"\nflannel_cni_version: "v1.0.1"\ncni_version: "v1.0.1"\nweave_version: 2.8.1\npod_infra_version: "3.3"\ncilium_version: "v1.11.1"\nkube_ovn_version: "v1.8.1"\nkube_router_version: "v1.4.0"\nmultus_version: "v3.8"\nhelm_version: "v3.8.2"\nnerdctl_version: "0.19.0"\nkrew_version: "v0.4.2"\nkube_major_version: "{{ kube_version | regex_replace('^v([0-9])+\\.([0-9]+)\\.[0-9]+', 'v\\1.\\2') }}"\netcd_version: "{{ etcd_supported_versions[kube_major_version] }}"\ncrictl_version: "{{ crictl_supported_versions[kube_major_version] }}"\nnetcheck_version: "v1.2.2"\ncoredns_version: "{{ 'v1.8.6' if (kube_version is version('v1.23.0','>=')) else 'v1.8.0' }}"\nnodelocaldns_version: "1.21.1"\ndnsautoscaler_version: 1.8.5\nmetrics_server_version: "v0.5.2"\ncert_manager_version: "v1.8.0"\nmetallb_version: v0.12.1" }


  • As a side note, you might want to render the output by the Ansible yaml callback plugin (ANSIBLE_STDOUT_CALLBACK=yaml)
ok: [localhost] => 
  get_version.stdout: |-
    kubeadm_version: "{{ kube_version }}"
    crun_version: 1.4.4
    runc_version: v1.1.1
    kata_containers_version: 2.2.3
    youki_version: 0.0.1
    gvisor_version: 20210921
    containerd_version: 1.6.3
    cri_dockerd_version: v0.2.0
    docker_containerd_version: 1.4.12
    calico_version: "v3.22.2"
    calico_ctl_version: "{{ calico_version }}"
    calico_cni_version: "{{ calico_version }}"
    calico_flexvol_version: "{{ calico_version }}"
    calico_policy_version: "{{ calico_version }}"
    calico_typha_version: "{{ calico_version }}"
    calico_apiserver_version: "{{ calico_version }}"
    flannel_version: "v0.17.0"
    flannel_cni_version: "v1.0.1"
    cni_version: "v1.0.1"
    weave_version: 2.8.1
    pod_infra_version: "3.3"
    cilium_version: "v1.11.1"
    kube_ovn_version: "v1.8.1"
    kube_router_version: "v1.4.0"
    multus_version: "v3.8"
    helm_version: "v3.8.2"
    nerdctl_version: "0.19.0"
    krew_version: "v0.4.2"
    kube_major_version: "{{ kube_version | regex_replace('^v([0-9])+\\.([0-9]+)\\.[0-9]+', 'v\\1.\\2') }}"
    etcd_version: "{{ etcd_supported_versions[kube_major_version] }}"
    crictl_version: "{{ crictl_supported_versions[kube_major_version] }}"
    netcheck_version: "v1.2.2"
    coredns_version: "{{ 'v1.8.6' if (kube_version is version('v1.23.0','>=')) else 'v1.8.0' }}"
    nodelocaldns_version: "1.21.1"
    dnsautoscaler_version: 1.8.5
    metrics_server_version: "v0.5.2"
    cert_manager_version: "v1.8.0"
    metallb_version: v0.12.1

  • The purpose of the template files is to substitute the variables, evaluate the expressions, and, optionally, create files. For example, use the template plugin and display the result, e.g.
    - debug:
        msg: "{{ lookup('template', 'conf.j2') }}"
      vars:
        kube_major_version: '1'
        kube_version: 'v1.23'
        calico_version: '3.22'
        etcd_supported_versions:
          '1': ['3.5', '3.4', '3.3']
        crictl_supported_versions:
          '1': ['1.15', '1.14', '1.13']
ok: [localhost] => 
  msg: |-
    kubeadm_version: "v1.23"
    crun_version: 1.4.4
    runc_version: v1.1.1
    kata_containers_version: 2.2.3
    youki_version: 0.0.1
    gvisor_version: 20210921
    containerd_version: 1.6.3
    cri_dockerd_version: v0.2.0
    docker_containerd_version: 1.4.12
    calico_version: "v3.22.2"
    calico_ctl_version: "3.22"
    calico_cni_version: "3.22"
    calico_flexvol_version: "3.22"
    calico_policy_version: "3.22"
    calico_typha_version: "3.22"
    calico_apiserver_version: "3.22"
    flannel_version: "v0.17.0"
    flannel_cni_version: "v1.0.1"
    cni_version: "v1.0.1"
    weave_version: 2.8.1
    pod_infra_version: "3.3"
    cilium_version: "v1.11.1"
    kube_ovn_version: "v1.8.1"
    kube_router_version: "v1.4.0"
    multus_version: "v3.8"
    helm_version: "v3.8.2"
    nerdctl_version: "0.19.0"
    krew_version: "v0.4.2"
    kube_major_version: "v1.23"
    etcd_version: "['3.5', '3.4', '3.3']"
    crictl_version: "['1.15', '1.14', '1.13']"
    netcheck_version: "v1.2.2"
    coredns_version: "v1.8.0"
    nodelocaldns_version: "1.21.1"
    dnsautoscaler_version: 1.8.5
    metrics_server_version: "v0.5.2"
    cert_manager_version: "v1.8.0"
    metallb_version: v0.12.1

  • Or, use the template module to create a file, e.g.
    - template:
        src: conf.j2
        dest: conf
      vars:
        kube_major_version: '1'
        kube_version: 'v1.23'
        calico_version: '3.22'
        etcd_supported_versions:
          '1': ['3.5', '3.4', '3.3']
        crictl_supported_versions:
          '1': ['1.15', '1.14', '1.13']
shell> cat conf
kubeadm_version: "v1.23"
crun_version: 1.4.4
runc_version: v1.1.1
kata_containers_version: 2.2.3
youki_version: 0.0.1
gvisor_version: 20210921
containerd_version: 1.6.3
cri_dockerd_version: v0.2.0
docker_containerd_version: 1.4.12
calico_version: "v3.22.2"
calico_ctl_version: "3.22"
calico_cni_version: "3.22"
calico_flexvol_version: "3.22"
calico_policy_version: "3.22"
calico_typha_version: "3.22"
calico_apiserver_version: "3.22"
flannel_version: "v0.17.0"
flannel_cni_version: "v1.0.1"
cni_version: "v1.0.1"
weave_version: 2.8.1
pod_infra_version: "3.3"
cilium_version: "v1.11.1"
kube_ovn_version: "v1.8.1"
kube_router_version: "v1.4.0"
multus_version: "v3.8"
helm_version: "v3.8.2"
nerdctl_version: "0.19.0"
krew_version: "v0.4.2"
kube_major_version: "v1.23"
etcd_version: "['3.5', '3.4', '3.3']"
crictl_version: "['1.15', '1.14', '1.13']"
netcheck_version: "v1.2.2"
coredns_version: "v1.8.0"
nodelocaldns_version: "1.21.1"
dnsautoscaler_version: 1.8.5
metrics_server_version: "v0.5.2"
cert_manager_version: "v1.8.0"
metallb_version: v0.12.1

  • You can also include the variables and, optionally, put them into a dictionary, e.g.
    - include_vars:
        file: conf.j2
        name: conf
    - debug:
        var: conf
ok: [localhost] => 
  conf:
    calico_apiserver_version: '3.22'
    calico_cni_version: '3.22'
    calico_ctl_version: '3.22'
    calico_flexvol_version: '3.22'
    calico_policy_version: '3.22'
    calico_typha_version: '3.22'
    calico_version: v3.22.2
    cert_manager_version: v1.8.0
    cilium_version: v1.11.1
    cni_version: v1.0.1
    containerd_version: 1.6.3
    coredns_version: v1.8.0
    cri_dockerd_version: v0.2.0
    crictl_version:
    - '1.15'
    - '1.14'
    - '1.13'
    crun_version: 1.4.4
    dnsautoscaler_version: 1.8.5
    docker_containerd_version: 1.4.12
    etcd_version:
    - '3.5'
    - '3.4'
    - '3.3'
    flannel_cni_version: v1.0.1
    flannel_version: v0.17.0
    gvisor_version: 20210921
    helm_version: v3.8.2
    kata_containers_version: 2.2.3
    krew_version: v0.4.2
    kube_major_version: v1.23
    kube_ovn_version: v1.8.1
    kube_router_version: v1.4.0
    kubeadm_version: v1.23
    metallb_version: v0.12.1
    metrics_server_version: v0.5.2
    multus_version: v3.8
    nerdctl_version: 0.19.0
    netcheck_version: v1.2.2
    nodelocaldns_version: 1.21.1
    pod_infra_version: '3.3'
    runc_version: v1.1.1
    weave_version: 2.8.1
    youki_version: 0.0.1

Upvotes: 1

mdaniel
mdaniel

Reputation: 33231

The |from_yaml filter was designed for that problem

- set_fact:
    metallb_version: '{{ (get_version.stdout | from_yaml).metallb_version }}'
- debug: var=metallb_version

if you want to do multiple of them, then coerce the stdout to a local dict and extract multiple facts at once:

- set_fact:
    metallb_version: '{{ ver_dict.metallb_version }}'
    containerd_version: '{{ ver_dict.containerd_version }}'
  vars:
    ver_dict: '{{ get_version.stdout | from_yaml }}'

Upvotes: 3

Related Questions