Передайте вложенные Ansible vars в файл инвентаря playbook - PullRequest
0 голосов
/ 24 октября 2019

Мне интересно, можно ли передать --extra-vars при запуске ansible-playbook, чтобы вставить переменные в файл инвентаря, который я использую для запуска моей playbook.

образец playbook

- 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 Ответ

1 голос
/ 25 октября 2019

Я хочу передать jenkins.component.name во время выполнения, я попытался сделать это со следующими jenkins.component.name=<name> и "{'jenkins':{'component':{'name':<name>}}}"

Вы были очень близки: --extra-vars хочет либо key=value пар, JSON, YAML или @./some/file, , как указано в прекрасном руководстве

К сожалению, вы предоставили синтаксис Python ,а не JSON синтаксис;если вы измените свою командную строку на --extra-vars '{"jenkins":{"component":{"name":<name>}}}'

update: Однако даже в этом есть проблема: похоже, что для dict структур, ansible не merge инвентарь dict с и extra-var dict с, поэтому вам нужно будет либо выбрать "плоское" extra-var имя (например, почти , что вы также пытались: --extra-vars '{"jenkins_component_name": ""}') иливручную объединить структуры в вашей книге игр (возможно, через pre_tasks: или подобное)

...