2013-09-19 5 views
166

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

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

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

ответ

254

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

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

localhost ansible_connection=local 

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

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

+3

блестящий ответ, спасибо! – Ross

+1

Так удобно и хорошо написано. ++++ Спасибо! – chicks

+6

Мне также понадобилось «sudo: no» в сценарии делегирования – Danimal

45

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

- 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 
+1

Интересно, как это работает с [command] (http://docs.ansible.com/ansible/command_module.html)? Поскольку, насколько я знаю, мы не можем использовать параметр ** free_form ** для определения команды, которая будет выполнена. – Ander

+0

@Ander То же самое относится к модулю 'shell'. – ceving

+2

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

14

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

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

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

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

Running ansible playbook in localhost

+1

. Каково значение запятой (,) после localhost. Я заметил, что для команды очень важно работать –

+0

. Конечная запятая - это определение простой инвентаризации с указанием файла. Это своего рода недокументированный хак и может уйти (iirc). – senorsmile

3

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

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

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

удалить файл, если он уже существует на анзибль хосте:

- 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 

Создать новый файл на анзибль хосте:

- name: Create log file 
    file: 
    path: /tmp/logfile.log 
    state: touch 
    mode: "u+rw,g-wx,o-rwx" 
    delegate_to: 127.0.0.1 
Смежные вопросы