在Ansible主机上运行命令


247

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

我的情况是,我想从内部托管的git服务器中签出(并且不能在公司防火墙外部访问)。然后,我想将结帐(打包)上传到生产服务器(外部托管)。

目前,我正在考虑运行一个执行检出的脚本,将其打包,然后运行部署脚本-但是如果我可以将其集成到Ansible中,那将是更好的选择。

Answers:


347

是的,您可以在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

有关更多详细信息,请参见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假定它已经存在。


8
sudo: no在委派场景中,我也需要
Danimal

如何以root用户身份运行本地连接?
Bilal Usean '02

@BilalUsean ansible-playbook -K playbook.yml其中-K为根
库什(Kush)

74

我发现您可以通过其他几种方式编写这些代码,恕我直言。

- 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

3
有趣的是,它将如何与Command一起使用?因为据我所知,我们无法使用param free_form定义将要执行的命令
Ander

@Ander这同样适用于shell模块。
ceving

6
用于命令/ shell,您需要的是“ _raw_params”
mvr

41

我想分享一下Ansible可以通过shell在本地主机上运行:

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

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

代码示例摘自这篇出色的文章:

在本地主机上运行Ansible Playbook


2
本地主机后逗号(,)的含义是什么。我注意到这是至关重要的指挥工作
图奥马斯托伊沃宁

2
尾部逗号是通过指向文件来定义简单清单。这是一种无证的骇客,可能会消失(iirc)。
senorsmile '17

19

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

1
到目前为止,这似乎是所有答案中最干净的解决方案。
小鸡

1
同意。最少的新语法,最灵活(也可以在其他地方委托)。需要注意的一项-如果become该任务为True,它将抱怨sudo等。这可以直接在任务上发生,也可以在其他地方继承。
JL Peyret

4

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

-名称:“已生成释放tarball”
  local_action:
    模块:外壳
    _raw_params:git存档-格式zip-输出release.zip HEAD
    chdir:“文件/克隆/ webhooks”

2

从Ansible 文档中

委托实际上,这并非滚动更新,但在这种情况下经常出现。

如果要参考其他主机在一个主机上执行任务,请在任务上使用'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-agent才能使其正常工作,否则rsync将需要输入密码。


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

-1

你可以这样尝试

  • git:repo:' https ://foosball.example.org/path/to/repo.git'dest:/ srv / checkout版本:release-0.2 proxy_to:localhost
  • 名称:下一个执行一些命令百胜:名称= ntp状态=最新
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.