我已经使用寄存器变量来存储任务的输出值,所以我在来自 ansible 角色的条件下使用相同的值

I have used register variable to store output values of task so i'm using same value in when condition from ansible role

---
- name: Check the apps list in ArgoCD server with related to cluster:"{{clustername.stdout}}"
  shell: |
        argocd app list | grep {{clusterip.stdout}} | grep {{proj_name}} | awk '{print }'
  register: applist
- debug:
     var: applist.stdout_lines
- name: Create xedge apps to production ns
  shell: |
     argocd app  create {{item}}-{{app_extention}} --project {{proj_name}} --repo {{gitops_url}} --revision HEAD --values {{values_file}}.yaml --path {{item}} --dest-namespace production --label app={{item}} --dest-server {{clusterip.stdout}}
  with_items:
          - "{{production_apps}}"
 #skip apps creation if apps are already existed
  when : "item-app_extention not in applist.stdout_lines"

'' 错误: 致命的:[本地主机]:失败! => {"msg": "条件检查 'item-app_extention not in applist.stdout_lines' 失败。错误是:意外的模板类型错误发生在 ({% if item-app_extention not in applist.stdout_lines %} True {% else %} False {% endif %}): - 不支持的操作数类型:'AnsibleUnsafeText' 和 'AnsibleUnicode'\n\nThe 错误似乎在 '/etc/ansible/roles/xedge/tasks/argocd_apps.yml' 中:第 8 行,第 3 列,但 may\nbe 位于文件的其他位置,具体取决于确切的语法问题。\n\nThe 违规行似乎是:\n\n var: applist.stdout_lines\n- name : 创建用于生产的 xedge 应用程序 ns\n ^ here\n"}

''

您正在尝试对字符串值执行替换,此处:

  with_items:
          - "{{production_apps}}"
 #skip apps creation if apps are already existed
  when : "item-app_extention not in applist.stdout_lines"

未加引号的变量名是变量引用。您尝试从 item 中减去 app_extention。我想你的意思是:

when: "item ~ '-' ~ app_extention not in applist.stdout_lines

其中 ~ 是字符串连接运算符。

或者使用 > 折叠块运算符来减少引号的混淆,这样我们就不会嵌套引号:

when: >
  item ~ '-' ~ app_extention not in applist.stdout_lines

或者使用字符串格式而不是连接:

when: >
  '%s-%s' % (item, app_extention) not in applist.stdout_lines