Vraag Anoniem: voer de taak alleen uit als een tag is opgegeven


Ansible-tags kan worden gebruikt om slechts een subset van taken / rollen uit te voeren. Dit betekent dat standaard alle taken worden uitgevoerd en we kunnen alleen voorkomen dat sommige taken worden uitgevoerd.

Kunnen we een uit te voeren taak beperken? enkel en alleen wanneer "foo" -tag is opgegeven? Kunnen we huidige tags gebruiken in when deel van een taak?


57
2017-08-24 10:08


oorsprong


het klinkt als wat je nodig hebt is een taakinstelling zoals limit_to_tags: foo die niet bestaat en ik denk niet dat dit nu mogelijk is. Een toekomstige implementatie moet ook een plan hebben om de tags AND of OR samen te plaatsen. - dgh
Bekijk mijn anwser in "Ansible - Default / Expliciete tags" stackoverflow.com/questions/28789912/... - sirkubax


antwoorden:


Hoewel dit een rotonde-oplossing is, werkt het.

In de takenlijst registreert u een variabele wanneer de normale uitvoering wordt uitgevoerd. Voeg vervolgens een when-voorwaarde toe die die variabele op de getagde taak controleert.

- shell: /bin/true
  register: normal_task_list

- name: Only run when tag is specified
  shell: /bin/echo "Only running because of specified tag"
  when: normal_task_list is not defined
  tags: specified

20
2018-01-13 16:25



echt een goed idee - perigee
Je kan ook gebruiken untagged om dit te bereiken: - set_fact: untagged_run=true  tags: untagged - Pyzo
Kun je hier wat meer over vertellen? Een echt voorbeeld? - Quintin Par


Ik heb niet genoeg reputatie om het antwoord dat suggereert dat er opdrachtregelvariabelen worden gebruikt, up-up te geven of te becommentariëren (--extra-vars), maar ik moet dit toevoegen:

Het nadeel van deze methode is dat het spel fout gaat en faalt als je die extra variabele niet definieert.

Je kunt voorkomen dat het spel faalt in afwezigheid van een --extra-vars definitie door een standaardwaarde in het playbook zelf te definiëren:

---
- hosts: ...
# ↓↓↓
  vars:
    thorough: false
# ↑↑↑
  tasks:
  - name: apt - install nfs-common only when thorough is true
    when: thorough | bool
    apt:
      cache_valid_time: 86400
      force: yes
      pkg:
        - nfs-common

Overbruggen via --extra-vars zal nog steeds werken omdat variabelen gedefinieerd op de opdrachtregel prevaleren boven alle andere definities.

Het resultaat is dat het afspelen zonder fouten wordt uitgevoerd wanneer thorough is niet gewijzigd in true op de opdrachtregel.


17
2018-05-08 01:17



Hetzelfde kan worden bereikt met thorough | default('no') | bool. - Costi Ciudatu
Of when: thorough is defined and thorough als je die syntaxis prefereert - KCD
Bedankt, hou van de is defined and syntaxis meer. meer dan de meerdere pijpen die ik niet voel, zijn intuïtief. - Elijah Lynn


Ansible 2.5 wordt geleverd met speciale tags never en always. Label never kan precies voor dit doel worden gebruikt. bijv:

tasks:
  - debug: msg='{{ showmevar}}'
    tags: [ 'never', 'debug' ]

In dit voorbeeld wordt de taak alleen uitgevoerd als de debug (of never) tag wordt expliciet gevraagd. [Referentie op ansible-documenten]


10
2018-04-12 10:58





Je kunt gebruiken Voorwaardelijke om te beschermen tegen het per ongeluk uitvoeren van taken die anders zouden worden uitgevoerd als u geen tag opgeeft. Het nadeel van deze methode is dat het spel fout gaat en faalt als je die extra variabele niet definieert.

Met behulp van het extra-vars-argument kunt u uw voorwaardelijke gebeurtenis activeren om te worden uitgevoerd.

