Выполнить команду на Ansible хосте
можно ли запускать команды на Ansible хосте?
мой сценарий заключается в том, что я хочу взять проверку с сервера git, который размещен внутри (и недоступен за пределами брандмауэра компании). Затем я хочу загрузить проверку (tarballed) на производственный сервер (размещенный снаружи).
на данный момент я смотрю на запуск сценария, который выполняет проверку, tarballs его, а затем запускает сценарий развертывания-но если бы я мог интегрировать это в Ansible это было бы предпочтительнее.
6 ответов
Да, вы можете запускать команды на 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 для получения более подробной информации.
если вы просто хотите, чтобы выполнить одну задачу на 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 для получения более подробной информации.
Edit: вы можете избежать необходимости вводить connection: local
в вашей игре, добавив в свой инвентарь:
localhost ansible_connection=local
(здесь вы бы использовали "localhost" вместо "127.0.0.1" для ссылки на игру).
Edit: в более новых версиях ansible вам больше не нужно добавлять вышеуказанное строка в вашем инвентаре, ansible предполагает, что он уже там.
Я нашел несколько других способов, которыми вы можете написать эти, которые немного более читаемы 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
Я хотел бы поделиться тем, что Ansible можно запустить на localhost через shell:
ansible all -i "localhost," -c local -m shell -a 'echo hello world'
Это может быть полезно для простых задач или для практического изучения Ansible.
пример кода взят из этой хорошей статьи:
можно использовать delegate_to
для запуска команд на вашем Ansible хосте (admin host), откуда вы запускаете свою Ansible play. Например:
удалить файл, если он уже существует на 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
расширяя ответ @gordon, вот пример читаемого синтаксиса и передачи аргументов с помощью shell / command module (они отличаются от модуля 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"
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