在Ansible主机上运行命令

时间:2013-09-19 16:29:18

标签: deployment ansible

是否可以在Ansible主机上运行命令?

我的方案是我想从内部托管的git服务器(在公司防火墙外无法访问)进行结账。然后我想将结帐(tarballed)上传到生产服务器(外部托管)。

目前,我正在考虑运行一个执行结帐的脚本,对其进行压缩,然后运行部署脚本 - 但是如果我可以将其集成到Ansible中,那将更为可取。

8 个答案:

答案 0 :(得分:315)

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

如果您想在Ansible主机上运行整个游戏,请在游戏中指定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文档中的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

有关详细信息,请参阅Ansible文档中的Delegation

修改:您可以通过将此添加到广告资源中来避免在游戏中输入connection: local

localhost ansible_connection=local

(这里你使用“localhost”而不是“127.0.0.1”来指代播放)。

编辑:在较新版本的ansible中,您不再需要将上述行添加到您的广告资源中,并且认为它已经存在。

答案 1 :(得分:65)

我已经找到了其他一些你可以写这些的方法,这些方法更易读恕我直言。

- name: check out a git repository
  local_action: 
    module: git
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path

OR

- name: check out a git repository
  local_action: git
  args:
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path

答案 2 :(得分:31)

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

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

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

代码的例子取自这篇好文章:

Running ansible playbook in localhost

答案 3 :(得分:11)

您可以使用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

答案 4 :(得分:4)

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

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

答案 5 :(得分:1)

来自Ansible documentation

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

如果您要参考其他主机在一个主机上执行任务,请在任务上使用“ 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

这些命令将在运行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代理才能使其正常工作,否则rsync将需要输入密码。

答案 6 :(得分: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

答案 7 :(得分:0)

您可以尝试这种方式