本地 ansible-playbook 使用 vars 作为角色运行 playbook

Mik*_*ike 2 ansible

我对 ansible 很陌生,所以我可能会设置错误。我的想法是我有某些类别的服务器。(例如监视器、网络、数据库)

我想对它们运行本地 ansible 运行,所以我的监视器播放看起来像

---

# plays/monitor.yaml

- hosts: mongo
  connection: local
  hosts: localhost
  become: yes
  become_user: root
  roles:
    - ../roles/users
    - ../roles/monitor
  vars:
    sensu_install_client: true
    sensu_install_server: true
Run Code Online (Sandbox Code Playgroud)

我的roles/monitor/tasks/main.yml样子

---

# roles/monitor/tasks/main.yaml

- include: common.yml

- include: server.yml
  when: sensu_install_server

- include: client.yml
  when: sensu_install_client
Run Code Online (Sandbox Code Playgroud)

我希望能够传入 vars,因此包含将发生在角色中。所以当我设置我的 api 实例时,我可以做类似的事情

vars:
   sensu_install_client: true
Run Code Online (Sandbox Code Playgroud)

在剧中,它只会包含来自监视器角色的 client.yml。

udo*_*dan 6

我不清楚为什么这不起作用。我看不出有什么问题。但让我给你一些一般性建议,也许这也会对你有所帮助。

最佳做法是将您的剧本放在根级别。看看这个结构。通过该设置,您无需指定角色的路径,因为 Ansible 会自动期望roles与剧本相关的目录中的角色。那么你在剧本中的角色部分就干净多了:

roles:
  - users
  - monitor
Run Code Online (Sandbox Code Playgroud)

您可以使用另外两种方法,而不是定义全局变量来触发角色内部的操作。

1.角色参数

角色可以有参数。如果要传递参数,只需将其转换为字典:

roles:
  - users
  - role: monitor
    sensu_install_client: true
    sensu_install_server: true
Run Code Online (Sandbox Code Playgroud)

变量sensu_install_clientand sensu_install_serverthen 仅在角色中可用monitor。这更简洁一点,也让任何人都清楚这些变量将用于此角色,而不是users角色。

2. 标签

标签实际上是如何触发剧本/角色的特定部分的方式。标签虽然是从命令行传递的,而不是由剧本中的硬编码变量传递的。想象一下你的角色main.yml是这样的:

---

# roles/monitor/tasks/main.yaml

- include: common.yml
  tags: always

- include: server.yml
  tags: server

- include: client.yml
  tags: client
Run Code Online (Sandbox Code Playgroud)

标签always很特别,将运行标记的任务......好吧你猜对了......总是如此。

现在你可以这样调用你的剧本:

ansible-playbook monitor.yml --tags server
Run Code Online (Sandbox Code Playgroud)

或者

ansible-playbook monitor.yml --tags client
Run Code Online (Sandbox Code Playgroud)

或者,如果您想同时运行两者,您甚至可以这样做:

ansible-playbook monitor.yml --tags "client,server"
Run Code Online (Sandbox Code Playgroud)

如果您使用它,请不要忘记相应地标记您的用户角色,否则它根本不会运行。

如果你不指定任何--tags所有任务都被执行,如果你想过滤特定的标签你可以使用该--skip-tags选项

ansible-playbook monitor.yml --skip-tags "server"
Run Code Online (Sandbox Code Playgroud)

您甚至可以过滤 always 标签。

ansible-playbook monitor.yml --tags "server" --skip-tags "always"
Run Code Online (Sandbox Code Playgroud)