Запустите команду на хосте Ansible


247

Можно ли запускать команды на хосте Ansible?

Мой сценарий заключается в том, что я хочу получить извлечение с git-сервера, который размещен внутри (и недоступен за пределами брандмауэра компании). Затем я хочу загрузить извлечение (tarballed) на производственный сервер (размещенный снаружи).

В данный момент я смотрю на запуск сценария, который выполняет извлечение, архивирует его, а затем запускает сценарий развертывания - но если бы я мог интегрировать это в 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

Смотрите Local Playbooks в документации Ansible для более подробной информации.

Если вы просто хотите запустить одну задачу на хосте 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

См. Делегирование в документации Ansible для более подробной информации.

Изменить: Вы можете избежать необходимости вводить connection: localв игру, добавив это в свой инвентарь:

localhost ansible_connection=local

(Здесь вы бы использовали «localhost» вместо «127.0.0.1» для ссылки на игру).

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


8
Я также нуждался sudo: noв сценарии делегирования
Danimal

как запустить локальное соединение от имени пользователя root?
Билал Усеан

@BilalUsean ansible-playbook -K playbook.ymlгде -K для пользователя root
Куш

74

Я нашел пару других способов, которыми вы можете написать эти, которые немного более читабельны, ИМХО.

- 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 для определения команды, которая будет выполняться
Андер,

@ Андер То же самое относится и к shellмодулю.
выступление

6
для использования с командой / оболочкой, то, что вы хотите, это "_raw_params"
mvr

41

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

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

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

Пример кода взят из этой хорошей статьи:

Запуск ANSIBLE playbook в локальном хосте


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
Согласен. Наименее новый синтаксис, наиболее гибкий (делегировать и в других местах). Один пункт, чтобы отметить - если becomeTrue для задачи, он будет жаловаться на sudo и тому подобное. Это может произойти непосредственно в задаче или быть унаследовано для других.
JL Peyret

4

В качестве дополнения к ответу @gordon приведем пример удобочитаемого синтаксиса и передачи аргументов с помощью модуля оболочки / команды (они отличаются от модуля git тем, что существуют обязательные аргументы в свободной форме, как отметил @ander)

- name: "сформирован релизный архив"
  local_action:
    модуль: оболочка
    _raw_params: git archive --format zip --output release.zip HEAD
    chdir: "файлы / клоны / webhooks"

2

Из документации Ansible :

Делегирование Это не конкретное обновление, а часто встречающееся в таких случаях.

Если вы хотите выполнить задачу на одном хосте со ссылкой на другие хосты, используйте ключевое слово «Delegate_to» в задаче. Это идеально для размещения узлов в пуле с балансировкой нагрузки или их удаления. Это также очень полезно для управления окнами отключения. Имейте в виду, что не имеет смысла делегировать все задачи, debug, add_host, include и т. Д. Всегда выполняются на контроллере. Использование этого с ключевым словом «serial» для управления количеством хостов, выполняющихся одновременно, также является хорошей идеей:

---

- 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. Существует также сокращенный синтаксис, который вы можете использовать для каждой задачи: «local_action». Вот та же книга воспроизведения, что и выше, но с использованием сокращенного синтаксиса для делегирования 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-agent, настроенный для этого, иначе 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

-1

ты можешь попробовать этот путь

  • git: repo: ' https://foosball.example.org/path/to/repo.git ' dest: / srv / checkout версия: release-0.2 Delegate_to: localhost
  • name: выполните некоторую команду далее yum: name = состояние ntp = последний
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.