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

时间:2019-10-24 07:51:15

标签: ansible jinja2 ansible-inventory

我想知道在运行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>

1 个答案:

答案 0 :(得分:1)

  

我希望在运行时传递jenkins.component.name,我尝试使用以下jenkins.component.name=<name>"{'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不会合并库存dictextra-var dict s,因此,您将需要选择一个“扁平的” extra-var名称(例如,您尝试尝试的{em> {em} 几乎是)或在您的剧本中手动将这些结构合并在一起(也许通过--extra-vars '{"jenkins_component_name": ""}'或类似的方式