【问题标题】:Ansible - Use when condition in a playbook for rolesAnsible - 在角色剧本中使用条件
【发布时间】:2020-04-29 19:10:48
【问题描述】:

我正在尝试在我的 ansible-playbook 中添加 when 条件。但是,我无法弄清楚执行此操作的确切语法/方法,因为我的角色正在使用其他参数。下面提到的是我的剧本

---

- name: Deploying application code
  hosts: uat-aegis

  roles:
    - { role: roles/send_slack, slack_message_text: "*`Started : Deploying code for {{ module_name }} on {{ inventory_hostname }}`*"}
    - { role: roles/application_code_backup, backup_directory_name: "NAME", repo_directory: "/path/to/repo" }
    - { role: roles/application_copy_config, repo_directory: "/path/to/repo"}
    - { role: roles/application_git_pull, repo_url: "git@code.git", repo_directory: "/path/to/repo", branch_name: "BRANCH_NAME"}
    - { role: roles/application_pm2_restart, process_name: "NAME" }
    - { role: roles/send_slack, slack_message_text: "*`=== Completed : Deploying code for {{ module_name }} on {{ inventory_hostname }} ===`*"}

这里我只需要在某个变量值为真时才执行roles/application_copy_config。在从 Jenkins(执行脚本中的布尔值参数)执行 ansible-playbook 时,此变量值作为 --extra-vars 传递。我已经尝试使用下面的代码,但它不起作用。

---

- name: Deploying application code
  hosts: uat-aegis

  roles:
    - { role: roles/send_slack, slack_message_text: "*`Started : Deploying code for {{ module_name }} on {{ inventory_hostname }}`*"}
    - { role: roles/application_code_backup, backup_directory_name: "NAME", repo_directory: "/path/to/repo" }
    - { role: roles/application_copy_config
      when: "copy_config=true", repo_directory: "/path/to/repo"}
    - { role: roles/application_git_pull, repo_url: "git@code.git", repo_directory: "/path/to/repo", branch_name: "BRANCH_NAME"}
    - { role: roles/application_pm2_restart, process_name: "NAME" }
    - { role: roles/send_slack, slack_message_text: "*`=== Completed : Deploying code for {{ module_name }} on {{ inventory_hostname }} ===`*"}

ansible-playbook 命令如下

ansible-playbook plays/deploy_application/code.yml --extra-vars "module_name=$MODULE_NAME config_copy_path=$CURRENT_PATH/ env=$ENVIRONMENT copy_config=$COPY_CONFIG"

请帮助我在 ansible-playbook 中使用 when 条件。这是必需的,因为我需要执行角色:roles/application_copy_config 仅当变量值为 true 时。我使用this reference 在角色中添加条件

【问题讨论】:

  • when: copy_config | bool 应该可以完成这项工作。
  • @Zeitounator 当我在传递变量 repo_directory 的值时,我无法在角色中使用 when 获得正确的语法。你能用我提到的整个 ansible-playbook 更新我的答案吗?
  • 如果您能提供您遇到的确切错误,帮助您会容易得多。您可以发布更短的MCVE,而不是发布您的整个剧本,而只是复制您的确切问题。
  • @Zeitounator 感谢您的帮助,我能够使用 bool 过滤器应用条件。

标签: ansible


【解决方案1】:

能够使用下面提到的 bool 过滤器为布尔值应用 when 条件

---

- name: Deploying application code
  hosts: uat-aegis

  roles:
    - { role: roles/send_slack, slack_message_text: "*`Started : Deploying code for {{ module_name }} on {{ inventory_hostname }}`*"}
    - { role: roles/application_code_backup, backup_directory_name: "NAME", repo_directory: "/path/to/repo", when: var1 | bool }
    - { role: roles/application_copy_config, repo_directory: "/path/to/repo"}
    - { role: roles/application_git_pull, repo_url: "git@code.git", repo_directory: "/path/to/repo", branch_name: "BRANCH_NAME", when: var2 | bool}
    - { role: roles/application_pm2_restart, process_name: "NAME", when: not var3 | bool }
    - { role: roles/send_slack, slack_message_text: "*`=== Completed : Deploying code for {{ module_name }} on {{ inventory_hostname }} ===`*"}

使用下面的代码检查真假

when: var1 | bool ----> true
when: not var2 | bool ----> false

【讨论】:

  • 有趣的方法,谢谢。但是 AFAIK 执行此操作的默认方式是在游戏的任务部分中包含角色,或者在角色内部实现有条件的逻辑(因为角色旨在封装尽可能多的逻辑)。
猜你喜欢
  • 2015-11-13
  • 1970-01-01
  • 2015-07-31
  • 2022-10-24
  • 1970-01-01
  • 2016-04-13
  • 2021-11-09
  • 1970-01-01
  • 2020-12-27
相关资源
最近更新 更多