是否可以在Ansible主机上运行命令?
我的方案是我想从内部托管的git服务器(在公司防火墙外无法访问)进行结账。然后我想将结帐(tarballed)上传到生产服务器(外部托管)。
目前,我正在考虑运行一个执行结帐的脚本,对其进行压缩,然后运行部署脚本 - 但是如果我可以将其集成到Ansible中,那将更为可取。
答案 0 :(得分:315)
是的,您可以在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文档中的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的一些动手学习很有帮助。
代码的例子取自这篇好文章:
答案 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)
您可以尝试这种方式