Dependencies 具有用户定义条件的可分解依赖

Dependencies 具有用户定义条件的可分解依赖,dependencies,ansible,meta,Dependencies,Ansible,Meta,我想在playbook依赖项中添加一个角色,但这取决于条件 - name: Get all install pyenv versions command: '{{ pyenv_root }}bin/pyenv versions' register: available_versions tags: - get_pyenv_versions environment: PYENV_ROOT: "{{ pyenv_root }}" dependencies:

我想在playbook依赖项中添加一个角色,但这取决于条件

- name: Get all install pyenv versions
  command: '{{ pyenv_root }}bin/pyenv versions'
  register: available_versions
  tags:
      - get_pyenv_versions
  environment:
      PYENV_ROOT: "{{ pyenv_root }}"

dependencies:
    - { role: pyenv, python_versions: ["{{ mypython_version }}"], when: "mypython_version not in available_versions.stdout" }
我想做的是,我想检查所有可用的
pyenv
版本,如果
mypython\u version
不可用,那么我只想调用
pyenv
角色,否则我不想调用它

它给了我语法错误

ERROR! Syntax Error while loading YAML.


The error appears to have been in '/root/ansible_playbooks/roles/mydeployment/meta/main.yaml': line 9, column 1, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


dependencies:
^ here

exception type: <class 'yaml.parser.ParserError'>
exception: while parsing a block collection
  in "<unicode string>", line 1, column 1
did not find expected '-' indicator
  in "<unicode string>", line 9, column 1
错误!加载YAML时出现语法错误。
错误似乎出现在“/root/ansible_playbooks/roles/mydeployment/meta/main.yaml”中:第9行第1列,但可能是
根据确切的语法问题,在文件中的其他位置。
令人不快的一行似乎是:
依赖项:
^这里
异常类型:
异常:在分析块集合时
在“”中,第1行第1列
未找到预期的“-”指示器
在“”中,第9行第1列

如何定义变量
get_pyenv\u versions
并在我的
依赖项中使用作为条件?

要正确定义角色中的依赖项,您必须:

在您的角色下定义您的/meta/main.yml依赖项:

dependencies:
  - role: pyenv
    when: mypython_version not in versions
您必须从您的角色中调用您的角色:

---
- name: Role Dependency
  hosts: localhost
  gather_facts: False

tasks:
  - name: Get all install pyenv versions
    command: '{{ pyenv_root }}bin/pyenv versions'
    register: available_versions
    environment:
      PYENV_ROOT: "{{ pyenv_root }}"

roles:
  - role: mydeployment
    pyenv_version : "{{ mypython_version }}"
    versions      : "{{ available_versions.stdout }}"
我的沙盒中的另一个示例:

---
- name: Role Dependency
  hosts: localhost
  gather_facts: False

  roles:
  - role: role2
    role1 : "Heyr"
元:

结果:

PLAY [Role Dependency] *******************************************************************************************************

TASK [role1 : Debug] *********************************************************************************************************
skipping: [localhost]

TASK [role2 : Debug] *********************************************************************************************************
ok: [localhost] => {
    "msg": "Hello2"
}
但当变量是好的:

---
- name: Role Dependency
  hosts: localhost
  gather_facts: False

  roles:
  - role: role2
    role1 : "Heyr"
结果:

TASK [role1 : Debug] *********************************************************************************************************
ok: [localhost] => {
    "msg": "Hello1"
}

TASK [role2 : Debug] *********************************************************************************************************
ok: [localhost] => {
    "msg": "Hello2"
}

希望它有助于

正确定义角色中的依赖关系,您必须:

在您的角色下定义您的/meta/main.yml依赖项:

dependencies:
  - role: pyenv
    when: mypython_version not in versions
您必须从您的角色中调用您的角色:

---
- name: Role Dependency
  hosts: localhost
  gather_facts: False

tasks:
  - name: Get all install pyenv versions
    command: '{{ pyenv_root }}bin/pyenv versions'
    register: available_versions
    environment:
      PYENV_ROOT: "{{ pyenv_root }}"

roles:
  - role: mydeployment
    pyenv_version : "{{ mypython_version }}"
    versions      : "{{ available_versions.stdout }}"
我的沙盒中的另一个示例:

---
- name: Role Dependency
  hosts: localhost
  gather_facts: False

  roles:
  - role: role2
    role1 : "Heyr"
