วิธีการเรียกใช้งานเพียงงานเดียวในเพลย์บุ๊ค ansible ได้อย่างไร


172

มีวิธีในการใช้งานเพียงงานเดียวในเพลย์บุ๊คที่ขายได้หรือไม่?

roles/hadoop_primary/tasks/hadoop_master.ymlยกตัวอย่างเช่นใน ฉันมี"start hadoop job tracker services"งาน ฉันสามารถรันภารกิจนั้นได้หรือไม่?

ไฟล์ hadoop_master.yml:

---
# Playbook for  Hadoop master servers

- name: Install the namenode and jobtracker packages
  apt: name={{item}} force=yes state=latest
  with_items: 
   - hadoop-0.20-mapreduce-jobtracker
   - hadoop-hdfs-namenode
   - hadoop-doc
   - hue-plugins

- name: start hadoop jobtracker services
  service: name=hadoop-0.20-mapreduce-jobtracker state=started
  tags:
   debug

คำตอบ:


248

คุณควรใช้tags:เป็นเอกสารในhttp://docs.ansible.com/playbooks_tags.html


หากคุณมี playbook ขนาดใหญ่อาจเป็นประโยชน์ที่จะสามารถเรียกใช้ส่วนใดส่วนหนึ่งของการกำหนดค่าโดยไม่ต้องเรียกใช้ playbook ทั้งหมด

ทั้งบทละครและงานสนับสนุนแอตทริบิวต์“ แท็ก:” ด้วยเหตุนี้

ตัวอย่าง:

tasks:

    - yum: name={{ item }} state=installed
      with_items:
         - httpd
         - memcached
      tags:
         - packages

    - template: src=templates/src.j2 dest=/etc/foo.conf
      tags:
         - configuration

หากคุณต้องการเพียงแค่เรียกใช้ส่วน "การกำหนดค่า" และ "แพ็คเกจ" ของ playbook ที่ยาวมากคุณสามารถทำได้:

ansible-playbook example.yml --tags "configuration,packages"

ในทางตรงกันข้ามถ้าคุณต้องการเรียกใช้ playbook โดยไม่มีงานบางอย่างคุณสามารถทำได้:

ansible-playbook example.yml --skip-tags "notification"

คุณอาจใช้แท็กกับบทบาท:

roles:
  - { role: webserver, port: 5000, tags: [ 'web', 'foo' ] }

และคุณอาจติดแท็กข้อความสั่งพื้นฐาน:

- include: foo.yml tags=web,foo

ทั้งสองอย่างนี้มีฟังก์ชันการแท็กทุกงานภายในคำสั่ง include


มีลักษณะที่คำตอบนี้: stackoverflow.com/a/52888274/2834918 คำตอบที่ยอมรับได้ที่นี่จะปรากฏขึ้นที่ google และ duckduckgo ค่อนข้างด้านบน แต่ซ่อนอินเทอร์เฟซใหม่ที่นำมาใช้กับ ansible 2.7
bixel

84

มีวิธีแม้ว่าจะไม่สง่างามมาก:

  1. ansible-playbook roles/hadoop_primary/tasks/hadoop_master.yml --step --start-at-task='start hadoop jobtracker services'
  2. คุณจะได้รับพรอมต์: Perform task: start hadoop jobtracker services (y/n/c)
  3. ตอบ y
  4. คุณจะได้รับพรอมต์ถัดไปกด Ctrl-C

4
การรวมเข้ากับตัวเลือก--checkและ-vvvนั้นยังมีประโยชน์มาก มันจะไม่ดำเนินการคำสั่งจริง แต่ให้ผลลัพธ์ verbose มากคุณจะเกิดอะไรขึ้น
lanoxx

10

FWIW พร้อม Ansible 2.2 หนึ่งสามารถใช้include_role :

playbook test.yml:

- name: test
  hosts:
    - 127.0.0.1
  connection: local
  tasks:
    - include_role:
        name: test
        tasks_from: other

จากนั้นในroles/test/tasks/other.yml:

- name: say something else
  shell: echo "I'm the other guy"

และเรียกใช้ playbook ด้วย: ansible-playbook test.ymlเพื่อรับ:

TASK [test : say something else] *************
changed: [127.0.0.1]

6

