将包含的 ansible 任务作为独立任务运行

将包含的 ansible 任务作为独立任务运行

我有许多 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

要实现这一点,有两个要求:-

  1. 您要定位的主机必须位于清单文件中
  2. 您需要标记要运行的角色中的任务

    - 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_tasksinclude_role

笔记

  • ...
  • 该模块仍将被支持一段时间,但我们计划在不久的将来弃用它。

答案3

当然,你应该可以做类似的事情:

$ ansible-playbook foo.yml -i hosts -u user --limit host.example.com

答案4

您可以创建一个清单并将变量分配给特定主机组的子集,然后根据定义的变量在满足此条件时使用要执行的任务下的条件。

相关内容