282

Is it possible to run commands on the Ansible host?

My scenario is that I want to take a checkout from a git server that is hosted internally (and isn't accessible outside the company firewall). Then I want to upload the checkout (tarballed) to the production server (hosted externally).

At the moment, I'm looking at running a script that does the checkout, tarballs it, and then runs the deployment script - but if I could integrate this into Ansible that would be preferable.

4

7 回答 7

394

是的,您可以在 Ansible 主机上运行命令。您可以指定播放中的所有任务在 Ansible 主机上运行,​​或者您可以将单个任务标记为在 Ansible 主机上运行。

如果要在 Ansible 主机上运行整个 play,则在 play 中指定hosts: 127.0.0.1connection: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

有关更多详细信息,请参阅 Ansible 文档中的“控制任务运行的位置:委托和本地操作”。


connection: local您可以通过将其添加到您的库存中来避免输入您的游戏:

localhost ansible_connection=local

(这里你会使用“ localhost”而不是“ 127.0.0.1”来指代该剧)。


在较新版本的 Ansible 中,您不再需要将上述行添加到您的清单中,Ansible 假定它已经存在。

于 2013-09-20T01:08:27.730 回答
89

我发现了其他几种方法可以编写这些更易读的恕我直言。

- 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
于 2016-03-07T22:17:45.380 回答
54

我想分享 Ansible 可以通过 shell 在 localhost 上运行:

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

这对于简单的任务或对 Ansible 的一些动手学习可能会有所帮助。

代码示例取自这篇好文章:

在 localhost 中运行 ansible playbook

于 2016-08-02T09:11:28.447 回答
26

您可以使用delegate_to在您的 Ansible 主机(管理员主机)上运行命令,从那里运行您的 Ansible 游戏。例如:

如果 Ansible 主机上已存在文件,则删除该文件:

 - 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 主机上创建一个新文件:

 - name: Create log file
   file:
    path: /tmp/logfile.log
    state: touch
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1
于 2017-05-29T12:04:21.380 回答
5

扩展@gordon 的答案,这是一个使用 shell/command 模块传递的可读语法和参数的示例(这些与 git 模块的不同之处在于有必需但自由格式的参数,如 @ander 所述)

- 名称:“生成释放压缩包”
  本地操作:
    模块:外壳
    _raw_params: git archive --format zip --output release.zip HEAD
    chdir:“文件/克隆/网络钩子”
于 2017-04-05T02:17:13.247 回答
4

来自 Ansible文档

委派 这实际上不是特定于滚动更新的,但在这些情况下经常出现。

如果您想在一个主机上执行一项任务并参考其他主机,请在任务上使用“delegate_to”关键字。这是将节点放置在负载平衡池中或删除它们的理想选择。它对于控制中断窗口也非常有用。请注意,委派所有任务是没有意义的,调试、添加主机、包含等总是在控制器上执行。将其与 '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

这些命令将在运行 Ansible 的机器 127.0.0.1 上运行。您还可以在每个任务的基础上使用一种速记语法:'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 将需要询问密码。

于 2019-02-20T21:12:37.060 回答
0
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
于 2018-08-20T14:08:34.120 回答