Como executar apenas uma tarefa no manual ansible?


172

Existe uma maneira de executar apenas uma tarefa no manual ansible?

Por exemplo, em roles/hadoop_primary/tasks/hadoop_master.yml. Eu tenho "start hadoop job tracker services"tarefa. Posso apenas executar essa tarefa?

arquivo 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

Respostas:


248

Você deve usar tags:como documentado em http://docs.ansible.com/playbooks_tags.html


Se você tem um manual grande, pode ser útil executar uma parte específica da configuração sem executar o manual inteiro.

As execuções e as tarefas suportam um atributo "tags:" por esse motivo.

Exemplo:

tasks:

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

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

Se você quiser apenas executar as partes "configuration" e "packages" de um manual muito longo, faça o seguinte:

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

Por outro lado, se você quiser executar um manual sem certas tarefas, poderá fazer o seguinte:

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

Você também pode aplicar tags às funções:

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

E você também pode marcar instruções básicas de inclusão:

- include: foo.yml tags=web,foo

Ambos têm a função de marcar todas as tarefas dentro da instrução include.


Dê uma olhada nesta resposta: stackoverflow.com/a/52888274/2834918 . A resposta aceita aqui aparece no google e duckduckgo bem no topo, mas oculta a nova interface introduzida com o ansible 2.7.
bixel 20/01

84

Existe uma maneira, embora não seja muito elegante:

  1. ansible-playbook roles/hadoop_primary/tasks/hadoop_master.yml --step --start-at-task='start hadoop jobtracker services'
  2. Você receberá um prompt: Perform task: start hadoop jobtracker services (y/n/c)
  3. Responda y
  4. Você receberá um próximo prompt, pressione Ctrl-C

4
Combinar isso com a opção --checke -vvvtambém é bastante útil. Na verdade, ele não executará o comando, mas fornecerá uma saída muito detalhada do que teria acontecido.
lanoxx

10

FWIW com Ansible 2.2 pode-se usar include_role :

manual test.yml:

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

então em roles/test/tasks/other.yml:

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

E invoque o manual com: ansible-playbook test.ymlpara obter:

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

6

Eu adoraria a capacidade de usar uma função como uma coleção de tarefas, para que, no meu manual, eu possa escolher qual subconjunto de tarefas executar. Infelizmente, o manual só pode carregá-los todos e, em seguida, você deve usar a --tagsopção no cmdline para escolher quais tarefas executar. O problema é que todas as tarefas serão executadas, a menos que você lembre de definir --tagsou--skip-tags .

Eu configurei algumas tarefas, no entanto, com uma when:cláusula que será acionada apenas se um var estiver definido.

por exemplo

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

Agora, essa tarefa não será acionada por padrão, mas somente se eu definir o stuff=true

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

ou em um manual:

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

Sou apenas um novato e ouço o que você está dizendo ... mas gostaria de explorar por que você é avesso a que todo o playbook seja executado. Um jogo Ansible adequado geralmente é idempotente e reunirá fatos e "não fará nada" se os critérios do estado forem atendidos. Admito que compartilho essa preocupação, pois a maioria das minhas peças "faz alguma coisa" em vez de "verificar se esse é o estado, e faz alguma coisa, se necessário". O primeiro só pode ser executado uma vez ou supervisionado, enquanto o último pode ser executado a qualquer momento e será inofensivo.
21819 Scott Prive

Eu normalmente uso isso para tarefas de depuração. Normalmente, não quero que as informações de depuração sejam executadas, mas às vezes sim. Olhando para as outras respostas, porém, pode haver uma maneira melhor de fazer isso agora.
ChePazzo

Sim existe. Para ser específico, uma maneira de executar seletivamente as peças agora é "etiquetando" as peças. Pode haver OUTRAS maneiras de limitar as jogadas também; Eu ainda estou aprendendo ...
Scott Prive

4

você está familiarizado com manipuladores ? Eu acho que é o que você está procurando. Mova a reinicialização de hadoop_master.ymlpara roles/hadoop_primary/handlers/main.yml:

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

e agora chame o uso notifyem 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

Isso pode ser feito facilmente usando as tags

O exemplo de tags é definido abaixo:

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

para executar as tags, usamos o comando

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

Isso não funciona - ERRO! A cartilha deve ser uma lista de peças de teatro, tem um <class 'ansible.parsing.yaml.objects.AnsibleMapping'> em vez
Alexander Skwar
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.