Van ansible-playbook --help:

 -e EXTRA_VARS, --extra-vars=EXTRA_VARS
    set additional variables as key=value or YAML/JSON

Voorbeeld:

ansible-playbook test.yaml -e "thorough=true"

test.yaml:

...
- name: apt - install nfs-common only when thorough is true
  apt:
    cache_valid_time: 86400
    force: yes
    pkg:
    - nfs-common
  when: thorough | match("true")
...

9
2018-03-12 20:51



Om een ​​fout te voorkomen als u niet "grondig" definieert, gebruik het gewoon thorough | default("false") | match("true"). Standaard hoeft dit niet te zijn false, gewoon alles wat niet bij elkaar past true, maar het verbetert de leesbaarheid. - Tom Wilson


Ja. Lopende ansible-playbook met de --tags foo flag zorgt ervoor dat alleen taken worden getagged met foo zijn uitgevoerd. Stel dat we bijvoorbeeld een playbook hebben met de naam example.yml:

tasks:

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

  - name: some other task
    ..
    tags:
      - some other tag

running:

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

Zorgt ervoor dat alleen de yum-taak wordt uitgevoerd.

Dus eigenlijk hoef je eigenlijk geen tags te gebruiken in de sectie om een ​​taak voorwaardelijk uit te voeren. Merk op dat afhankelijk van de complexiteit van uw playbooks / rollen u mogelijk een combinatie van --tags en --skip-tags moet gebruiken om te bepalen welke taken worden uitgevoerd. Als een include-taak bijvoorbeeld is getagd als 'foo' en een taak in de opgenomen playbook is gelabeld als 'balk' en u loopt

ansible-playbook --tags "foo"

De interne taak (alleen getagd als 'balk') wordt uitgevoerd. Om te voorkomen dat alle interne taken met de tag 'bar' worden uitgevoerd, moet u de volgende opdracht uitvoeren

ansible-playbook --tags foo --skip-tags bar

3
2017-08-24 16:49



Dit is niet waar: "Het specificeren van een tag op een taak betekent dat alleen wanneer deze tag expliciet wordt doorgegeven aan de instructie ansible-playbook, die taak zal worden uitgevoerd." - gimboland
Gedetacheerd, verklaring is niet waar. - Chris
Je hebt gelijk. Ik heb het opnieuw geformuleerd. Bedankt! - Shahar
Ja, je kunt het gedrag bereiken door ervoor te zorgen dat je altijd het goede gebruikt ansible-playbook opties, maar ik denk dat het OP vraagt ​​om een ​​manier om een ​​taak te annoteren, zodat deze niet wordt uitgevoerd tenzij een specifieke tag expliciet in de ansible-playbook commando. - dgh
Ja, dit is geen antwoord op de vraag van het OP. - Allen Luce


De variabele 'tags' controleren werkt niet in Ansible 2.1.1.0. Zie hieronder voor de test. Ik heb een ander idee om de taak alleen uit te voeren als een tag is gedefinieerd, werkend voor zowel Ansible 1.9.X als 2.X.Y:

- set_fact: foo=true
  tags: bar
- set_fact: foo=false
- name: do something when 'bar' tag is defined
  debug: var=foo
  when: foo
  tags: bar

Daarmee wordt bij het uitvoeren van het playbook zonder enige tag de 'foo'-variabele ingesteld op true en vervolgens op false, dus er wordt niets uitgevoerd. Als u de tag 'bar' toevoegt, wordt alleen de eerste instelling toegepast, zodat de variabele 'foo' waar is en uw taak wordt uitgevoerd. Genieten!


En hier is de test over de variabele 'tags' in Ansible 2.1.1.0:

Hier is het spelboek:

- hosts: localhost
  connection: local
  tasks:
    - name: display tags variable
      debug: var=tags
      tags: foo

    - name: do something only when tag 'foo' is provided
      debug: var=tag
      when: tags is defined
      tags: foo

En hier is de uitvoer:

