조건에 따라 변경 가능한 기본값


16

어떤 조건 (예 : 다른 변수의 값)에 따라 역할 변수 기본값을 변경할 수 있습니까?

세부

나는 명령에 대한 두 개의 관련 변수를 가지고 envcomposer_opts.

둘 다 기본값 ( env = "prod"composer_opts = "--no-dev") 으로 남아 있으면 모든 것이 정상입니다.

내가 변경하는 경우 envdev항상 모두를 설정해야하므로, 다른 하나의 기본은, 내 명령을 중단합니다. 사용자 정의 스크립트 / if로 조건부 기본값을 설정하여 이것을 피할 수 있습니까?

중요 : 항상composer_opts 값에 따라 값을 설정하고 싶지 않습니다 env. 아직 설정되지 않은 경우에만 설정하고 싶습니다 (예 : 동적 기본값).

의사 코드

나는 이와 같은 것을하고 싶다. (다음 코드는 유효하지 않고 의사 코드는 내 필요를 표현하기 위해)

---
# defaults/main.yml

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

답변:


12

이 솔루션을 제안합니다.

---
 - 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   

1
이것은 솔루션의 일부입니다. "dev"일 composer_opts때는 항상 빈 문자열로 설정 되어 env실제 값 세트를 덮어 씁니다. 조건부를 다음과 같이 확장해야한다고 생각합니다 when: "{{env}}" == 'dev' and "{{composer_opts}}" is undefined. 좋아 보인다? 그에 따라 질문을 수정할 수 있습니까?
프란체스코 아 베니

composer_opts는 기본값을 갖기 때문에 정의됩니다. 과제를 해결하려면 다른 표현이 필요합니다. 예를 들어 변수 custom_composer_opts입니다.
Navern

의사 코드를 사용하여 수행하려는 작업을 자세히 설명하십시오. 이에 따라 답변을 업데이트하겠습니다.
Navern

추가 설명과 의사 코드 샘플로 질문을 업데이트했습니다. 감사합니다.
프란체스코 아 베니

내 답변을 업데이트했습니다. 확인해 봐. 나는 당신이 필요한 것을 이해했다고 생각합니다.
Navern

4

@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'

또한 이 블로그 게시물 이 본질적으로 동일한 접근 방식을 따르는 것이 유용하다는 것을 알았 습니다 .


@sec |대신 사용 >하면 공백 문제가 없을 수 있습니다. (또는 더 많은 것을 얻을 수 있습니다.)
Michael

@sec '>-'를 사용하고 가능한 사양을 확인하십시오. 여러 줄 문자열을 올바르게 조작하기위한 많은 옵션이 있습니다. yaml-multiline.info 특히 블록 쵸핑 표시기입니다.
DylanYoung

이 솔루션에도 우선 순위 문제가있었습니다. 사실은 기본값이 아닙니다.
DylanYoung

2

하나의 라이너의 조건에 따라 가능한 set_fact :

- name: "set composer_opts based on environment"
  set_fact:
     composer_opts:  "{{ '--no-dev --optimize-autoloader --no-interaction' if (env == 'prod') else '' }}"

다른 솔루션과 동일한 우선 순위 문제 (사실은 기본값이 아님)이지만이 조건을 defaults.yml 파일에 넣으면이 솔루션이 작동합니다. 조건에 따라 여러 가지 기본값이있는 경우 정말 추악합니다.
DylanYoung
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.