是否可以在Ansible主机上运行命令?
我的场景是,我想从内部托管的git服务器(在公司防火墙之外无法访问)进行签出。然后,我想将签出(压缩)上传到生产服务器(外部托管)。
目前,我正在考虑运行一个执行签出的脚本,tarball它,然后运行部署脚本-但如果我可以将其集成到Ansible,那将是更可取的。
是否可以在Ansible主机上运行命令?
我的场景是,我想从内部托管的git服务器(在公司防火墙之外无法访问)进行签出。然后,我想将签出(压缩)上传到生产服务器(外部托管)。
目前,我正在考虑运行一个执行签出的脚本,tarball它,然后运行部署脚本-但如果我可以将其集成到Ansible,那将是更可取的。
当前回答
来自Ansible文档:
代表团 这实际上并不是特定于滚动更新的,但在这些情况下经常出现。
如果你想在一个主机上引用其他主机执行一个任务,在任务上使用' delegate_to '关键字。这对于在负载平衡池中放置节点或删除节点非常理想。它对于控制中断窗口也非常有用。请注意,委派所有任务是没有意义的,调试、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
这些命令将运行在127.0.0.1上,这是运行Ansible的机器。还有一种速记语法,你可以在每个任务的基础上使用:' 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"
默认模块为命令模块,因此不需要命令关键字。
如果您需要发出任何具有更高权限的命令,请在同一命令的末尾使用-b。
ansible your_server_name -i custom_inventory_file_name -m -a "uptime" -b
使用ansible-playbook -i "localhost," -c local your_file_name.yml
注意,“localhost”后面必须有逗号。
例子:
我们正在使用shell模块在localhost中运行' echo hello world '。现在让我们写一个剧本helloworld.yml
---
- hosts: all
tasks:
- shell: echo "hello world"
运行剧本:
ansible-playbook -i "localhost," -c local helloworld.yml
输出:
PLAY [all] *********
GATHERING FACTS *********
ok: [localhost]
TASK: [shell echo "hello world"] *********
changed: [localhost]
PLAY RECAP *********
localhost : ok=2 changed=1 unreachable=0 failed=0
引用:
在本地主机运行ansible playbook: https://web.archive.org/web/20180513205612/http://ansible.pickle.io/post/86598332429/running-ansible-playbook-in-localhost
来自Ansible文档:
代表团 这实际上并不是特定于滚动更新的,但在这些情况下经常出现。
如果你想在一个主机上引用其他主机执行一个任务,在任务上使用' delegate_to '关键字。这对于在负载平衡池中放置节点或删除节点非常理想。它对于控制中断窗口也非常有用。请注意,委派所有任务是没有意义的,调试、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
这些命令将运行在127.0.0.1上,这是运行Ansible的机器。还有一种速记语法,你可以在每个任务的基础上使用:' 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将需要请求密码短语。
你可以使用delegate_to在你的Ansible主机(管理主机)上运行命令,从那里你正在运行你的Ansible play。例如:
删除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
我想分享Ansible可以通过shell在localhost上运行:
Ansible all -i "localhost ", -c local -m shell -a 'echo hello world'
这可能对简单的任务或Ansible的一些实践学习有帮助。
代码示例摘自这篇好文章:
在本地主机运行ansible playbook