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