$ ansible-playbook --version ; ansible-playbook ./test.yml -t foo
ansible-playbook 2.1.1.0
  config file = /home/nootal/projects/ivy/src/ansible/ansible.cfg
  configured module search path = Default w/o overrides

PLAY [localhost] ***************************************************************

TASK [display tags variable] ***************************************************
ok: [localhost] => {
    "tags": "VARIABLE IS NOT DEFINED!"
}

TASK [do something only when tag 'foo' is provided] ****************************

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0   

2
2017-09-29 07:30





wanneer clausule kan de aanwezigheid van tags niet evalueren. Als een tijdelijke oplossing, ik gebruik variabelen en tags samen om taken specifiek voor die tag / variabele uit te voeren.

Vb: Stel je een playbook en inventaris voor

# inventaris
[Dev]
192.168.1.1

# site.yml
- gastheren: dev
  rollen:
    - {role: common}

en in het algemeen / tasks / main.yml

# roles / common / tasks / main.yaml
- naam: koppelingen installeren
  apt: name = links state = present

- include: uninstall.yml
  wanneer: uninstall_links is gedefinieerd
  tags:
    - Verwijderen

# roles / common / tasks / uninstall.yml
- naam: Koppelingen verwijderen
  apt: name = links state = absent

Met deze aanpak gebruikt u de tag om alleen de taken in uninstall.yml te selecteren, maar u moet ook de variabele 'uninstall_links' instellen op iets om het in te schakelen. Dus als u het playbook zonder parameters uitvoert, voert het standaard de installatietaak uit. Om de installatie ongedaan te maken, kun je de tag 'uninstall' in je playbook (of cmdline) en instellen MOET stel de variabele in. Als u de tag niet instelt, wordt alles (installeren en verwijderen) in die volgorde uitgevoerd, wat goed is om het hele proces te testen.

Alles uitvoeren (het zal worden geïnstalleerd en verwijderd):

$ ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true"

Hoe alleen de 'uninstall'-tag op dev-groep uitvoeren

$ ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true" -t uninstall

Daarom kunnen variabelen en tags zich ook in site.yml / inventory-bestanden bevinden, zodat u zich kunt vastleggen bij uw SCM en uw intentie kunt vastleggen.


0
2018-04-18 18:35





nootal heeft gelijk, mijn benadering werkt niet - negeer het :( Ik gebruik nu "wanneer: myvar is gedefinieerd" en de opdrachtregel schakelt "-e" myvar = X "om taken alleen uit te voeren als daar expliciet om wordt gevraagd.

Nog eenvoudiger (althans met ansible 2.1.1.0):

- name: do something only when tag 'foo' is provided
  when: tags is defined
  tags: foo

-> wordt alleen uitgevoerd als tags zijn geleverd EN tags bevatten "foo"


0
2017-08-23 21:27





Op Ansible 2.3.2.0 , hier is mijn oplossing voor het probleem:

---
- hosts: localhost
  gather_facts: no
  vars:
    in_tag: yes
  tasks:
    - set_fact: in_tag=no
    - fail:
        msg: "recently_added is set and you're using blah tag"
      when: ( in_tag | bool )
      tags:
        - blah
    - debug:
        msg: "always remember"

Het begint met instellen in_tag naar True dan is er een set_fact dat zet het terug naar False aan als u geen opgeeft tags van ansible-playbook.

Wanneer u tags opgeeft, in_tag blijft bij True en de fail taak loopt.

PS: je kunt de logica toevoegen aan alle taken die je wilt

PS2: je kunt ook de logica uitbreiden en alle tags coderen die je hebt en set_fact: in_tag_blah=True in combinatie met tags: ["blah"] natuurlijk.


0
2017-07-17 19:08





Er is een speciale tag - "nooit", wat voorkomt dat een taak wordt uitgevoerd, tenzij specifiek om een ​​tag wordt gevraagd.

tasks:
  - debug: msg='{{ showmevar}}'
    tags: [ 'never', 'debug' ]

0
2018-06-06 16:08



Al vermeld in het bovenstaande antwoord: serverfault.com/a/907329/105928 - Taha Jahangir