تشغيل أمر أنسيبل في حاويات عامل الميناء متعددة

أحتاج إلى تشغيل أمر ضد حاويات تشغيل متعددة. على سبيل المثال ، لنفترض أن تطبيقي يحتاج إلى تشغيل تحديث بنية البيانات مقابل قاعدة بيانات بعد تلقي تحديثات التعليمات البرمجية. للقيام بذلك ، ونحن نريد لتشغيل docker build <project_dir> -t latest، ثم docker stop; docker rm; docker run. في هذه المرحلة ، يمكننا أن نفترض أننا قمنا بتحديث الكود الأساسي للحاوية ، لكننا ما زلنا بحاجة إلى تشغيل تحديث قاعدة البيانات باستخدام الأدوات الخاصة بالتطبيق.

أساسا ، أنا بحاجة إلى بعض الطريق للحصول على قائمة من الحاويات قيد التشغيل ، تصفيتها من قبل بعض المعايير ، وتسجيل تلك معرفات الحاويات مع أنسيبل. ثم لكل حاوية نقوم بتشغيل الأمر.

مثل هذا:

- name: Get list of running containers  docker:      image: my-image:latest      state: running      register: container_ids

ستقوم هذه المهمة بتخزين قائمة الحاويات قيد التشغيل التي تستخدم my-image:latest إلى container_ids. ثم نقوم بتنفيذ الأمر:

- name: Exec the database update  cmd: "docker exec -it {{ item }} my-app-db-update.sh"  with: container_ids

نظرا لأننا لا نريد حقا استخدام الحاويات النشطة لهذا النوع من العمليات، فإن الخيار الأفضل هو بدء حاوية جديدة للاستخدام مرة واحدة تعمل على نفس البيانات بدلا من ذلك:

- name: Run the database update  cmd: "docker run --rm --volumes-from {{ item }} --link:mydb:db my-app sh -c 'my-app-db-update.sh'"  with: container_ids

ما سبق هو رمز زائف فقط-لن يتم تشغيله بالفعل. كيف يمكنني إنجاز مهمة تخزين قائمة تشغيل حاويات عامل الميناء التي تلبي معايير معينة ، حتى أتمكن من تطبيق أمر على كل حاوية في القائمة باستخدام إما docker exec أو docker run?

هناك القليل من المستغرب حول هذا على الانترنت.

بالنظر إلى المثال التالي الناتج من docker ps:

$ docker psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES7e21761c9c44        busybox             "top"                    22 minutes ago      Up 22 minutes                           agitated_yonath7091d9c7cc56        nginx               "nginx -g 'daemon off"   23 minutes ago      Up 23 minutes       80/tcp, 443/tcp     fervent_blackwell

وهذا قواعد اللعبة التي تمارسها تعطيك فكرة عن كيفية التقاط البيانات التي تحتاج إليها وكيفية تشغيل الإجراءات بالتكرار على القائمة المقدمة. إنه مثال بسيط للغاية ، وسيتعين عليك تكييفه مع احتياجاتك. هذا عن قصد:

---- hosts: localhost  gather_facts: no  tasks:  - name: gather list of containers    shell: docker ps | awk '/{{ item }}/{print $1}'    register: list_of_containers    with_items:      - busybox  #- name: debug  #  debug: msg="{{ list_of_containers }}"  - name: run action in container(s)    docker_container:      name: temp-container      image: busybox      command: uptime      cleanup: yes      detach: yes    register: result_of_action    with_items:      - list_of_containers.results.stdout_lines

الأجزاء المثيرة للاهتمام هي:

  1. جمع قائمة الحاويات في مضيف معين (localhost في بلدي على سبيل المثال).لقد استخدمت سهل shell الاحتجاج لتكون قادرة على استخدام awk لتصفية الإخراج. يتم تخزين النتيجة في سجل. منذ المدخلات هي قائمة ، وهذا سيكون له نتيجة مباشرة على كيفية استرداد البيانات مرة أخرى ، أكثر أدناه. عدم التعليق على debug مهمة بين لمقارنة البيانات المخزنة في السجل مع وبدون قائمة.

  2. كرر على نتائج السجل (معرف الحاوية) واستخدم docker_container وحدة لتشغيل إجراء (command المعلمة). يمكنك استخدام links و volumes_from في الخاص بك docker_container الاحتجاج. تحقق من وثائق على الانترنت من الوحدة للحصول على التفاصيل.

@ تريج ، يجب تطبيق هذا على الحاويات التي تعمل على نظام واحد ، وليس على عدة حاويات. إذا كنت بحاجة إلى تطبيق الأمر على أنظمة متعددة ، فسأستخدم ببساطة قائمة جرد لتحقيق ذلك.

لقد قمت بتحرير السؤال. ويشمل الآن علامة استفهام.

لذلك كنت في الواقع يسأل عن بناء جملة من الأنابيب مماثلة ل ‘عامل الميناء بس | البقرى بلدي صورة: أحدث / قطع و 1’?

لا @تكراف ، انها أكثر كفاءة لاستخدام عامل الميناء بس filter تصفية في تلك الحالة. والسؤال هو حول إديمبوتنسي وأفضل الممارسات ، منذ تشغيل ما سبق كأوامر قذيفة ليست إديمبوتنت. كنت قد فكرت أنه سيكون من المنطقي استخدام أبي عامل الميناء الخاص أنسيبل لإنجاز هذا ، إذا كان قادرا.

ماذا إديمبوتنسي لها علاقة مع الاستعلام? أي استفسار. يرجى توضيح.

إديمبوتنسي هو مفهوم مهم مع أنسيبل ، @تكراف. عند تشغيل أوامر شل بسذاجة باستخدام أنسيبل ، نفقد القدرة على تقييم ما إذا كان النظام قد استوفى متطلبات قواعد اللعبة (وتخطي المهمة) أم لا. هذا هو السبب في أنه من المستحسن دائما لتشغيل وحدات أبي الأصلية أنسيبل بدلا من قذيفة. الدول دليل أنسيبل ، ورت إلى ستدوت_لينس ، وليس لاستخدامه في كثير من الأحيان على هذا الحساب.