Ansible ana bilgisayarında çalıştır komutu


247

Ansible ana bilgisayarında komut çalıştırmak mümkün mü?

Benim senaryom, dahili olarak barındırılan (ve şirket güvenlik duvarı dışında erişilemeyen) git sunucusundan bir ödeme almak istiyorum olmasıdır. Daha sonra kasayı (tarballed) üretim sunucusuna (harici olarak barındırılan) yüklemek istiyorum.

Şu anda, ödeme yapan, tarballs yapan ve daha sonra dağıtım komut dosyasını çalıştıran bir komut dosyası çalıştırmaya bakıyorum - ancak bunu Ansible'a entegre edersem, bu tercih edilir.

Yanıtlar:


347

Evet, Ansible ana bilgisayarında komutları çalıştırabilirsiniz. Bir oyundaki tüm görevlerin Ansible ana bilgisayarında çalışacağını belirtebilir veya Ansible ana bilgisayarında çalışmak üzere tek tek görevleri işaretleyebilirsiniz.

Sonra, yanıtlayıcı 'ana bilgisayarda bütün bir oyun çalıştırmak belirtmek istiyorsanız hosts: 127.0.0.1ve connection:localörneğin oyunda:

- name: a play that runs entirely on the ansible host
  hosts: 127.0.0.1
  connection: local
  tasks:
  - name: check out a git repository
    git: repo=git://foosball.example.org/path/to/repo.git dest=/local/path

Daha fazla bilgi için Ansible belgelerindeki Yerel Oyun Kitapları'na bakın.

Ansible ana makinenizde yalnızca tek bir görev çalıştırmak istiyorsanız, local_actiongörevin yerel olarak çalıştırılması gerektiğini belirtmek için kullanabilirsiniz. Örneğin:

- name: an example playbook
  hosts: webservers
  tasks:
  - ...

  - name: check out a git repository
    local_action: git repo=git://foosball.example.org/path/to/repo.git dest=/local/path

Daha fazla bilgi için Ansible belgelerindeki Temsilci Seçme bölümüne bakın .

Düzenleme: Bunu connection: localenvanterinize ekleyerek oyununuzu yazmak zorunda kalmazsınız :

localhost ansible_connection=local

(Burada oyuna atıfta bulunmak için "127.0.0.1" yerine "localhost" kullanırsınız).

Düzenleme: Ansible'ın yeni sürümlerinde, envanterinize yukarıdaki satırı eklemenize gerek yoktur, ansible zaten orada olduğunu varsayar.


8
sudo: noDelegasyon senaryosunda da ihtiyacım vardı
Danimal

yerel bağlantı kök kullanıcı olarak nasıl çalıştırılır?
Bilal Usean

@BilalUsean ansible-playbook -K playbook.ymlnerede -K için kök
Kush

74

Biraz daha okunabilir IMHO olan bunları yazabileceğiniz birkaç yol buldum.

- name: check out a git repository
  local_action: 
    module: git
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path

VEYA

- name: check out a git repository
  local_action: git
  args:
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path

3
İlginç, bu komutla nasıl çalışır ? Çünkü bildiğim kadarıyla çalıştırılacak komutu tanımlamak için free_form parametresini kullanamayız
Ander

@Ander Aynı durum shellmodül için de geçerlidir.
ceving

6
komut / kabuk ile kullanmak için, istediğiniz "_raw_params"
mvr

41

Ansible'ın localhost üzerinde kabuk üzerinden çalıştırılabileceğini paylaşmak istiyorum:

ansible all -i "localhost," -c local -m shell -a 'echo hello world'

Bu, basit görevler veya Ansible'ın bazı uygulamalı öğrenmeleri için yararlı olabilir.

Kod örneği bu iyi makaleden alınmıştır:

Localhost'ta ansible playbook çalıştırma


2
Localhost'tan sonra virgülün (,) önemi nedir? Komutun çalışması için çok önemli olduğunu fark ettim
Tuomas Toivonen

2
sondaki virgül, bir dosyaya işaret eden basit bir envanter tanımlamaktır. Belgesiz bir hack ve gidebilir (iirc).
senorsmile

19

delegate_toAnsible sunucunuzda (admin host), Ansible oyununuzu çalıştırdığınız yerden komut çalıştırmak için kullanabilirsiniz . Örneğin:

Ansible ana bilgisayarında zaten varsa bir dosyayı silin:

 - name: Remove file if already exists
   file:
    path: /tmp/logfile.log
    state: absent
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1

Ansible ana bilgisayarında yeni bir dosya oluşturun:

 - name: Create log file
   file:
    path: /tmp/logfile.log
    state: touch
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1

1
Bu şimdiye kadarki herhangi bir cevabın en temiz çözümü gibi görünüyor.
civcivler

1
Katılıyorum. En az yeni sözdizimi, en esnek (başka yerlerde de delege olun). Dikkat edilmesi gereken bir öğe - becomegörev için Doğru ise , sudo ve benzeri şeylerden şikayet edecektir. Bu doğrudan görevde olabilir veya başka bir yerde miras alınabilir.
JL Peyret

4

Cevabın @gordon tarafından genişletilmesi, okunabilir sözdizimi ve kabuk / komut modülü ile geçen argümanın bir örneğidir (bunlar, @ander tarafından not edildiği gibi gerekli ancak serbest biçimli bağımsız değişkenlerin olması nedeniyle git modülünden farklıdır)

- name: "sürüm tarball üretildi"
  local_action:
    modül: kabuk
    _raw_params: git arşivi - format zip - çıkış sürümü.zip KAFA
    chdir: "dosyalar / klonlar / webhooks"

2

Ansible belgelerinden :

Delegasyon Bu aslında güncellemeye özgü değildir, ancak bu gibi durumlarda sıklıkla ortaya çıkar.

Bir ana bilgisayarda diğer ana bilgisayarlara referansla bir görev gerçekleştirmek istiyorsanız, bir görevdeki 'delegate_to' anahtar sözcüğünü kullanın. Bu, düğümleri yük dengeli bir havuza yerleştirmek veya kaldırmak için idealdir. Ayırma pencerelerini kontrol etmek için de çok kullanışlıdır. Tüm görevleri devretmenin, hata ayıklama, add_host, include vb. İşlemlerin her zaman denetleyicide yürütülmesinin mantıklı olmadığını unutmayın. Bir kerede yürütülen ana bilgisayar sayısını kontrol etmek için bunu 'seri' anahtar kelimesi ile kullanmak da iyi bir fikirdir:

---

- hosts: webservers
  serial: 5

  tasks:

  - name: take out of load balancer pool
    command: /usr/bin/take_out_of_pool {{ inventory_hostname }}
    delegate_to: 127.0.0.1

  - name: actual steps would go here
    yum:
      name: acme-web-stack
      state: latest

  - name: add back to load balancer pool
    command: /usr/bin/add_back_to_pool {{ inventory_hostname }}
    delegate_to: 127.0.0.1

Bu komutlar Ansible çalıştıran makine olan 127.0.0.1'de çalışır. Ayrıca görev başına kullanabileceğiniz bir steno sözdizimi de vardır: 'local_action'. Yukarıdaki ile aynı oyun kitabını, ancak 127.0.0.1'e yetki vermek için steno sözdizimini kullanarak:

---

# ...

  tasks:

  - name: take out of load balancer pool
    local_action: command /usr/bin/take_out_of_pool {{ inventory_hostname }}

# ...

  - name: add back to load balancer pool
    local_action: command /usr/bin/add_back_to_pool {{ inventory_hostname }}

Yaygın bir örüntü, dosyaları özyinelemeli olarak yönetilen sunuculara kopyalamak için 'rsync'i çağırmak için yerel bir eylem kullanmaktır. İşte bir örnek:

---
# ...
  tasks:

  - name: recursively copy files from management server to target
    local_action: command rsync -a /path/to/files {{ inventory_hostname }}:/path/to/target/

Bunun çalışması için parola içermeyen SSH anahtarlarınız veya bir ssh aracısının yapılandırılmış olması gerektiğini, aksi takdirde rsync'in bir parola istemesi gerekeceğini unutmayın.


0
ansible your_server_name -i custom_inventory_file_name -m -a "uptime"

Varsayılan modül komut modülüdür, bu nedenle commandanahtar kelime gerekli değildir.

Yükseltilmiş ayrıcalıklarla herhangi bir komut vermeniz gerekiyorsa -b, aynı komutun sonunda kullanın.

ansible your_server_name -i custom_inventory_file_name -m -a "uptime" -b

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.