ฉันชอบความสามารถในการใช้บทบาทเป็นชุดของงานเช่นว่าใน playbook ของฉันฉันสามารถเลือกชุดย่อยของงานที่จะทำงาน น่าเสียดายที่ playbook สามารถโหลดได้ทั้งหมดจากนั้นคุณจะต้องใช้--tagsตัวเลือกใน cmdline เพื่อเลือกงานที่จะทำงาน ปัญหานี้ก็คือว่าทั้งหมดของงานที่จะทำงานจนกว่าคุณจำที่จะตั้งหรือ--tags--skip-tags

ฉันได้ตั้งค่างานบางอย่าง แต่มีwhen:ข้อที่จะยิงเฉพาะถ้า var ตั้ง

เช่น

# role/stuff/tasks/main.yml
- name: do stuff
  when: stuff|default(false)

ตอนนี้งานนี้จะไม่เริ่มทำงานตามค่าเริ่มต้น แต่เฉพาะเมื่อฉันตั้งค่า stuff=true

$ ansible-playbook -e '{"stuff":true}'

หรือใน playbook:

roles:
- {"role":"stuff", "stuff":true}

ฉันเป็นมือใหม่และฉันได้ยินสิ่งที่คุณพูด ... แต่ฉันจะสำรวจว่าทำไมคุณถึงเกลียดการเล่นเพลย์บุ๊คทั้งเล่ม การเล่น Ansible ที่เหมาะสมมักจะเป็น idempotent และจะรวบรวมข้อเท็จจริงและ "ไม่ทำอะไรเลย" หากเป็นไปตามเงื่อนไขของรัฐ ฉันยอมรับว่าฉันแบ่งปันข้อกังวลนี้เนื่องจากบทละครส่วนใหญ่ของฉัน "ทำอะไรบางอย่าง" มากกว่า "ตรวจสอบว่านี่คือสถานะและทำอะไรถ้าจำเป็น" อดีตสามารถเรียกใช้เพียงครั้งเดียวหรือดูแลในขณะที่หลังสามารถทำงานได้ตลอดเวลาและมันจะไม่เป็นอันตราย
Scott Prive

ปกติฉันจะใช้สิ่งนี้เพื่อแก้ไขข้อบกพร่อง โดยปกติฉันไม่ต้องการให้ข้อมูลดีบั๊กทำงาน แต่บางครั้งก็ทำได้ แม้ว่าการดูคำตอบอื่น ๆ อาจมีวิธีที่ดีกว่าในการทำเช่นนี้ในตอนนี้
ChePazzo

ใช่แล้ว หากต้องการเจาะจงวิธีหนึ่งในการเลือกเล่นตอนนี้ก็คือ "แท็ก" การเล่น อาจมีวิธีอื่นในการ จำกัด การเล่น ฉันยังคงเรียนรู้ ...
Scott Prive

4

คุณคุ้นเคยกับตัวจัดการไหม? ฉันคิดว่ามันเป็นสิ่งที่คุณกำลังมองหา ย้ายการรีสตาร์ทจากhadoop_master.ymlไปยังroles/hadoop_primary/handlers/main.yml:

- name: start hadoop jobtracker services
  service: name=hadoop-0.20-mapreduce-jobtracker state=started

และตอนนี้เรียกใช้notifyในhadoop_master.yml:

- name: Install the namenode and jobtracker packages
  apt: name={{item}} force=yes state=latest
  with_items: 
   - hadoop-0.20-mapreduce-jobtracker
   - hadoop-hdfs-namenode
   - hadoop-doc
   - hue-plugins
  notify: start hadoop jobtracker services

3

สามารถทำได้อย่างง่ายดายโดยใช้แท็ก

ตัวอย่างของแท็กมีการกำหนดไว้ด้านล่าง:

---
hosts: localhost
tasks:
 - name: Creating s3Bucket
   s3_bucket:
        name: ansiblebucket1234567890
   tags: 
       - createbucket

 - name: Simple PUT operation
   aws_s3:
       bucket: ansiblebucket1234567890
       object: /my/desired/key.txt
       src: /etc/ansible/myfile.txt
       mode: put
   tags:
      - putfile

 - name: Create an empty bucket
   aws_s3:
       bucket: ansiblebucket12345678901234
       mode: create
       permission: private
   tags:
       - emptybucket

เพื่อรันแท็กที่เราใช้คำสั่ง

ansible-playbook creates3bucket.yml --tags "createbucket,putfile"

สิ่งนี้ใช้ไม่ได้ - ผิดพลาด! playbook ต้องเป็นรายชื่อบทละครได้ <ansible.parsing.yaml.objects.AnsibleMapping '> ระดับ <ansible.parsing.AamibleMapping'> แทน
Alexander Skwar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.