我正在使用 Ansible 与一小组计算机执行一些简单的用户管理任务。目前,我的 playbook 设置为hosts: all
,我的 hosts 文件只是列出所有计算机的单个组:
# file: hosts
[office]
imac-1.local
imac-2.local
imac-3.local
ansible-playbook
命令可以限制这样的播放:
ansible-playbook --limit imac-2.local user.yml
但这似乎很脆弱,尤其是对于可能具有性的剧本。省略limit
标志意味着该剧本将在任何地方运行。由于这些工具仅偶尔使用,因此似乎值得采取措施进行万无一失的播放,这样我们就不会在几个月后意外地某些东西。
是否有将 playbook 运行限制在一台机器上的最佳做法?理想情况下,如果遗漏了一些重要的细节,playbook 应该是无害的。
原来可以直接在 playbook 中输入主机名,所以使用hosts: imac-2.local
运行 playbook 会很好。
更好的解决方案可能是使用变量定义 playbook 的主机,然后通过--extra-vars
传入特定的主机地址:
# file: user.yml (playbook)
---
- hosts: '{{ target }}'
user: ...
运行剧本:
ansible-playbook user.yml --extra-vars "target=imac-2.local"
如果未定义{{ target }}
,则 playbook 不执行任何操作。如果需要,也可以传递 hosts 文件中的一个组。总的来说,这似乎是构建潜在性 playbook 的更安全的方法。
针对单个主机的 Playbook:
$ ansible-playbook user.yml --extra-vars "target=imac-2.local" --list-hosts
playbook: user.yml
play #1 (imac-2.local): host count=1
imac-2.local
Playbook 与一组主机:
$ ansible-playbook user.yml --extra-vars "target=office" --list-hosts
playbook: user.yml
play #1 (office): host count=3
imac-1.local
imac-2.local
imac-3.local
忘记定义主机是安全的!
$ ansible-playbook user.yml --list-hosts
playbook: user.yml
play #1 ({{target}}): host count=0
还有一个可爱的小技巧,可以让你在命令行上指定一个主机(或多个主机,我猜),没有中间库存:
ansible-playbook -i "imac1-local," user.yml
注意末尾的逗号(,);这表明它是一个列表,而不是一个文件。
现在,如果你不小心传递了一个真正的库存文件,这不会保护你,所以它可能不是一个很好的解决这个特定问题的方法。
如果通过检查play_hosts变量提供了多个主机,则此方法将退出。如果不满足单个主机条件,则使用fail module退出。以下示例使用具有两个主机 alice 和 bob 的 hosts 文件。
user.yml(剧本)
---
- hosts: all
tasks:
- name: Check for single host
fail: msg="Single host check failed."
when: "{{ play_hosts|length }} != 1"
- debug: msg='I got executed!'
在没有主机过滤器的情况下运行 playbook
$ ansible-playbook user.yml
PLAY [all] ****************************************************************
TASK: [Check for single host] *********************************************
failed: [alice] => {"failed": true}
msg: Single host check failed.
failed: [bob] => {"failed": true}
msg: Single host check failed.
FATAL: all hosts have already failed -- aborting
在单个主机上运行 playbook
$ ansible-playbook user.yml --limit=alice
PLAY [all] ****************************************************************
TASK: [Check for single host] *********************************************
skipping: [alice]
TASK: [debug msg='I got executed!'] ***************************************
ok: [alice] => {
"msg": "I got executed!"
}
IMHO 有一个更方便的方法。由于vars_prompt
,您确实可以交互式地提示用户他想要应用 playbook 的机器:
---
- hosts: "{{ setupHosts }}"
vars_prompt:
- name: "setupHosts"
prompt: "Which hosts would you like to setup?"
private: no
tasks:
[…]
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(6条)