Ansible: Store command's stdout in new variable?

前端 未结 6 630
暗喜
暗喜 2020-12-22 22:35

Inside my playbook I\'d like to create a variable holding the output of an external command. Afterwards I want to make use of that variable in a couple of templates.

相关标签:
6条回答
  • 2020-12-22 22:46

    There's no need to set a fact.

        - shell: cat "hello"
          register: cat_contents
    
        - shell: echo "I cat hello"
          when: cat_contents.stdout == "hello"
    
    0 讨论(0)
  • 2020-12-22 23:01

    If you want to go further and extract the exact information you want from the Playbook results, use JSON query language like jmespath, an example:

      - name: Sample Playbook
        // Fill up your task
        no_log: True
        register: example_output
    
      - name: Json Query
        set_fact:
          query_result:
            example_output:"{{ example_output | json_query('results[*].name') }}"
    
    0 讨论(0)
  • 2020-12-22 23:09

    A slight modification beyond @udondan's answer. I like to reuse the registered variable names with the set_fact to help keep the clutter to a minimum.

    So if I were to register using the variable, psk, I'd use that same variable name with creating the set_fact.

    Example

    - name: generate PSK
      shell: openssl rand -base64 48
      register: psk
      delegate_to: 127.0.0.1
      run_once: true
    
    - set_fact: 
        psk={{ psk.stdout }}
    
    - debug: var=psk
      run_once: true
    

    Then when I run it:

    $ ansible-playbook -i inventory setup_ipsec.yml
    
     PLAY                                                                                                                                                                                [all] *************************************************************************************************************************************************************************
    
     TASK [Gathering                                                                                                                                                                     Facts] *************************************************************************************************************************************************************
     ok: [hostc.mydom.com]
     ok: [hostb.mydom.com]
     ok: [hosta.mydom.com]
    
     TASK [libreswan : generate                                                                                                                                                          PSK] ****************************************************************************************************************************************************
     changed: [hosta.mydom.com -> 127.0.0.1]
    
     TASK [libreswan :                                                                                                                                                                   set_fact] ********************************************************************************************************************************************************
     ok: [hosta.mydom.com]
     ok: [hostb.mydom.com]
     ok: [hostc.mydom.com]
    
     TASK [libreswan :                                                                                                                                                                   debug] ***********************************************************************************************************************************************************
     ok: [hosta.mydom.com] => {
         "psk": "6Tx/4CPBa1xmQ9A6yKi7ifONgoYAXfbo50WXPc1kGcird7u/pVso/vQtz+WdBIvo"
     }
    
     PLAY                                                                                                                                                                                RECAP *************************************************************************************************************************************************************************
     hosta.mydom.com    : ok=4    changed=1    unreachable=0    failed=0
     hostb.mydom.com    : ok=2    changed=0    unreachable=0    failed=0
     hostc.mydom.com    : ok=2    changed=0    unreachable=0    failed=0
    
    0 讨论(0)
  • 2020-12-22 23:10

    I'm a newbie in Ansible, but I would suggest next solution:

    playbook.yml

    ...
    vars:
      command_output_full:
        stdout: will be overriden below
      command_output: {{ command_output_full.stdout }}
    ...
    ...
    ...
    tasks:
      - name: Create variable from command
        command: "echo Hello"
        register: command_output_full
      - debug: msg="{{ command_output }}"
    

    It should work (and works for me) because Ansible uses lazy evaluation. But it seems it checks validity before the launch, so I have to define command_output_full.stdout in vars.

    And, of course, if it is too many such vars in vars section, it will look ugly.

    0 讨论(0)
  • 2020-12-22 23:12

    You have to store the content as a fact:

    - set_fact:
        string_to_echo: "{{ command_output.stdout }}"
    
    0 讨论(0)
  • 2020-12-22 23:12

    In case than you want to store a complex command to compare text result, for example to compare the version of OS, maybe this can help you:

    tasks:
           - shell: echo $(cat /etc/issue | awk {'print $7'})
             register: echo_content
    
           - shell: echo "It works"
             when: echo_content.stdout == "12"
             register: out
           - debug: var=out.stdout_lines
    
    0 讨论(0)
提交回复
热议问题