元:

结果:

PLAY [Role Dependency] *******************************************************************************************************

TASK [role1 : Debug] *********************************************************************************************************
skipping: [localhost]

TASK [role2 : Debug] *********************************************************************************************************
ok: [localhost] => {
    "msg": "Hello2"
}
但当变量是好的:

---
- name: Role Dependency
  hosts: localhost
  gather_facts: False

  roles:
  - role: role2
    role1 : "Heyr"
结果:

TASK [role1 : Debug] *********************************************************************************************************
ok: [localhost] => {
    "msg": "Hello1"
}

TASK [role2 : Debug] *********************************************************************************************************
ok: [localhost] => {
    "msg": "Hello2"
}


希望它有助于

不熟悉角色依赖关系,但上面说:
角色依赖关系允许您在使用角色时自动引入其他角色。如上所述,角色依赖关系存储在角色目录中包含的meta/main.yml文件中。此文件应包含要在指定角色之前插入的角色和参数的列表,例如下面的示例。
您似乎已在任务之后添加了它。同样,不熟悉该功能,希望它能帮助您了解
include_role
module?@ilias sp感谢您的评论,但我们可以在
dependencies
中提供条件。我只想知道,如何使用用户定义变量实现这一点。我们可以通过预定义的ansible变量来实现这一点。你能分享一下你在哪里添加每一段代码吗?不能将
meta
vars
混合使用。我猜你在
meta/main.yml
下有依赖关系,你是在从剧本中调用你与其他VAR的角色,不是吗?我正在构建我的剧本,现在,我只有上面给出的
mydeployment/meta/main.yaml
文件。所有其他角色目前都为空。不熟悉角色依赖关系,但说明:
角色依赖关系允许您在使用角色时自动拉入其他角色。如上所述,角色依赖关系存储在角色目录中包含的meta/main.yml文件中。此文件应包含要在指定角色之前插入的角色和参数的列表,例如下面的示例。
您似乎已在任务之后添加了它。同样,不熟悉该功能,希望它能帮助您了解
include_role
module?@ilias sp感谢您的评论,但我们可以在
dependencies
中提供条件。我只想知道,如何使用用户定义变量实现这一点。我们可以通过预定义的ansible变量来实现这一点。你能分享一下你在哪里添加每一段代码吗?不能将
meta
vars
混合使用。我猜你在
meta/main.yml
下有依赖关系,你是在从剧本中调用你与其他VAR的角色,不是吗?我正在构建我的剧本,现在,我只有上面给出的
mydeployment/meta/main.yaml
文件。现在所有其他任务都是空的。我必须将
任务
角色
放在我的
mydeployment/tasks/main.yaml
中。不,使用主剧本来编排角色。IE:有一个剧本目录和角色目录。从剧本中,你将有任何剧本来完成任何任务。该剧本将调用符合soooo标准的角色,您将能够在您编写的每个剧本中使用这些角色。将角色视为标准行动,您将根据特定原因调用该行动。一个角色只不过是一个在目录中拆分的剧本,有一些更强大的功能(比如依赖项),我有
mydeployment.yaml
playbook,它有
-hosts:myhosts角色:-common-mydeployment
有没有办法在
mydeployment/tasks
中添加这个功能?这样我就只有
任务了。不,这就是ansible的工作方式。你必须把剧本称为可接受的标准。如果您想直接进入该角色,您可以选择其他“非标准”解决方案,例如:是的,您有pre和post_任务。抱歉耽搁了。我必须将
任务
角色
放入我的
mydeployment/tasks/main.yaml
?不,请使用主剧本来编排角色。IE:有一个剧本目录和角色目录。从剧本中,你将有任何剧本来完成任何任务。该剧本将调用符合soooo标准的角色,您将能够在您编写的每个剧本中使用这些角色。将角色视为标准行动,您将根据特定原因调用该行动。一个角色只不过是一个在目录中拆分的剧本,有一些更强大的功能(比如依赖项),我有
mydeployment.yaml
playbook,它有
-hosts:myhosts角色:-common-mydeployment
有没有办法在
mydeployment/tasks
中添加这个功能?这样我就只有
任务了。不,这就是ansible的工作方式。你必须把剧本称为可接受的标准。如果你想直接扮演这个角色,你可以选择其他角色