Выполнить команду на сервере Ansible

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

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

На данный момент я просматриваю script, который выполняет проверку, архивирует его, а затем запускает развертывание script, но если бы я мог интегрировать это в Ansible, что было бы предпочтительнее.

Ответ 1

Да, вы можете запускать команды на хосте 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

Подробнее см. Локальные файлы в формате в документации 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

Подробнее см. Delegation в документации Ansible.

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

localhost ansible_connection=local

(Здесь вы можете использовать "localhost" вместо "127.0.0.1", чтобы ссылаться на воспроизведение).

Изменить: в новых версиях невозможно, вам больше не нужно добавлять указанную выше строку в свой инвентарь, возможно, он уже существует.

Ответ 2

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

- 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

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

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

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

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

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

Ответ 4

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

Удалите файл, если он уже существует на Ansible host:

 - 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 host:

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

Ответ 5

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

- name: "release tarball is generated"
  local_action:
    module: shell
    _raw_params: git archive --format zip --output release.zip HEAD
    chdir: "files/clones/webhooks"

Ответ 6

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

Делегация На самом деле это не конкретное обновление, но в таких случаях оно часто встречается.

Если вы хотите выполнить задачу на одном узле со ссылкой на другие узлы, используйте ключевое слово ‘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 будет запрашивать парольную фразу.

Ответ 7

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

Ответ 8

Вы можете попробовать этот способ

  • мерзавец: репо:https://foosball.example.org/path/to/repo.git dest: /srv/checkout версия: релиз-0.2 Delegate_to: Localhost
  • имя: выполните следующую команду yum: name = состояние ntp = последний