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


16

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

세부

나는 명령에 대한 두 개의 관련 변수를 가지고 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'
        '' 

답변:


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.