Ansible: Görevi yalnızca bir etiket belirtildiğinde yürütün


76

Ansible etiketleri , yalnızca bir görev / rol alt kümesini çalıştırmak için kullanılabilir. Bu, varsayılan olarak tüm görevlerin yürütüldüğü ve yalnızca bazı görevlerin yürütülmesini önleyebileceğimiz anlamına gelir.

Yalnızca "foo" etiketi belirtildiğinde çıkarılacak bir görevi sınırlayabilir miyiz ? whenBir görevin bölümündeki mevcut etiketleri kullanabilir miyiz ?


2
İhtiyacınız olan şey limit_to_tags: foo olmayan foo ve şu anda mümkün olduğunu sanmıyorum. Gelecekteki bir uygulamanın aynı zamanda bu etiketleri VE veya VEYA birlikte yapıp yapamayacağına ilişkin bir planı olması gerekir.
dgh,

- "Varsayılan / Açık Etiketler yanıtlayıcı '" benim anwser bir göz atın stackoverflow.com/questions/28789912/...
sirkubax

Yanıtlar:


38

Ansible 2.5, özel etiketler neverve always. Tag neverbu amaç için tam olarak kullanılabilir. Örneğin:

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

Bu örnekte, görev yalnızca debug(veya never) etiketi açıkça istendiğinde çalışır. [Makul belgelere referans]


20

Bu bir dolambaçlı çözüm olsa da işe yarıyor.

Normal uygulama çalıştığında görev listesinin içindeki bir değişkeni kaydedin. Ardından, etiketlenen göreve bu değişkeni denetleyen bir when koşulu ekleyin.

- 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

Bunu untaggedbaşarmak için de kullanabilirsiniz :- set_fact: untagged_run=true tags: untagged
Pyzo

Bunun hakkında biraz daha açıklayabilir misiniz? Gerçek dünyadan bir örnek?
Quintin Par

17

Komut satırı değişkenlerinin ( --extra-vars) kullanılmasını öneren yanıtı yorumlamak veya yorum yapmak için yeterli itibarım yok , ancak buna eklemek için de elimde:

Bu yöntemin ihmali, bu ekstra değişkeni tanımlamazsanız, oyunun hata yapıp başarısız olacağıdır.

Bir --extra-varstanım yokluğunda oyun arızasını , oyun kitabının kendisinde bir varsayılan değer tanımlayarak önleyebilirsiniz :

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

Üzerinden geçersiz kılma, --extra-varsçalışmaya devam edecektir çünkü komut satırında tanımlanan değişkenler diğer tüm tanımlara göre önceliklidir.

Sonuç, oyunun komut satırında thoroughdeğiştirilmediğinde hatasız çalışmasıdır true.


5
Aynı kullanılarak elde edilebilir thorough | default('no') | bool.
Costi Ciudatu

2
Veya when: thorough is defined and thoroughbu sözdizimini tercih ediyorsanız
KCD

Teşekkürler, is defined andsözdizimini daha çok seviyorum . hissetmediğim çoklu borulardan daha fazlası sezgisel.
Elijah Lynn

10

Bir etiket belirtmezseniz, yanlışlıkla çalıştırılan görevlere karşı korumak için Koşulluları kullanabilirsiniz . Bu yöntemin ihmali, bu ekstra değişkeni tanımlamazsanız, oyunun hata yapıp başarısız olacağıdır.

Extra-vars argümanını kullanarak koşullu çalışmalarınızı tetikleyebilirsiniz.

Ansible-playbook sitesinden --help:

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

Örnek:

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 | default(False)
...

2
Bir hatayı önlemek için "tam" tanımlamıyorsanız sadece kullanın thorough | default("false") | match("true"). Varsayılan olması şart değildir false, sadece eşleşmeyen bir şey olmak zorunda değildir true, fakat okunabilirliği arttırır.
Tom Wilson,

4

'Tags' değişkenini kontrol etmek Ansible 2.1.1.0'da çalışmıyor. Test için aşağıya bakın. Ansible 1.9.X ve 2.XY için çalışan yalnızca bir etiket tanımlandığında görevi yürütmek için başka bir fikrim var:

- 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

Bununla, oyun kitabını herhangi bir etiketi olmadan çalıştırırken, 'foo' değişkeni true değerine ve false değerine ayarlanır, bu nedenle hiçbir şey yürütülmez. 'Bar' etiketini eklerseniz, yalnızca ilk ayar uygulanır, böylece 'foo' değişkeni gerçek olur, sonra göreviniz yürütülür. Keyfini çıkarın!


Ve işte Ansible 2.1.1.0'daki 'tags' değişkeni ile ilgili test:

İşte oyun kitabı:

- 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

Ve işte çıktı:

$ 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

Evet. Bayrakla birlikte ansible-playbook çalıştırmak --tags foosadece etiketli görevlerin yerine getirilmesini sağlayacaktır foo. Örneğin example.yml adında bir oyun kitabımız olduğunu varsayalım:

tasks:

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

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

