Làm thế nào để chỉ chạy một nhiệm vụ trong playbook ansible?


172

Có cách nào để chỉ chạy một nhiệm vụ trong playbook ansible không?

Ví dụ, trong roles/hadoop_primary/tasks/hadoop_master.yml. Tôi có "start hadoop job tracker services"nhiệm vụ. Tôi có thể chạy một nhiệm vụ đó không?

tệp 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

Câu trả lời:


248

Bạn nên sử dụng tags:như tài liệu trong http://docs.ansible.com/playbooks_tags.html


Nếu bạn có một playbook lớn, nó có thể trở nên hữu ích để có thể chạy một phần cụ thể của cấu hình mà không cần chạy toàn bộ playbook.

Cả hai lần phát và tác vụ đều hỗ trợ một thẻ thuộc tính:

Thí dụ:

tasks:

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

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

Nếu bạn chỉ muốn chạy các cấu hình và các gói cấu hình và một phần của một cuốn sách rất dài, bạn có thể làm điều này:

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

Mặt khác, nếu bạn muốn chạy một playbook mà không có một số nhiệm vụ nhất định, bạn có thể làm điều này:

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

Bạn cũng có thể áp dụng các thẻ cho vai trò:

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

Và bạn cũng có thể gắn thẻ các câu lệnh cơ bản bao gồm:

- include: foo.yml tags=web,foo

Cả hai đều có chức năng gắn thẻ mọi tác vụ đơn lẻ trong câu lệnh bao gồm.


Hãy xem câu trả lời này: stackoverflow.com/a/52888274/2834918 . Câu trả lời được chấp nhận ở đây bật lên tại google và duckduckgo ở trên cùng nhưng ẩn giao diện mới hơn được giới thiệu với ansible 2.7.
bixel

84

Có một cách, mặc dù không thanh lịch lắm:

  1. ansible-playbook roles/hadoop_primary/tasks/hadoop_master.yml --step --start-at-task='start hadoop jobtracker services'
  2. Bạn sẽ nhận được lời nhắc: Perform task: start hadoop jobtracker services (y/n/c)
  3. Câu trả lời y
  4. Bạn sẽ nhận được một lời nhắc tiếp theo, nhấn Ctrl-C

4
Kết hợp điều đó với --check-vvvtùy chọn cũng khá hữu ích. Nó sẽ không thực sự thực hiện lệnh nhưng cung cấp cho bạn đầu ra rất dài dòng những gì sẽ xảy ra.
lanoxx

10

FWIW với Ansible 2.2 người ta có thể sử dụng include_role :

vở kịch test.yml:

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

sau đó trong roles/test/tasks/other.yml:

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

Và gọi playbook với: ansible-playbook test.ymlđể có được:

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

6

Tôi rất thích khả năng sử dụng vai trò như một tập hợp các nhiệm vụ mà trong sổ chơi của tôi, tôi có thể chọn tập hợp con các nhiệm vụ sẽ chạy. Thật không may, playbook chỉ có thể tải tất cả chúng vào và sau đó bạn phải sử dụng --tagstùy chọn trên cmdline để chọn các tác vụ sẽ chạy. Vấn đề với điều này là tất cả các tác vụ sẽ chạy trừ khi bạn nhớ đặt --tagshoặc --skip-tags.

Tôi đã thiết lập một số tác vụ, tuy nhiên, với một when:mệnh đề sẽ chỉ kích hoạt nếu một var được đặt.

ví dụ

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

Bây giờ, tác vụ này sẽ không kích hoạt theo mặc định, nhưng chỉ khi tôi đặt stuff=true

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

hoặc trong một cuốn sách:

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

Tôi chỉ là một người mới và tôi nghe những gì bạn nói ... nhưng tôi sẽ khám phá lý do tại sao bạn không thích việc chạy toàn bộ playbook. Một trò chơi Ansible thích hợp thường là bình thường, và sẽ thu thập các sự kiện và "không làm gì" nếu các tiêu chí nhà nước được đáp ứng. Tôi thừa nhận tôi chia sẻ mối quan tâm này vì hầu hết các vở kịch của tôi "làm một cái gì đó" thay vì "kiểm tra xem đây có phải là trạng thái không và làm gì nếu cần". Cái trước chỉ có thể được chạy một lần, hoặc được giám sát trong khi cái trước có thể được chạy bất cứ lúc nào và nó sẽ vô hại.
Scott Prive

Tôi thường sử dụng điều này cho các nhiệm vụ gỡ lỗi. Thông thường, tôi không muốn thông tin gỡ lỗi chạy, nhưng đôi khi tôi làm. Tuy nhiên, nhìn vào các phản ứng khác, có thể có một cách tốt hơn để làm điều đó ngay bây giờ.
ChePazzo

Có, có. Để cụ thể, một cách để chọn lọc các lượt chơi bây giờ là "gắn thẻ" các lượt phát. Có thể có những cách KHÁC để hạn chế các vở kịch; Tôi vẫn đang học ...
Scott Prive

4

bạn có quen thuộc với người xử lý không? Tôi nghĩ đó là những gì bạn đang tìm kiếm. Di chuyển khởi động lại từ hadoop_master.ymlđến roles/hadoop_primary/handlers/main.yml:

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

và bây giờ gọi sử dụng notifytrong 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

Điều này có thể dễ dàng thực hiện bằng cách sử dụng các thẻ

Ví dụ về các thẻ được định nghĩa dưới đây:

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

để thực thi các thẻ chúng ta sử dụng lệnh

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

Điều này không hoạt động - LRI! Một vở kịch phải là một danh sách các vở kịch, có <class 'ansible.parsing.yaml.objects.AnsibleMapping'> thay vào đó
Alexander Skwar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.