Uruchom polecenie na hoście Ansible

247

Czy można uruchamiać polecenia na hoście Ansible?

Mój scenariusz polega na tym, że chcę pobrać kasę z serwera git, który jest hostowany wewnętrznie (i nie jest dostępny poza zaporą firmową). Następnie chcę załadować kasę (tarballed) na serwer produkcyjny (hostowany zewnętrznie).

W tej chwili zastanawiam się nad uruchomieniem skryptu, który wykonuje kasę, tarballuje go, a następnie uruchamia skrypt wdrażania - ale gdybym mógł zintegrować to z Ansible, byłoby to lepsze.

Ross
źródło

Odpowiedzi:

347

Tak, możesz uruchamiać polecenia na hoście Ansible. Możesz określić, że wszystkie zadania w grze będą uruchamiane na hoście Ansible, lub możesz oznaczyć poszczególne zadania do uruchomienia na hoście Ansible.

Jeśli chcesz uruchomić całą grę na hoście Ansible, określ hosts: 127.0.0.1i connection:localw grze, na przykład:

- 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

Aby uzyskać więcej informacji, zobacz Lokalne podręczniki w dokumentacji Ansible.

Jeśli chcesz tylko uruchomić jedno zadanie na hoście Ansible, możesz użyć, local_actionaby określić, że zadanie powinno być uruchamiane lokalnie. Na przykład:

- 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

Aby uzyskać więcej informacji, zobacz Delegowanie w dokumentacji Ansible.

Edycja: Możesz uniknąć konieczności wpisywania connection: localswojej gry, dodając ją do swojego ekwipunku:

localhost ansible_connection=local

(W tym przypadku użyłbyś „localhost” zamiast „127.0.0.1” w odniesieniu do odtwarzania).

Edycja: W nowszych wersjach ansible nie musisz już dodawać powyższej linii do swojego ekwipunku, ansible zakłada, że ​​już tam jest.

Lorin Hochstein
źródło
8
Potrzebowałem również sudo: now scenariuszu przekazania
uprawnień
jak uruchomić połączenie lokalne jako użytkownik root?
Bilal Usean
@BilalUsean ansible-playbook -K playbook.ymlgdzie -K dla roota
Kush
74

Znalazłem kilka innych sposobów pisania, które są nieco bardziej czytelne IMHO.

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

LUB

- name: check out a git repository
  local_action: git
  args:
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path
Gordon Dickens
źródło
3
Ciekawe, jak to będzie działać z poleceniem ? Ponieważ, o ile wiem, nie możemy użyć parametru free_form do zdefiniowania polecenia, które zostanie wykonane
Ander
@Ander To samo dotyczy shellmodułu.
ceving
6
do użycia z poleceniem / powłoką, czego potrzebujesz, to „_raw_params”
mvr
41

Chciałbym się podzielić tym, że Ansible można uruchomić na localhost za pośrednictwem powłoki:

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

Może to być pomocne w przypadku prostych zadań lub praktycznej nauki Ansible.

Przykład kodu pochodzi z tego dobrego artykułu:

Uruchamianie podręcznika Ansible w localhost

MXF
źródło
2
Jakie jest znaczenie przecinka (,) po localhost. Zauważyłem, że niezbędne jest, aby polecenie działało
Tuomas Toivonen,
2
przecinek końcowy służy do zdefiniowania prostego spisu ze wskazaniem pliku. To rodzaj nieudokumentowanego włamania i może odejść (iirc).
senorsmile
19

Możesz użyć delegate_todo uruchomienia poleceń na hoście Ansible (admin admin), z którego uruchamiasz grę Ansible. Na przykład:

Usuń plik, jeśli już istnieje na hoście Ansible:

 - 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

Utwórz nowy plik na hoście Ansible:

 - 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
źródło
1
To wydaje się być najczystszym jak dotąd rozwiązaniem z jakiejkolwiek odpowiedzi.
pisklęta
1
Zgodzić się. Najmniej nowa składnia, najbardziej elastyczna (deleguj też gdzie indziej). Jedną rzecz do zapamiętania - jeśli becomejest to prawda dla zadania, będzie narzekać na sudo i takie tam. Może się to zdarzyć bezpośrednio w zadaniu lub zostać odziedziczone w innym miejscu.
JL Peyret,
4

Rozwijając odpowiedź @gordon, oto przykład czytelnej składni i przekazywania argumentów za pomocą powłoki / modułu poleceń (różnią się one od modułu git tym, że są wymagane, ale swobodne argumenty, jak zauważył @ander)

- name: „generowane jest wydanie tarballa”
  aktywność lokalna:
    moduł: shell
    _raw_params: git archive --format zip --output release.zip HEAD
    chdir: „files / clones / webhooks”
mvr
źródło
2

Z dokumentacji Ansible :

Delegowanie Nie jest to tak naprawdę specyfikacja krocząca, ale często pojawia się w takich przypadkach.

Jeśli chcesz wykonać zadanie na jednym hoście w odniesieniu do innych hostów, użyj słowa kluczowego „delegate_to” w zadaniu. Jest to idealne rozwiązanie do umieszczania węzłów w puli z równoważeniem obciążenia lub usuwania ich. Jest to również bardzo przydatne do kontrolowania okien awarii. Należy pamiętać, że delegowanie wszystkich zadań, debugowanie, dodawanie hosta, dołączanie itp. Nie ma sensu, zawsze wykonuje się na kontrolerze. Dobrym pomysłem jest również użycie tego słowa kluczowego „serial” do kontrolowania liczby hostów wykonujących się jednocześnie:

---

- 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

Te polecenia będą działać na 127.0.0.1, czyli na maszynie z Ansible. Istnieje również skrócona składnia, której można używać dla poszczególnych zadań: „działanie lokalne”. Oto ten sam poradnik, jak powyżej, ale przy użyciu skróconej składni do delegowania do 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 }}

Częstym wzorcem jest użycie akcji lokalnej do wywołania „rsync” w celu rekurencyjnego kopiowania plików na zarządzane serwery. Oto przykład:

---
# ...
  tasks:

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

Zauważ, że musisz mieć klucze SSH bez hasła lub agenta ssh skonfigurowanego do tego, aby działało, w przeciwnym razie rsync będzie musiał poprosić o hasło.

Kontrola Androida
źródło
0
ansible your_server_name -i custom_inventory_file_name -m -a "uptime"

Domyślnym modułem jest moduł poleceń, dlatego commandsłowo kluczowe nie jest wymagane.

Jeśli chcesz wydać dowolne polecenie z podwyższonymi uprawnieniami, użyj -bna końcu tego samego polecenia.

ansible your_server_name -i custom_inventory_file_name -m -a "uptime" -b
Deepak Kumar
źródło
-1

możesz spróbować w ten sposób

omi
źródło