Bagaimana menjalankan hanya satu tugas di buku pedoman yang dimungkinkan?

172

Apakah ada cara untuk hanya menjalankan satu tugas di buku pedoman yang dimungkinkan?

Misalnya, dalam roles/hadoop_primary/tasks/hadoop_master.yml. Saya punya "start hadoop job tracker services"tugas. Bisakah saya menjalankan satu tugas itu saja?

file 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
Billz
sumber

Jawaban:

248

Anda harus menggunakannya tags:seperti yang didokumentasikan di http://docs.ansible.com/playbooks_tags.html


Jika Anda memiliki buku pedoman yang besar, mungkin berguna untuk dapat menjalankan bagian tertentu dari konfigurasi tanpa menjalankan keseluruhan buku pedoman.

Baik permainan maupun tugas mendukung atribut "tag:" karena alasan ini.

Contoh:

tasks:

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

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

Jika Anda hanya ingin menjalankan bagian "konfigurasi" dan "paket" dari buku pedoman yang sangat panjang, Anda dapat melakukan ini:

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

Di sisi lain, jika Anda ingin menjalankan buku pedoman tanpa tugas tertentu, Anda bisa melakukan ini:

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

Anda juga dapat menerapkan tag ke peran:

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

Dan Anda juga dapat menandai pernyataan sertakan dasar:

- include: foo.yml tags=web,foo

Keduanya memiliki fungsi menandai setiap tugas di dalam pernyataan include.

Mxx
sumber
Lihatlah jawaban ini: stackoverflow.com/a/52888274/2834918 . Jawaban yang diterima di sini muncul di google dan duckduckgo cukup di atas tetapi menyembunyikan antarmuka yang lebih baru diperkenalkan dengan kemungkinan 2.7.
bixel
84

Ada caranya, meski tidak terlalu elegan:

  1. ansible-playbook roles/hadoop_primary/tasks/hadoop_master.yml --step --start-at-task='start hadoop jobtracker services'
  2. Anda akan mendapatkan prompt: Perform task: start hadoop jobtracker services (y/n/c)
  3. Menjawab y
  4. Anda akan mendapatkan prompt berikutnya, tekan Ctrl-C
Victor Ashik
sumber
4
Menggabungkannya dengan opsi --checkdan -vvvjuga cukup berguna. Ini tidak akan benar-benar melakukan perintah tetapi memberi Anda sangat keluaran apa yang akan terjadi.
lanoxx
10

FWIW dengan Ansible 2.2 orang dapat menggunakan include_role :

buku pedoman test.yml:

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

lalu di roles/test/tasks/other.yml:

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

Dan aktifkan playbook dengan: ansible-playbook test.ymluntuk mendapatkan:

TASK [test : say something else] *************
changed: [127.0.0.1]
ddragosd
sumber
6

Saya akan senang kemampuan untuk menggunakan peran sebagai kumpulan tugas sehingga, dalam buku pedoman saya, saya dapat memilih bagian tugas yang akan dijalankan. Sayangnya, playbook hanya dapat memuat semuanya dan kemudian Anda harus menggunakan --tagsopsi pada cmdline untuk memilih tugas mana yang harus dijalankan. Masalah dengan ini adalah bahwa semua tugas akan berjalan kecuali Anda ingat untuk mengatur --tagsatau--skip-tags .

Saya telah mengatur beberapa tugas, dengan when:klausa yang hanya akan diaktifkan jika var diatur.

misalnya

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

Sekarang, tugas ini tidak akan diaktifkan secara default, tetapi hanya jika saya mengatur stuff=true

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

atau di buku pedoman:

roles:
- {"role":"stuff", "stuff":true}
ChePazzo
sumber
Saya hanya seorang pemula, dan saya mendengar apa yang Anda katakan ... tapi saya akan mencari tahu mengapa Anda menolak untuk menjalankan seluruh buku pedoman. Permainan Ansible yang tepat biasanya idempoten, dan akan mengumpulkan fakta dan "tidak melakukan apa pun" jika kriteria negara dipenuhi. Saya akui saya berbagi kekhawatiran ini karena sebagian besar permainan saya "lakukan sesuatu" daripada "periksa apakah ini keadaannya, dan lakukan sesuatu jika perlu". Yang pertama hanya bisa dijalankan sekali, atau diawasi sementara yang kedua bisa dijalankan kapan saja dan itu tidak akan berbahaya.
Scott Prive
Saya biasanya menggunakan ini untuk tugas debug. Biasanya, saya tidak ingin info debug dijalankan, tetapi kadang-kadang saya lakukan. Namun, melihat tanggapan lain, mungkin ada cara yang lebih baik untuk melakukannya sekarang.
ChePazzo
Ya ada. Untuk lebih spesifik, salah satu cara untuk menjalankan pemutaran secara selektif sekarang adalah dengan "menandai" drama tersebut. Mungkin ada cara LAIN untuk membatasi permainan juga; Saya masih belajar ...
Scott Prive
4

apakah Anda terbiasa dengan penangan ? Saya pikir itu yang Anda cari. Pindahkan restart dari hadoop_master.ymlke roles/hadoop_primary/handlers/main.yml:

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

dan sekarang panggil digunakan notifydi 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
tedder42
sumber
3

Ini dapat dengan mudah dilakukan menggunakan tag

Contoh tag didefinisikan di bawah ini:

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

untuk mengeksekusi tag kita menggunakan perintah

ansible-playbook creates3bucket.yml --tags "createbucket,putfile"
Nitesh Jain
sumber
Ini tidak berfungsi - GALAT! Buku pedoman harus berupa daftar permainan, mendapat <class 'ansible.parsing.yaml.objects.AnsibleMapping'> sebagai gantinya
Alexander Skwar