How to run only one task in ansible playbook?

前端 未结 7 1076
一向
一向 2020-12-22 16:10

Is there a way to only run one task in ansible playbook?

For example, in roles/hadoop_primary/tasks/hadoop_master.yml. I have "start hadoop jo

相关标签:
7条回答
  • 2020-12-22 16:13

    See my answer here: Run only one task and handler from ansible playbook

    It is possible to run separate role (from roles/ dir):

    ansible -i stage.yml -m include_role -a name=create-os-user localhost
    

    and separate task file:

    ansible -i stage.yml -m include_tasks -a file=tasks/create-os-user.yml localhost
    

    If you externalize tasks from role to root tasks/ directory (reuse is achieved by import_tasks: ../../../tasks/create-os-user.yml) you can run it independently from playbook/role.

    0 讨论(0)
  • 2020-12-22 16:15

    There is a way, although not very elegant:

    1. ansible-playbook roles/hadoop_primary/tasks/hadoop_master.yml --step --start-at-task='start hadoop jobtracker services'
    2. You will get a prompt: Perform task: start hadoop jobtracker services (y/n/c)
    3. Answer y
    4. You will get a next prompt, press Ctrl-C
    0 讨论(0)
  • 2020-12-22 16:27

    are you familiar with handlers? I think it's what you are looking for. Move the restart from hadoop_master.yml to roles/hadoop_primary/handlers/main.yml:

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

    and now call use notify in 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
    
    0 讨论(0)
  • 2020-12-22 16:28

    FWIW with Ansible 2.2 one can use include_role:

    playbook test.yml:

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

    then in roles/test/tasks/other.yml:

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

    And invoke the playbook with: ansible-playbook test.yml to get:

    TASK [test : say something else] *************
    changed: [127.0.0.1]
    
    0 讨论(0)
  • 2020-12-22 16:31

    You should use tags: as documented in http://docs.ansible.com/playbooks_tags.html


    If you have a large playbook it may become useful to be able to run a specific part of the configuration without running the whole playbook.

    Both plays and tasks support a “tags:” attribute for this reason.

    Example:

    tasks:
    
        - yum: name={{ item }} state=installed
          with_items:
             - httpd
             - memcached
          tags:
             - packages
    
        - template: src=templates/src.j2 dest=/etc/foo.conf
          tags:
             - configuration
    

    If you wanted to just run the “configuration” and “packages” part of a very long playbook, you could do this:

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

    On the other hand, if you want to run a playbook without certain tasks, you could do this:

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

    You may also apply tags to roles:

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

    And you may also tag basic include statements:

    - include: foo.yml tags=web,foo
    

    Both of these have the function of tagging every single task inside the include statement.

    0 讨论(0)
  • 2020-12-22 16:31

    I would love the ability to use a role as a collection of tasks such that, in my playbook, I can choose which subset of tasks to run. Unfortunately, the playbook can only load them all in and then you have to use the --tags option on the cmdline to choose which tasks to run. The problem with this is that all of the tasks will run unless you remember to set --tags or --skip-tags.

    I have set up some tasks, however, with a when: clause that will only fire if a var is set.

    e.g.

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

    Now, this task will not fire by default, but only if I set the stuff=true

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

    or in a playbook:

    roles:
    - {"role":"stuff", "stuff":true}
    
    0 讨论(0)
提交回复
热议问题