将嵌套的 Ansible 变量传递到剧本清单文件中

Pass nested Ansible vars into playbook inventory file

我想知道是否可以在 运行 设置一个 ansible-playbook 时传入 --extra-vars 以便将变量注入我正在使用的清单文件 运行 我的剧本。

示例剧本

- name: "Create CI pipeline"
  hosts: all
  tasks:
  - name: "Create PreCodeReview jobs"
    tags:
      - jenkins
      - jenkins-jobs
    when: jenkins is defined
    local_action:
      module: jenkins_job
      url: "{{ jenkins.url }}"
      user: "{{ jenkins.username }}"
      token: "{{ jenkins.access_token }}"
      name: "{{ jenkins.component.name }}_PreCodeReview"
      config: "{{ lookup('template', '../templates/jenkins/add-pre-code-config.xml') }}"

  - name: "Create Release jobs"
    tags:
      - jenkins
      - jenkins-jobs
    when: jenkins is defined
    local_action:
      module: jenkins_job
      url: "{{ jenkins.url }}"
      user: "{{ jenkins.username }}"
      token: "{{ jenkins.access_token }}"
      name: "{{ jenkins.component.name }}_Release"
      config: "{{ lookup('template', '../templates/jenkins/add-release-config.xml') }}"

我希望在 运行 时传入 jenkins.component.name,我已尝试使用以下 jenkins.component.name=<name>"{'jenkins':{'component':{'name':<name>}}}"

这没有用。

这是我用来运行剧本

的清单

样品库存

all:
  hosts:
    local:
      ansible_host: 127.0.0.1
      ansible_connection: local
      project_name: magic_proj
      jenkins:
        url: https://my/jenkins
        username: admin
        access_token: f96hjfg54354b3e8512d491fb471fd
        keep_builds: 20
        components:
          - name: <repo_name>
            repository: <repo_url>

I am looking to pass in jenkins.component.name at run time, I have attempted this with the following jenkins.component.name=<name> and "{'jenkins':{'component':{'name':<name>}}}"

你非常接近:--extra-vars 想要 key=value 对,JSON,YAML,或 @./some/fileas specified in the fine manual

很遗憾,您提供的是Python语法,而不是JSON语法;如果您将命令行更改为 --extra-vars '{"jenkins":{"component":{"name":<name>}}}'

更新: 然而,即使这样也有一个问题:对于 dict 结构,ansible 似乎不会 merge inventory dicts 和 extra-var dicts,因此您需要选择 "flat" extra-var 名称(例如 almost 您还尝试过的名称:--extra-vars '{"jenkins_component_name": ""}')或手动合并剧本中的结构(可能通过 pre_tasks: 或类似的方式)