AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 715769
Accepted
Francesco Abeni
Francesco Abeni
Asked: 2015-08-22 02:43:02 +0800 CST2015-08-22 02:43:02 +0800 CST 2015-08-22 02:43:02 +0800 CST

Ansible 根据条件更改默认值

  • 772

是否可以根据某些条件(即另一个变量的值)更改角色变量的默认值?

细节

我有两个相关的命令变量,env和composer_opts.

如果两者都保留为默认值 (env = "prod"和composer_opts = "--no-dev"),一切正常。

如果我更改env为dev,另一个默认值会破坏我的命令,所以我总是需要同时设置两者。是否可以通过使用自定义脚本/ if 设置条件默认值来避免这种情况?

重要提示:我不想总是composer_opts根据值设置env值。我只想在尚未设置的情况下设置它(即动态默认值)。

伪代码

我想做这样的事情(以下代码无效,只是伪代码来表达我的需要)

---
# defaults/main.yml

env: prod
composer_opts: 
    when: "{{env}}" = 'prod'
        '--no-dev --optimize-autoloader --no-interaction'
    when: "{{env}}" = 'dev'
        '' 
ansible
  • 4 4 个回答
  • 79593 Views

4 个回答

  • Voted
  1. Best Answer
    Navern
    2015-08-22T02:46:32+08:002015-08-22T02:46:32+08:00

    我建议这个解决方案:

    ---
     - set_fact:
         composer_opts: ""
       when: "{{env}}" == 'dev'
    

    当变量等于' '时,它将composer_opts变量设置为字符串。""envdev

    以下是基于更新问题的剧本示例:

    $ cat test.yml
    
    ---
    - hosts: 127.0.0.1
      connection: local
      tasks:
      - set_fact:
          composer_opts: "{% if env == 'prod' %} '--no-dev --optimize-autoloader --no-interaction' {% else %} '' {% endif %}"
    
      - debug: var=composer_opts
    

    样本输出:

    sudo ansible-playbook test.yml -e env=dev
    
    PLAY [127.0.0.1] ************************************************************** 
    
    GATHERING FACTS *************************************************************** 
    ok: [127.0.0.1]
    
    TASK: [set_fact ] ************************************************************* 
    ok: [127.0.0.1]
    
    TASK: [debug var="{{composer_opts}}"] ***************************************** 
    ok: [127.0.0.1] => {
        "var": {
            " '' ": " '' "
        }
    }
    
    PLAY RECAP ******************************************************************** 
    127.0.0.1                  : ok=3    changed=0    unreachable=0    failed=0   
    
    
    sudo ansible-playbook test.yml -e env=prod
    
    PLAY [127.0.0.1] ************************************************************** 
    
    GATHERING FACTS *************************************************************** 
    ok: [127.0.0.1]
    
    TASK: [set_fact ] ************************************************************* 
    ok: [127.0.0.1]
    
    TASK: [debug var="{{composer_opts}}"] ***************************************** 
    ok: [127.0.0.1] => {
        "var": {
            " '--no-dev --optimize-autoloader --no-interaction' ": " '--no-dev --optimize-autoloader --no-interaction' "
        }
    }
    
    PLAY RECAP ******************************************************************** 
    127.0.0.1                  : ok=3    changed=0    unreachable=0    failed=0   
    
    • 14
  2. ssc
    2016-12-10T06:30:05+08:002016-12-10T06:30:05+08:00

    虽然@Navern 的回答确实有效,但我发现嵌入的 Jinja2 符号 ( "{% if env == 'prod' %} ...) 极易受到符号的影响,因此相当脆弱。例如,当包装有问题的行以获得更好的可读性时,例如在这个未经测试的代码中:

    composer_opts: >
                   "{% if env == 'prod' %}
                       '--no-dev --optimize-autoloader --no-interaction'
                    {% else %}
                       ''
                    {% endif %}"
    

    我最终得到了意想不到的结果,例如额外的空格或\n.composer_opts

    我使用的方法更笨,但也更稳定:

    - name: set composer_opts for dev env
      set_fact:
         composer_opts: ''
         when: "{{env}}" == 'dev'
    
    - name: set composer_opts for prod env
      set_fact:
         composer_opts: '--no-dev --optimize-autoloader --no-interaction'
         when: "{{env}}" == 'prod'
    

    我还发现这篇博客文章很有用,它基本上遵循相同的方法。

    • 5
  3. S.K. Venkat
    2018-05-08T05:42:21+08:002018-05-08T05:42:21+08:00

    Ansible set_fact 基于一个衬里的条件:

    - name: "set composer_opts based on environment"
      set_fact:
         composer_opts:  "{{ '--no-dev --optimize-autoloader --no-interaction' if (env == 'prod') else '' }}"
    
    • 3
  4. Claudio Lazaro
    2022-05-05T14:17:18+08:002022-05-05T14:17:18+08:00
    - name: 
    

    设置事实:路径安装:| {% if reportviewer_state == 'absent' and reportviewer_handler[reportviewer_package].name == 'ReportViewer_2010.exe' %} C:\Windows\System32\msiexec.exe {% else %} {{ url_base_repository }}{{ reportviewer_handler[reportviewer_package ].name }} {% endif %}

    • 名称:“安装 {{ reportviewer_handler[reportviewer_package].name }}” win_package:路径:“{{ path_install | replace('\n', '') }}” 状态:“{{ reportviewer_state }}” product_id:“{ { reportviewer_handler[reportviewer_package].product_id }}" 参数:"{{ reportviewer_handler[reportviewer_package].arguments }}"
    • 0

相关问题

  • Ansible 剧本,使用选项 --disabled-login 创建用户

  • ansible playbook,操作系统不同的用户

  • ansible:为什么文件模块会跳过?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve