Complex-args formunu kullanarak serbest biçimli komutları Ansible'a iletme


9

Programlı olarak oluşturulmuş Ansible playbook'ları kullanıyorum. Genel olarak, oyun kitapları sadece YAML olduğundan, bu basittir. Bununla birlikte, "basit" key=valueformu kullanırken, playbooklar saf YAML değildir - içeriğe gömülebilir bir shlexform içerirler.

Bu formda belirsizlik önlemek için (yani key=value? Çifti komutu için bir bağımsız değişken ya da yanıtlayıcı 'için bir argüman) ve ayrıştırma ve şartsız olarak, örneğin gösterdiği kompleks bağımsız değişken mekanizması kullanıyorum oluşturmak için sadece tek bir biçime sahip yanıtlayıcı' -örnek deposu .

Bu, aşağıdaki türde bir sözdizimi kullanır:

action: module-name
args:
  key1: value1
  key2: value2

... ki bu iyi ve iyi. Ancak, bu formu shellveya belgelericommand ( belgelerinde gerçek komutu adlı bir bağımsız değişkende iletildiğini açıklayan) kullanmaya çalışırken free_form, bu çok iyi çalışmaz:

action: shell
args:
  free_form: echo hello_world >/tmp/something
  creates: /tmp/something

Çağrıldığında, bu aşağıdakileri çalıştırır:

/bin/sh -c " free_form='echo hello_world >/tmp/something'  "

... yapmaya çalıştığım şey bu değil.

Saf YAML sözdizimini kullanarak "serbest biçimli" komutlar alan Ansible modüllerini kullanmanın doğru yolu nedir?

Yanıtlar:


5

Kısa cevap: Do kullanmayın command, raw, script, veya shellmodülleri. Komutu "normal" bir argüman olarak kabul eden kendi modülünüzü yazın.

Uzun cevap:

Çoğu durumda, bunu yapabilirsiniz:

- shell: echo hello_world > /tmp/something
  args:
    creates: /tmp/something

Ancak, bazı kenar durumlarda bu başarısız olur:

- shell: echo hello_world > creates=something
  args:
    creates: creates=something  # The file is named "creates=something"

Bunu ele almanın genel bir yolunu bilmiyorum, ama bash'a özgü bir çözüm:

- shell: echo hello_world > "creates=something"
  args:
    creates: creates=something

Herhangi bir uyumlu YAML jeneratörüne yaymak için iletebileceğim bir veri yapısı var mı - shell: ...? Bu yapı sadece elle güvenilir bir şekilde oluşturulabilecek bir şeyse, bu sorunun amacını bir şekilde yener.
Charles Duffy

@CharlesDuffy: ...Genel olarak bu parçadan kaçabileceğinizi sanmıyorum . Eğer bakarsanız library/commands/command, sen çok cömert regex eşleştirme bulacaksınız creates=, removes=, chdir=, vb. Herhangi bir komutun geçebileceğini garanti etmeniz gerekiyorsa , kendi modülünüzü yazmanız gerekir.
Kartopu

Adil 'nuff. Bu, bence, önemli bir tasarım yanlışlığı ... ama, ne olduğunu.
Charles Duffy

0

Bu, şimdi Ansible belgelerinde ele alınmıştır .

# You can also use the 'args' form to provide the options. This command
# will change the working directory to somedir/ and will only run when
# /path/to/database doesn't exist.
- command: /usr/bin/make_database.sh arg1 arg2
  args:
    chdir: somedir/
    creates: /path/to/database

'Free_form' adında bir parametre olmadığını unutmayın.


Varlığı mu argsönler k=vgelen çiftlerinden üzerinden incelene command, gereken herhangi biri? (Öyleyse, bu belirsizliği temiz bir şekilde ele alır; aksi halde hala var gibi görünmektedir).
Charles Duffy
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.