Jalankan perintah pada host Ansible

247

Apakah mungkin menjalankan perintah pada host Ansible?

Skenario saya adalah saya ingin mengambil checkout dari server git yang di-host secara internal (dan tidak dapat diakses di luar firewall perusahaan). Lalu saya ingin mengunggah checkout (tarballed) ke server produksi (di-host secara eksternal).

Saat ini, saya sedang melihat menjalankan skrip yang melakukan checkout, tarballs itu, dan kemudian menjalankan skrip deployment - tetapi jika saya bisa mengintegrasikan ini ke dalam Ansible yang lebih disukai.

Ross
sumber

Jawaban:

347

Ya, Anda dapat menjalankan perintah pada host Ansible. Anda dapat menentukan bahwa semua tugas dalam permainan dijalankan pada host Ansible, atau Anda dapat menandai tugas individu untuk dijalankan pada host Ansible.

Jika Anda ingin menjalankan seluruh permainan pada host Ansible, maka tentukan hosts: 127.0.0.1dan connection:localdalam drama tersebut, misalnya:

- 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

Lihat Playbook Lokal di dokumentasi Ansible untuk lebih jelasnya.

Jika Anda hanya ingin menjalankan satu tugas pada host Ansible Anda, Anda dapat menggunakan local_actionuntuk menentukan bahwa tugas harus dijalankan secara lokal. Sebagai contoh:

- 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

Lihat Delegasi dalam dokumentasi Ansible untuk lebih jelasnya.

Sunting: Anda dapat menghindari keharusan mengetik connection: localpermainan Anda dengan menambahkan ini ke inventaris Anda:

localhost ansible_connection=local

(Di sini Anda akan menggunakan "localhost" alih-alih "127.0.0.1" untuk merujuk ke permainan).

Sunting: Dalam versi yang lebih baru dari kemungkinan, Anda tidak perlu lagi menambahkan baris di atas ke inventaris Anda, mungkin mengasumsikan itu sudah ada.

Lorin Hochstein
sumber
8
Saya juga diperlukan sudo: nodalam skenario delegasi
Danimal
bagaimana menjalankan koneksi lokal sebagai pengguna root?
Bilal Usean
@BilalUsean ansible-playbook -K playbook.ymlmana -K untuk root
Kush
74

Saya telah menemukan beberapa cara lain Anda dapat menulis ini yang sedikit lebih mudah dibaca IMHO.

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

ATAU

- name: check out a git repository
  local_action: git
  args:
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path
Gordon Dickens
sumber
3
Menarik, bagaimana cara kerjanya dengan perintah ? Karena sejauh yang saya tahu kita tidak bisa menggunakan param free_form untuk mendefinisikan perintah yang akan dieksekusi
Ander
@ Ander Hal yang sama berlaku untuk shellmodul.
ceving
6
untuk digunakan dengan perintah / shell, yang Anda inginkan adalah "_raw_params"
mvr
41

Saya ingin membagikan bahwa Ansible dapat dijalankan di localhost via shell:

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

Ini bisa bermanfaat untuk tugas-tugas sederhana atau untuk pembelajaran langsung dari Ansible.

Contoh kode diambil dari artikel bagus ini:

Menjalankan buku pedoman yang memungkinkan di localhost

mxf
sumber
2
Apa pentingnya koma (,) setelah localhost. Saya perhatikan sangat penting untuk perintah untuk bekerja
Tuomas Toivonen
2
koma trailing adalah untuk mendefinisikan inventaris sederhana dengan menunjuk ke file. Ini semacam hack tidak berdokumen, dan bisa hilang (iirc).
senorsmile
19

Anda dapat menggunakan delegate_tountuk menjalankan perintah pada host Ansible Anda (host admin), dari tempat Anda menjalankan permainan Ansible Anda. Sebagai contoh:

Hapus file jika sudah ada di host yang memungkinkan:

 - 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

Buat file baru di host yang memungkinkan:

 - name: Create log file
   file:
    path: /tmp/logfile.log
    state: touch
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1
c_agrawal
sumber
1
Ini tampaknya menjadi solusi terbersih dari jawaban sejauh ini.
anak ayam
1
Setuju. Sintaks baru, paling fleksibel (mendelegasikan juga di tempat lain). Satu item yang perlu diperhatikan - jika becomeBenar untuk tugas itu, ia akan mengeluh tentang sudo dan semacamnya. Itu bisa terjadi langsung pada tugas atau diwarisi untuk tempat lain.
JL Peyret
4

Memperluas jawaban oleh @ gordon, berikut adalah contoh sintaks yang dapat dibaca dan argumen yang lewat dengan modul shell / command (ini berbeda dari modul git karena ada argumen yang diperlukan tetapi berupa-bebas, seperti yang dicatat oleh @ander)

- name: "rilis tarball dibuat"
  local_action:
    modul: shell
    _raw_params: arsip git --format zip --output release.zip HEAD
    chdir: "file / klon / webhooks"
mvr
sumber
2

Dari dokumentasi Ansible :

Delegasi Ini sebenarnya bukan bergulir khusus pembaruan tetapi sering muncul dalam kasus-kasus tersebut.

Jika Anda ingin melakukan tugas pada satu host dengan referensi ke host lain, gunakan kata kunci 'delegate_to' pada tugas. Ini sangat ideal untuk menempatkan node dalam kumpulan beban seimbang, atau menghapusnya. Ini juga sangat berguna untuk mengendalikan jendela yang padam. Perlu diketahui bahwa tidak masuk akal untuk mendelegasikan semua tugas, debug, add_host, termasuk, dll selalu dijalankan pada controller. Menggunakan ini dengan kata kunci 'serial' untuk mengontrol jumlah host yang dieksekusi sekaligus juga merupakan ide bagus:

---

- 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

Perintah-perintah ini akan berjalan pada 127.0.0.1, yang merupakan mesin yang menjalankan Ansible. Ada juga sintaks steno yang dapat Anda gunakan berdasarkan per tugas: 'local_action'. Berikut ini adalah buku pedoman yang sama seperti di atas, tetapi menggunakan sintaks singkatan untuk mendelegasikan ke 127.0.0.1:

---

# ...

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

Pola umum adalah menggunakan tindakan lokal untuk memanggil 'rsync' untuk menyalin file secara rekursif ke server yang dikelola. Berikut ini sebuah contoh:

---
# ...
  tasks:

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

Perhatikan bahwa Anda harus memiliki kunci SSH tanpa frasa sandi atau ssh-agent yang dikonfigurasikan agar ini berfungsi, jika tidak rsync perlu meminta kata sandi.

Kontrol Android
sumber
0
ansible your_server_name -i custom_inventory_file_name -m -a "uptime"

Modul default adalah modul perintah, oleh karena itu commandkata kunci tidak diperlukan.

Jika Anda perlu mengeluarkan perintah apa pun dengan hak akses tinggi gunakan -bdi akhir perintah yang sama.

ansible your_server_name -i custom_inventory_file_name -m -a "uptime" -b
Deepak kumar
sumber
-1

Anda bisa coba cara ini

omi
sumber