উত্তর: স্টোর কমান্ডের স্ট্রাউট নতুন ভেরিয়েবল?


86

আমার প্লেবুকের অভ্যন্তরে আমি একটি বহিরাগত কমান্ডের আউটপুট ধারণ করে একটি পরিবর্তনশীল তৈরি করতে চাই। এরপরে আমি কয়েকটি টেমপ্লেটে সেই পরিবর্তনশীলটি ব্যবহার করতে চাই।

প্লেবুকের সম্পর্কিত অংশগুলি এখানে:

  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পঠনযোগ্যতার জন্য এ থেকে মুক্তি পেতে চাই ।

উত্তর:



71

কোনও সত্য সেট করার দরকার নেই।

    - shell: cat "hello"
      register: cat_contents

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

14
এটি সহায়ক, তবে এর অর্থ এই নয় যে পরে আপনি যখন ভেরিয়েবলটি ব্যবহার করেন তখন আপনাকেও ব্যবহার করতে হবে মনে রাখতে হবে .stdout
টিম ম্যালোন

21

@ উডন্ডনের উত্তরের বাইরে কিছুটা পরিবর্তন। 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

8

আমি উত্তরসূরী একজন নবাগত, তবে আমি পরবর্তী সমাধানের পরামর্শ দেব:

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

এটি কাজ করা উচিত (এবং আমার জন্য কাজ করে) কারণ উত্তরযোগ্য অলস মূল্যায়ন ব্যবহার করে। তবে মনে হচ্ছে এটি প্রবর্তনের আগে বৈধতা যাচাই করে ফেলেছে, সুতরাং আমাকে যুদ্ধে সংজ্ঞা দিতে হবে command_output_full.stdout

এবং, অবশ্যই, যদি এটি varsবিভাগে এরকম অনেকগুলি ভার্স হয় তবে এটি কুরুচিপূর্ণ দেখাবে।


7

আপনি যেমন পাঠ্য ফলাফলের তুলনা করার জন্য একটি জটিল কমান্ড সঞ্চয় করতে চান উদাহরণস্বরূপ, ওএসের সংস্করণটির তুলনা করতে, সম্ভবত এটি আপনাকে সহায়তা করতে পারে:

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

আপনি যদি আরও যেতে চান এবং প্লেবুকের ফলাফলগুলি থেকে আপনি যে সঠিক তথ্য চান সেটি বের করতে চান, জেএসপাথের মতো জেএসএন কোয়েরি ভাষা ব্যবহার করুন, উদাহরণ:

  - 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') }}"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.