Answers:
是的,您可以在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假定它已经存在。
ansible-playbook -K playbook.yml
其中-K为根
我发现您可以通过其他几种方式编写这些代码,恕我直言。
- 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
shell
模块。
我想分享一下Ansible可以通过shell在本地主机上运行:
ansible all -i "localhost," -c local -m shell -a 'echo hello world'
这对于简单的任务或Ansible的一些动手学习可能会有所帮助。
代码示例摘自这篇出色的文章:
您可以用来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
become
该任务为True,它将抱怨sudo等。这可以直接在任务上发生,也可以在其他地方继承。
从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将需要输入密码。
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
sudo: no
在委派场景中,我也需要