Ansible if else 使用 shell 脚本

Ansible if else using shell script

我正在使用以下 ansible 任务来根据用户的选择触发某些任务。

这是有效的:

tasks:
  - name: Run python script for generating Repos Report
    command: python GetRepos.py -o {{ org }} -p {{ pat }}
    register: result
  - debug: msg="{{result.stdout}}"
    when: choice == "Repos"

  - name: Run python script for generating projects Report
    command: python Getprojects.py -o {{ org }} -p {{ pat }}
    register: result
  - debug: msg="{{result.stdout}}"
    when: choice == "projects"

但我想在一个任务中使用带有 if else 语句的 shell 脚本 运行 如下:

tasks:
   - name: run python script
     shell: |
       if [choice == "repos"]
       then
       cmd: python GetRepos.py -o {{ org }} -p {{ pat }} 
       elif [choice == "projects"]
       then
       cmd: python Getprojects.py -o {{ org }} -p {{ pat }}         
       fi
    register: cmd_output
  - debug: msg="{{cmd_output.stdout}}"

但这并没有执行任务;它只是没有错误地结束。

这是 shell 的正确语法吗?

如何使用 shell 模块在一个任务中完成这两个独立的工作任务?

shell 脚本中的 cmd: 会尝试将 运行 cmd: 作为命令,这是您不想要的。

此外,if 语句条件两边都需要空格 - 否则,它会尝试将 运行 [choice 作为命令,这也是您不想要的。

也更喜欢使用单等号而不是双等号,以使其更便携(远程主机可以有各种不同的 shell!)。

另一个问题是 shell 脚本中使用的 choice 只是一个文字字符串。您需要添加大括号 {{ }} 来插入值,就像剧本中其他地方所做的那样。

考虑到上述情况,以下内容应该适合您:

tasks:
  - name: run python script
    shell: |
      if [ "{{ choice }}" = "repos" ]
      then
          python GetRepos.py -o "{{ org }}" -p "{{ pat }}"
      elif [ "{{ choice }}" = "projects" ]
      then
          python Getprojects.py -o "{{ org }}" -p "{{ pat }}"
      fi
    register: cmd_output
  - debug:
      msg: "{{ cmd_output.stdout }}"