首页 > 解决方案 > 如何覆盖 Ansible playbook 中的某些特定变量值

问题描述

我有一些从 nexus 下载的多个战争文件,并在我的远程主机上创建相应的应用程序文件夹并复制文件。现在有 2 个文件的名称与 war 文件不同,但需要创建一个不同名称的目录。我现在正在做的是这个——

- name: Ensuring the web deployment folder is created on tomcat nodes for each web application
   file:
     path: "{{tomcat_server_release_location}}/Release{{my_release_version}}/{{item}}"
     state: directory
     mode: 0777
   with_items:
    - "{{ apps }}"

- name: Copying the release from Admin server to tomcat nodes
   copy: src={{admin_server_release_location}}/{{my_release_version}}/{{item}}-{{my_release_version}}.war dest={{tomcat_server_release_location}}/Release{{my_release_version}}/{{item}}
   with_items:
    - "{{ apps }}"

apps 变量是这样定义的 - webapps: ['test1','test2','test3','test4']。现在 test2 在它说 test2-web.war 的关系上有一个不同的名称,但在远程节点上,我必须创建一个名为 test2 的文件夹并将war文件复制到那里。

有没有办法通过使用某些条件或任何东西在剧本的运行时覆盖一些变量

标签: ansibleansible-inventory

解决方案


可以通过执行以下操作来覆盖变量:

- name: copy war
  copy:
    src: "{{ src_war | default('/path/to/my/war') }}"
    dest: "{{ dest_war | default(src_war) }}"

然后在运行时,您可以使用额外的变量、host/group_vars 或此处记录的任何其他方式设置变量 src_war 和 dest_war:https ://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html

在您的情况下,我认为设置 src & dest 映射会有所帮助:

- set_fact:
    apps:
      - {src: "test1"}
      - {src: "test2", dest: "test2-web"}
      - {src: "test3"}
      - {src: "test4"}

然后您可以使用此映射来实现您的目标:

- name: Ensuring the web deployment...
  file:
    path: {{ tomcat_server_release_location }}/Release{{ my_release_version }}/{{ item.src }}
    state: directory
    mode: 0777
  with_items: "{{ apps }}"

- name: Copying the release...
  copy:
    src: "{{ admin_server_release_location }}/{{ my_release_version }}/{{ item.src }}-{{ my_release_version }}.war"
    dest: "{{ tomcat_server_release_location }}/Release{{ my_release_version }}/{{ item.dest | default(item.src) }}"
  with_items: "{{ apps }}"

推荐阅读