koşu:

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

Sadece yum görevinin yerine getirildiğinden emin olur.

Bu nedenle aslında, bir görevi koşullu olarak yürütmek için bölüm ne zaman etiketleri kullanmak zorunda değilsiniz. Oyun kitaplarınızın / rollerin karmaşıklığına bağlı olarak, hangi görevlerin yürütüleceğini kontrol etmek için bir --tag ve - atlama-etiketi kombinasyonu kullanmanız gerekebileceğini unutmayın. Örneğin, bir ekleme görevleri 'foo' olarak etiketlenmişse ve dahil edilen oynatma kitabındaki bazı görevler 'bar' olarak etiketlenmişse ve siz koşuyorsanız

ansible-playbook --tags "foo"

Dahili görev (sadece 'bar' olarak etiketlendi) yürütülecek. 'Bar' olarak etiketlenmiş tüm dahili görevlerin yürütülmesini önlemek için aşağıdaki komutu uygulamanız gerekir.

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

7
Bu doğru değil: "Bir görevde bir etiket belirtmek, yalnızca bu etiket açıkça ansible-playbook komutuna geçirildiğinde bu görevin yerine getirileceği anlamına gelir."
gimboland

1
İkincil, ifade doğru değil.
Chris

10
evet, her zaman doğru ansible-playbookseçenekleri kullandığınızdan emin olarak bu davranışı başarabilirsiniz , ancak OP'nin belirli bir etiket ansible-playbookkomutta açıkça eklenmediği sürece yürütülmemesi için bir görevi açıklamak için bir yol istediğini düşünüyorum .
dgh,

4
Evet, bu OP'nin sorusuna cevap vermiyor.
Allen Luce

Bir etiket belirtmediğinizde etiketli / etiketsiz tüm eylemler çalıştırılır. Etiketler, çalıştırılacak bir işlemi hariç tutamaz, yalnızca dahil eder. Ek bir filtre dışında hiçbir öngörü mantığı yoktur.
bbaassssiiee


0

ne zaman fıkra etiketleri varlığını değerlendiremez. Geçici bir çözüm olarak, bu etikete / değişkene özgü görevleri çalıştırmak için değişkenleri ve etiketleri birlikte kullanırım.

Ör: Bir oyun kitabı ve envanter hayal edin

# envanter
[Dev]
192.168.1.1

# site.yml
- ev sahibi: dev
  roller:
    - {role: common}

ve ortak / görevler / main.yml

# roles / common / tasks / main.yaml
- name: Bağlantıları yükle
  apt: name = links durum = mevcut

- dahil: uninstall.yml
  when: uninstall_links tanımlandı
  etiketler:
    - kaldırma

# roles / common / tasks / uninstall.yml
- isim: Bağlantıları kaldır
  apt: name = links durum = yok

Bu yaklaşımla, etiketi uninstall.yml içindeki yalnızca görevleri seçmek için kullanırsınız, ancak bunu etkinleştirmek için 'uninstall_links' değişkenini de ayarlamanız gerekir. Eğer playbook'u herhangi bir parametre olmadan çalıştırırsanız, varsayılan olarak kurulum görevini çalıştıracaktır. Kaldırma işlemi için 'uninstall' etiketini oynatma kitabınıza (veya cmdline) ayarlayabilir ve ZORUNLU değişkeni ayarlayabilirsiniz. Etiketi ayarlamazsanız, bu sırayla her şeyi (yükleme ve kaldırma) çalıştıracaktır, bu işlemin tamamını test etmek için iyidir.

Her şey nasıl çalıştırılır (kurulur ve kaldırılır):

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

Dev grubundaki sadece 'uninstall' etiketi nasıl çalıştırılır

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

Bu nedenle, değişkenler ve etiketler ayrıca site.yml / envanter dosyalarında da olabilir, bu da SCM'nize girmenize ve niyetinizi kaydetmenize olanak sağlar.


0

nootal haklı, yaklaşımım çalışmıyor - görmezden gelin :( Şimdi "ne zaman: myvar tanımlı" ve "-e" myvar = X "komut satırı anahtarını yalnızca açıkça istendiğinde görevleri yürütmek için kullanıyorum.

Daha da kolay (en azından 2.1.1.0 ile uyumlu):

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

-> sadece etiketler sağlandığında çalıştırılacak VE etiketler "foo" içeriyorsa


0

Açık Ansible 2.3.2.0, işte sorun için benim çözümüm:

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

Bu ayarlayarak başlar in_tagiçin Truebir var sonra set_factgeri ayarlar Falseherhangi belirtmeyen yanar tagsdan ansible-playbook.

Etiketleri belirttiğinizde in_tagkalır Trueve failgörev çalışır.

Not: İstediğiniz herhangi bir göreve mantık ekleyebilirsiniz

PS2: Ayrıca, mantığınızı genişletebilir ve sahip olduğunuz tüm etiketleri ve tabii ki set_fact: in_tag_blah=Truebirlikte tags: ["blah"]yazdırabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.