如何编写可指定任意版本的Elasticsearch安装Ansible Playbook
如何让Ansible Playbook支持指定任意版本的Elasticsearch安装
你之前用多变量的方式不够灵活,新增版本就得修改变量文件,下面是两种更合理的实现方案,核心是用单一动态变量控制版本,让用户能自主指定。
方案一:直接支持任意版本前缀/具体版本(推荐)
这个方案允许用户运行Playbook时直接传入目标版本,无需修改文件,灵活性最高。
修改后的Playbook:
- name: Install Elasticsearch with custom version hosts: <myhost> vars: # 默认安装7.x,用户可通过命令行覆盖 es_version: "7.x" # 可选:需要安装具体小版本时,通过命令行传入该变量 es_package_version: "" tasks: - name: Import Elasticsearch PGP Key shell: wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - args: warn: no changed_when: false # 避免每次运行都标记为"已变更" - name: Add Elasticsearch repository copy: dest: "/etc/apt/sources.list.d/elastic-{{ es_version }}.list" content: | deb https://artifacts.elastic.co/packages/{{ es_version }}/apt stable main register: repo_update - name: Update apt cache only when repo changes apt: update_cache: yes when: repo_update.changed - name: Install Elasticsearch (specific version if provided) apt: name: "elasticsearch{% if es_package_version %}={{ es_package_version }}{% endif %}" state: present
使用示例:
- 安装默认7.x版本:
ansible-playbook your-playbook.yml - 安装6.x版本:
ansible-playbook your-playbook.yml -e "es_version=6.x" - 安装具体小版本(比如7.17.20):
ansible-playbook your-playbook.yml -e "es_version=7.x" -e "es_package_version=7.17.20"
方案二:预设常用版本,通过大版本号选择
如果想限制用户从预设版本中选择,可以用变量文件定义常用版本,再通过大版本号匹配。
1. 版本变量文件(version_var.yaml):
es_version_map: 6: "6.x" 7: "7.x" 8: "8.x"
2. 修改后的Playbook:
- name: Install Elasticsearch with preset version hosts: <myhost> vars_files: - version_var.yaml vars: # 用户指定大版本号(6/7/8),默认7 es_major_version: 7 es_package_version: "" tasks: - name: Resolve full version prefix from major version set_fact: es_version: "{{ es_version_map[es_major_version | string] }}" - name: Import Elasticsearch PGP Key shell: wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - args: warn: no changed_when: false - name: Add Elasticsearch repository copy: dest: "/etc/apt/sources.list.d/elastic-{{ es_version }}.list" content: | deb https://artifacts.elastic.co/packages/{{ es_version }}/apt stable main register: repo_update - name: Update apt cache only when repo changes apt: update_cache: yes when: repo_update.changed - name: Install Elasticsearch (specific version if provided) apt: name: "elasticsearch{% if es_package_version %}={{ es_package_version }}{% endif %}" state: present
使用示例:
安装8.x版本:
ansible-playbook your-playbook.yml -e "es_major_version=8"
关键改进点:
- 用单一变量
es_version统一控制仓库配置,避免多变量维护麻烦 - 同时支持版本前缀(如
6.x)和具体小版本(如7.17.20)两种安装方式 - 仅在仓库文件变更时更新apt缓存,提升执行效率
- 密钥导入任务添加
changed_when: false,避免不必要的变更标记
内容的提问来源于stack exchange,提问作者Bishal Neopaney
相关产品推荐
相关产品推荐

