如何在ansible playbook中只运行一个任务?

时间:2014-05-30 00:27:15

标签: ansible

有没有办法只在ansible playbook中运行一个任务?

例如,在roles/hadoop_primary/tasks/hadoop_master.yml中。我有"start hadoop job tracker services"任务。我可以运行那一项任务吗?

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

7 个答案:

答案 0 :(得分:200)

您应该使用http://docs.ansible.com/playbooks_tags.html

中记录的tags:

如果你有一个大型的剧本,那么在不运行整个剧本的情况下运行配置的特定部分可能会很有用。

出于这个原因,播放和任务都支持“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: foo.yml tags=web,foo

这两个都具有标记include语句中每个任务的功能。

答案 1 :(得分:69)

有一种方法,虽然不是很优雅:

  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

答案 2 :(得分:6)

我希望能够将角色用作任务集合,以便在我的剧本中,我可以选择要运行的任务子集。不幸的是,剧本只能加载它们然后你必须使用cmdline上的--tags选项来选择要运行的任务。这样做的问题是,除非您记得设置--tags--skip-tags,否则所有任务都会运行。

我已经设置了一些任务,但只有when:子句只有在设置了var时才会触发。

e.g。

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

现在,默认情况下不会触发此任务,但仅限于我设置stuff=true

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

或在剧本中:

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

答案 3 :(得分:6)

使用Ansible 2.2的FWIW可以使用include_role

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

答案 4 :(得分:4)

你熟悉handlers吗?我想这就是你要找的东西。将重新启动从hadoop_master.yml移至roles/hadoop_primary/handlers/main.yml

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

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

答案 5 :(得分:2)

使用标签可以轻松完成

标签示例定义如下:

location /admin {
    rewrite ^/admin(.*) /$1 break;
    proxy_pass http://admin:8001;
}

使用命令执行标签

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    client_max_body_size 200M;
    disable_symlinks off;
    server_tokens off;
    index index.php;
    root /var/www/public;

    location /admin {
        rewrite ^/admin(.*) /$1 break;
        proxy_pass http://admin:8001;
    }

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ \.php {
        try_files $uri =404;
        fastcgi_pass app:9000;

        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_param REALPATHTEST $realpath_root;
        internal;
    }
}

答案 6 :(得分:2)

在这里查看我的答案:Run only one task and handler from ansible playbook

可以运行单独的角色(从roles/目录开始)

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

和单独的任务文件:

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

如果将任务从角色外部化到根tasks/目录(重用由import_tasks: ../../../tasks/create-os-user.yml完成),则可以独立于剧本/角色来运行它。