Виконати команду на хості Ansible


247

Чи можна запускати команди на хості Ansible?

Мій сценарій полягає в тому, що я хочу взяти замовлення з сервера git, який розміщений внутрішньо (і недоступний за межами брандмауера компанії). Тоді я хочу завантажити замовлення (тарбоване) на виробничий сервер (розміщений зовні).

На даний момент я дивлюся на запуск сценарію, який робить замовлення, тарбує його, а потім запускає сценарій розгортання - але якщо я можу інтегрувати це в Ansible, це було б краще.

Відповіді:


347

Так, ви можете запускати команди на хості Ansible. Ви можете вказати, що всі завдання в програмі виконуються на хості Ansible, або ви можете позначити окремі завдання для виконання на хості Ansible.

Якщо ви хочете запустити всю програму на хості Ansible, то вкажіть hosts: 127.0.0.1і connection:localв програмі, наприклад:

- 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

Докладнішу інформацію див. У локальній програмі Playbooks .

Якщо ви просто хочете виконати одне завдання на своєму хості Ansible, ви можете local_actionвказати, що завдання слід виконувати локально. Наприклад:

- 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

Докладнішу інформацію див. В Делегації в Довідковій документації.

Редагувати: Ви можете уникнути необхідності вводити connection: localсвою гру, додавши це до свого інвентаря:

localhost ansible_connection=local

(Тут ви використовуєте "localhost" замість "127.0.0.1" для позначення п'єси).

Редагувати: У нових версіях ansible вам більше не потрібно додавати вищезазначений рядок у свій інвентар, а ansible передбачає, що він вже є.


8
Мені також знадобився sudo: noсценарій делегації
Danimal

як запустити локальне з'єднання як користувач root?
Білал Усеан

@BilalUsean ansible-playbook -K playbook.ymlде -К для root
Куш

74

Я знайшов ще кілька способів написання цих, які є трохи більш читаними IMHO.

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

АБО

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

3
Цікаво, як би це працювало з командою ? Тому що, наскільки я знаю, ми не можемо використати параметр free_form для визначення команди, яка буде виконуватися
Андер

@Ander Те саме стосується shellмодуля.
закінчення

6
для використання з командою / оболонкою, "_raw_params"
1717

41

Я хочу поділитися тим, що Ansible можна запустити на localhost через оболонку:

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

Це може бути корисним для простих завдань або для практичного вивчення Ansible.

Приклад коду взято з цієї хорошої статті:

Запуск рухомої ігрової книги в localhost


2
Яке значення має кома (,) після localhost. Я помітив, що це важливо для роботи команди
Туомас Тойвонен

2
кінцевою комою є визначення простого інвентаря із вказівкою на файл. Це свого роду незадокументований злом, і може піти (iirc).
senorsmile

19

Ви можете використовувати delegate_toкоманди для запуску команд на хості Ansible (адміністратор хоста), звідки ви запускаєте програму Ansible. Наприклад:

Видаліть файл, якщо він вже існує на хості 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

Створіть новий файл на хості 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

1
Це здається найчистішим рішенням будь-якої відповіді на даний момент.
пташенята

1
Погодьтеся. Найменше новий синтаксис, найбільш гнучкий (також делегувати в іншому місці). Один пункт, який слід зазначити - якщо becomeце справді справжнє завдання, воно поскаржиться на судо та таке. Це може статися безпосередньо із завданням або бути успадкованим для інших.
JL Peyret

4

Розгорнувши відповідь на @gordon, ось приклад читаного синтаксису та аргументу, що передається разом з модулем shell / командою (вони відрізняються від модуля git тим, що є необхідні аргументи вільної форми, як зазначає @ander)

- назва: "генерується тарбол"
  локальна перевірка:
    модуль: оболонка
    _raw_params: архів git - формат zip - вихідний випуск.zip HEAD
    chdir: "файли / клони / веб-кукі"

2

З відповідної документації :

Делегація Це насправді не актуальне специфічне оновлення, але часто виникає в цих випадках.

Якщо ви хочете виконати завдання на одному хості з посиланням на інші хости, використовуйте ключове слово 'delegate_to'. Це ідеально підходить для розміщення вузлів у збалансованому навантаженні басейні або їх видалення. Це також дуже корисно для управління вікнами відключення. Майте на увазі, що не має сенсу делегувати всі завдання, налагоджувати, add_host, включати тощо, завжди виконуватись на контролері. Використання цього ключового слова "серійний" для контролю кількості хостів, що виконуються одночасно, також є хорошою ідеєю:

---

- 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

Ці команди будуть працювати на 127.0.0.1, що є машиною, на якій працює Ansible. Існує також скорочений синтаксис, який ви можете використовувати на основі завдання: "локальна перевірка". Ось та сама книга з програмою, що і вище, але використовуючи скорочений синтаксис для делегування до 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 }}

Загальна схема - використовувати локальну дію для виклику "rsync" для рекурсивного копіювання файлів на керовані сервери. Ось приклад:

---
# ...
  tasks:

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

Зауважте, що для цього вам потрібно налаштувати SSH-ключі без паролів або ssh-агент, інакше rsync потрібно буде просити парольну фразу.


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

Модуль за замовчуванням - це командний модуль, тому commandключове слово не потрібно.

Якщо вам потрібно видати будь-яку команду з підвищеними привілеями, використовуйте -bв кінці тієї самої команди.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.