Ansible: नए चर में स्टोर कमांड का स्टडआउट?


85

अपनी प्लेबुक के अंदर मैं एक वैरिएबल कमांड के आउटपुट को पकड़कर एक वैरिएबल बनाना चाहूंगा। बाद में मैं एक-दो खाकों में उस चर का उपयोग करना चाहता हूं।

यहाँ प्लेबुक के प्रासंगिक भाग हैं:

  tasks:
    - name: Create variable from command
      command: "echo Hello"
      register: command_output
    - debug: msg="{{command_output.stdout}}"

    - name: Copy test service
      template: src=../templates/test.service.j2 dest=/tmp/test.service
    - name: Enable test service
      shell: systemctl enable /tmp/test.service
    - name: Start test service
      shell: systemctl start test.service

और मान लें कि यह मेरा टेम्प्लेट है:

[Unit]
Description=MyApp
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill busybox1
ExecStartPre=-/usr/bin/docker rm busybox1
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/sh -c "while true; do echo {{ string_to_echo }}; sleep 1; done"

[Install]
WantedBy=multi-user.target

(नोटिस {{ string_to_echo }})

तो जो मैं मूल रूप से देख रहा हूं वह command_output.stdoutएक नए चर में (पहले कार्य के दौरान उत्पन्न / प्राप्त) की सामग्री को संग्रहीत करने का एक तरीका है string_to_echo
उस चर को मैं बाद में कई टेम्प्लेट में उपयोग करना चाहूंगा।

मुझे लगता है कि मैं सिर्फ {{command_output.stdout}}अपने टेम्पलेट्स में उपयोग कर सकता हूं, लेकिन मैं .stdoutपठनीयता से छुटकारा चाहता हूं ।

जवाबों:



69

कोई तथ्य सेट करने की आवश्यकता नहीं है।

    - shell: cat "hello"
      register: cat_contents

    - shell: echo "I cat hello"
      when: cat_contents.stdout == "hello"

13
यह मददगार है, लेकिन इसका मतलब यह है कि बाद में जब आप वैरिएबल का उपयोग करते हैं तो आपको इसका उपयोग करने के लिए याद रखना होगा .stdout
टिम मेलोन

20

@ Udondan के उत्तर से परे एक मामूली संशोधन। मैं set_factअव्यवस्था को न्यूनतम रखने में मदद करने के लिए पंजीकृत चर नामों का पुन: उपयोग करना पसंद करता हूं ।

इसलिए अगर मैं चर का उपयोग करके पंजीकरण कर pskरहा था , तो , मैं उसी चर नाम का उपयोग करूंगा set_fact

उदाहरण

- 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

फिर जब मैं इसे चलाता हूं:

$ 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

7

मैं Ansible में नौसिखिया हूं, लेकिन मैं अगला समाधान सुझाऊंगा:

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 }}"

यह काम करना चाहिए (और मेरे लिए काम करता है) क्योंकि Ansible आलसी मूल्यांकन का उपयोग करता है। लेकिन ऐसा लगता है कि यह लॉन्च से पहले वैधता की जांच करता है, इसलिए मुझे command_output_full.stdoutvars में परिभाषित करना होगा ।

और, ज़ाहिर है, अगर यह varsखंड में कई ऐसे संस्करण हैं, तो यह बदसूरत दिखाई देगा।


7

उदाहरण के लिए, यदि आप OS के संस्करण की तुलना करना चाहते हैं, तो आप एक जटिल कमांड स्टोर कर सकते हैं, उदाहरण के लिए, यह आपकी मदद कर सकता है:

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

1

यदि आप आगे जाना चाहते हैं और Playbook परिणामों से इच्छित सटीक जानकारी निकालना चाहते हैं, तो JSON की तरह JSON क्वेरी भाषा का उपयोग करें (उदाहरण:

  - 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') }}"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.