Ansible playbook'ta yalnızca bir görev nasıl çalıştırılır?


172

Ansible playbook'ta yalnızca bir görev çalıştırmanın bir yolu var mı?

Örneğin, içinde roles/hadoop_primary/tasks/hadoop_master.yml. Görevim var "start hadoop job tracker services". Sadece bir görevi yerine getirebilir miyim?

hadoop_master.yml dosyası:

---
# 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

Yanıtlar:


248

Http://docs.ansible.com/playbooks_tags.html'detags: belgelendiği şekilde kullanmalısınız


Büyük bir oynatma kitabınız varsa, tüm oynatma kitabını çalıştırmadan yapılandırmanın belirli bir bölümünü çalıştırabilmeniz yararlı olabilir.

Bu nedenle hem oyunlar hem de görevler "tags:" özelliğini destekler.

Misal:

tasks:

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

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

Çok uzun bir oyun kitabının "yapılandırma" ve "paketler" bölümünü çalıştırmak istiyorsanız, bunu yapabilirsiniz:

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

Öte yandan, belirli görevler olmadan bir oynatma kitabı çalıştırmak istiyorsanız, bunu yapabilirsiniz:

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

Rollere etiketler de uygulayabilirsiniz:

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

Ayrıca temel içerme ifadelerini de etiketleyebilirsiniz:

- include: foo.yml tags=web,foo

Bunların her ikisi de include deyimi içindeki her bir görevi etiketleme işlevine sahiptir.


Şu cevaba bir göz atın: stackoverflow.com/a/52888274/2834918 . Burada kabul edilen cevap, google ve duckduckgo'da oldukça üstte ortaya çıkıyor, ancak ansible 2.7 ile tanıtılan yeni arayüzü gizliyor.
bixel

84

Çok zarif olmasa da bir yolu var:

  1. ansible-playbook roles/hadoop_primary/tasks/hadoop_master.yml --step --start-at-task='start hadoop jobtracker services'
  2. Bir bilgi alacaksınız: Perform task: start hadoop jobtracker services (y/n/c)
  3. Cevap y
  4. Bir sonraki istemi alacaksınız, Ctrl-C

4
Bunu --checkve -vvvseçeneğiyle birleştirmek de oldukça yararlıdır. Komutu gerçekte yerine getirmeyecek, ne olacağını çok ayrıntılı bir şekilde ortaya koyacaktır.
lanoxx

10

Ansible 2.2 ile FWIW include_role kullanabilir :

oyun kitabı test.yml:

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

sonra roles/test/tasks/other.yml:

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

Ve aşağıdakileri yapmak için playbook'u çağırın ansible-playbook test.yml:

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

6

Bir rolü bir görev koleksiyonu olarak kullanma yeteneğini çok isterim, böylece oyun kitabımda hangi görev alt kümesinin çalıştırılacağını seçebilirim. Ne yazık ki, oynatma kitabı yalnızca hepsini yükleyebilir ve sonra --tagshangi görevleri çalıştıracağınızı seçmek için cmdline'daki seçeneği kullanmanız gerekir . Buradaki sorun, veya ayarlamayı hatırlamadığınız sürece tüm görevlerin çalıştırılmasıdır .--tags--skip-tags

Bununla birlikte, bazı görevler ayarladım, ancak when:bir değişken ayarlandığında ateş edecek bir madde ile .

Örneğin

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

Şimdi, bu görev varsayılan olarak tetiklenmeyecek, ancak yalnızca stuff=true

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

veya bir oyun kitabında:

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

Ben sadece bir acemiyim ve söylediklerinizi duyuyorum ... ama neden tüm oyun kitabını çalıştırmaya karşı çektiğinizi keşfedeceğim. Uygun bir Ansible oyunu genellikle idempotenttir ve devlet kriterleri karşılandığında gerçekleri toplar ve "hiçbir şey yapmaz". Bu endişeyi paylaştığımı itiraf ediyorum, çünkü oyunların çoğu "durumun bu olup olmadığını kontrol et," gerekirse bir şey yap "yerine" bir şey yap ". Birincisi sadece bir kez çalıştırılabilir veya ikincisi herhangi bir zamanda çalıştırılabilir ve zararsız olacaktır.
Scott Prive

Bunu normalde hata ayıklama görevleri için kullanırım. Normalde, hata ayıklama bilgilerinin çalışmasını istemiyorum, ancak bazen kullanıyorum. Diğer yanıtlara baktığımızda, şimdi bunu yapmanın daha iyi bir yolu olabilir.
ChePazzo

Evet var. Daha açık olmak gerekirse, oyunları seçmeli olarak çalıştırmanın bir yolu da oyunları "etiketlemek" tir. Oyunları sınırlamanın DİĞER yolları da olabilir; Hala öğreniyorum ...
Scott Prive

4

işleyicilere aşina mısın? Bence aradığınız şey bu. Dan yeniden taşı hadoop_master.ymliçin roles/hadoop_primary/handlers/main.yml:

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

ve şimdi arama kullanım notifyiçinde 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

Bu, etiketler kullanılarak kolayca yapılabilir

Etiket örneği aşağıda tanımlanmıştır:

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

etiketleri çalıştırmak için şu komutu kullanıyoruz:

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

Bu işe yaramıyor - HATA! Bir oynatma kitabı bir oyun listesi olmalı, bunun yerine bir <class 'ansible.parsing.yaml.objects.AnsibleMapping'> olmalıdır
Alexander Skwar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.