基于文件创建月份复制补丁文件至对应季度目录的Ansible脚本疑问
问题
需要将当月的补丁文件复制到指定季度目录,月份与季度目录对应关系如下:
| 月份范围 | 季度目录 |
|---|---|
| 1月至3月 | {{patch_oracle_qdir}}/Q1 |
| 4月至6月 | {{patch_oracle_qdir}}/Q2 |
| 7月至9月 | {{patch_oracle_qdir}}/Q3 |
| 10月至12月 | {{patch_oracle_qdir}}/Q4 |
我编写了一段使用ternary运算符确定季度目录的Ansible脚本,尚未测试,想咨询:使用ternary运算符是否可行,还是应该改用with_together循环?
脚本代码:
- name: DETERMINE QUARTER DIRECTORY set_fact: patch_oracle_qdir: "{{ansible_date_time.month == 08 or ansible_date_time.month == 09 or ansible_date_time.month == 10 | ternary(patch_oracle_base/Q3, patch_oracle_base/Q4) }}" #with_together: # - "{{Q1}}" # - "{{Q2}}" # - "{{Q3}}" # - "{{Q4}}" - name: COPY THE PATCH FILE INTO TARGET SERVER ORACLE synchronize: src: {{files_base_dir}}" dest: "{{patch_oracle_qdir}}" owner: yes group: yes mode: push register: extract_patch_oracle
回答
首先你的ternary写法有问题,无法正确工作,问题点包括:
- 运算符优先级错误:
or的优先级低于|,表达式会先执行ansible_date_time.month == 10 | ternary(...),完全偏离预期逻辑 - 覆盖范围不全:条件只判断了8、9、10月,完全没处理1-7月、11-12月的情况
- 路径语法错误:
patch_oracle_base/Q3未用引号包裹成字符串,正确写法应为"{{patch_oracle_base}}/Q3"
另外,with_together完全没必要,这个循环用于合并多个列表,和当前需求不匹配。
推荐两种更可靠的实现方案:
方案1:通过数学计算推导季度
利用月份数值直接计算季度,逻辑简洁清晰:
- name: 确定季度目录 set_fact: patch_oracle_qdir: "{{ patch_oracle_base }}/Q{{ ((ansible_date_time.month | int - 1) // 3) + 1 }}" - name: 复制补丁文件到目标Oracle服务器 synchronize: src: "{{ files_base_dir }}" dest: "{{ patch_oracle_qdir }}" owner: yes group: yes mode: push register: extract_patch_oracle
原理:将月份转为整数后,减1再除以3取整,最后加1即可得到对应季度(例如:1月 → (1-1)//3=0 → 0+1=1 → Q1;8月 → (8-1)//3=2 → 2+1=3 → Q3)
方案2:通过列表映射匹配季度
如果需要更直观的对应关系,可以用列表定义月份与季度的映射:
- name: 确定季度目录 set_fact: patch_oracle_qdir: >- {{ patch_oracle_base }}/Q{{ ['1','1','1','2','2','2','3','3','3','4','4','4'][ansible_date_time.month | int - 1] }} - name: 复制补丁文件到目标Oracle服务器 synchronize: src: "{{ files_base_dir }}" dest: "{{ patch_oracle_qdir }}" owner: yes group: yes mode: push register: extract_patch_oracle
原理:列表索引从0开始,月份减1后对应列表中的季度值,直接取值即可。
最后注意:原synchronize模块中src: {{files_base_dir}}"存在引号不匹配的语法错误,需修正为src: "{{ files_base_dir }}"。
内容的提问来源于stack exchange,提问作者RobJose
相关产品推荐
相关产品推荐

