Выполнить команду на 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.

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

запуск ansible playbook в localhost


можно использовать 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