Ansibleプレイブックで1つのタスクのみを実行する方法は?


172

ansibleプレイブックで1つのタスクのみを実行する方法はありますか?

たとえば、roles/hadoop_primary/tasks/hadoop_master.yml。仕事があり"start hadoop job tracker services"ます。その1つのタスクを実行できますか?

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

http://docs.ansible.com/playbooks_tags.htmlにtags:記載されているとおりに使用する必要があります


プレイブックが大きい場合、プレイブック全体を実行せずに構成の特定の部分を実行できると便利な場合があります。

このため、playsとtaskはどちらも「tags:」属性をサポートしています。

例:

tasks:

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

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

非常に長いプレイブックの「構成」と「パッケージ」の部分だけを実行したい場合は、次のようにします。

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

一方、特定のタスクなしでプレイブックを実行する場合は、次のようにします。

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

タグをロールに適用することもできます:

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

また、基本的なincludeステートメントにタグを付けることもできます。

- include: foo.yml tags=web,foo

これらはどちらも、includeステートメント内のすべてのタスクにタグを付ける機能を備えています。


この答えを見てください:stackoverflow.com/a/52888274/2834918。ここで受け入れられた答えは、googleとduckduckgoの一番上にポップアップ表示されますが、ansible 2.7で導入された新しいインターフェースは非表示になっています。
ビクセル

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
--checkand -vvvオプションと組み合わせることも非常に便利です。実際にはコマンドは実行されませんが、何が起こったかを非常に詳細に出力します。
lanoxx

10

Ansible 2.2のFWIWにはinclude_roleを使用できます

プレイブック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"

そして、次のようにしてプレイブックを呼び出しansible-playbook test.ymlます:

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

6

私のプレイブックでは、実行するタスクのサブセットを選択できるように、ロールをタスクのコレクションとして使用する機能が気に入っています。残念ながら、プレイブックはそれらをすべて読み込むことしかできないため--tags、コマンドラインのオプションを使用して、実行するタスクを選択する必要があります。これの問題は、設定または覚えない限り、すべてのタスクが実行されることです--tags--skip-tags

ただし、when:varが設定されている場合にのみ起動する句を使用して、いくつかのタスクを設定しました。

例えば

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

現在、このタスクはデフォルトでは起動しませんが、 stuff=true

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

またはプレイブック:

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

私は初心者ですが、あなたの言っていることがわかります...しかし、あなたがプレイブック全体を実行することを嫌う理由を探ります。適切なAnsibleプレイは通常べき等であり、状態の基準が満たされている場合、事実を収集し、「何もしません」。私の演劇のほとんどは「これが状態かどうかを確認し、必要に応じて何かをする」ではなく「何かをする」ので、私はこの懸念を共有します。前者は一度だけ実行するか、監視することができますが、後者はいつでも実行でき、害はありません。
Scott Prive

通常、これをデバッグタスクに使用します。通常、デバッグ情報を実行したくありませんが、実行することもあります。しかし、他の応答を見ると、今それを行うためのより良い方法があるかもしれません。
ChePazzo

はいあります。具体的には、今すぐプレーを選択的に実行する1つの方法は、プレーに「タグを付ける」ことです。演劇を制限する他の方法もあるかもしれません。私はまだ学んでいます...
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

そして今ではuse 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"

これは機能しません-エラー!プレイブックはプレイのリストである必要があり、代わりに<class 'ansible.parsing.yaml.objects.AnsibleMapping'>を取得しました
Alexander Skwar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.