我有许多 Ansible 剧本,它们将包含在更大的剧本中。例如:
---
- name: Add user me
user: name=me comment="Me" uid=9999 groups=somegroup
- name: Add my ssh public key
authorized_key: user=me key="{{ lookup('file', 'id_rsa.pub') }}"
有没有办法传递主机名并从命令行将其作为独立任务运行,或者我是否需要创建另一个剧本来自行运行这两个任务?
答案1
要实现这一点,有两个要求:-
- 您要定位的主机必须位于清单文件中
您需要标记要运行的角色中的任务
- name: Add user me user: name=me comment="Me" uid=9999 groups=somegroup tags: this_role - name: Add my ssh public key authorized_key: user=me key="{{ lookup('file', 'id_rsa.pub') }}" tags: this_role
然后你可以:-
ansible-playbook foo.yml -i hosts -t this_role --limit host.example.com
这并不意味着仍在运行包含完整剧本的剧本,而是将运行的任务限制为仅与标签匹配的任务。其余任务将被跳过。
答案2
两个都用户和授权密钥ansible -m
是模块。因此您可以从任何脚本中调用它们
ansible all -i host.example.com, -m user -a 'name=me comment="Me" uid=9999 groups=somegroup'
ansible all -i host.example.com, -m authorized_key -a "user=me key=\"{{ lookup('file', 'id_rsa.pub') }}\""
请注意主机名后面的逗号。
另一种方法是使用include
或者include_tasks
如同
ansible all -i host.example.com, -m include_tasks -a /path/to/some/taskfile.yml
并使用包括角色看起来像
ansible all -i localhost, -c local --playbook-dir /path/to/roles -m include_role -a name=test
虽然include
将来可能会被弃用(赞成include_tasks
或include_role
)
笔记
- ...
- 该模块仍将被支持一段时间,但我们计划在不久的将来弃用它。
答案3
当然,你应该可以做类似的事情:
$ ansible-playbook foo.yml -i hosts -u user --limit host.example.com
答案4
您可以创建一个清单并将变量分配给特定主机组的子集,然后根据定义的变量在满足此条件时使用要执行的任务下的条件。