2017-12-05 21 views
0

원격 시스템의 등록 정보 파일에서 가져온 bash 환경 변수를 변환하려고합니다. 나는 set_fact하려고 그 후어떻게 set_fact와 with_together를 사용할 수 있습니까?

- name: Source Env Properties 
    shell: . <source utility> && (set -a posix ; set| sed 's,=.*,,') 
    register: variable_keys 

- shell: . <source utility> && (set -a posix ; set| sed 's,^.*=,,') 
    register: variable_values 

값/두 레지스터 변수에 키와 값을 등록하고 어떻게 내 변수 키를 소싱하고 있습니다 다음 with_together하고 여기에

set_fact를 사용하여 그들을 통해 루프를 시도하고있다 두 개의 등록 된 값을 사용합니다.

- name: set variables 
    set_fact: 
    "{{item.0}}:{{item.1}}" 
    with_together: 
    - "{{ variable_keys.stdout_lines }}" 
    - "{{ variable_values.stdout_lines }}" 

작업의 출력이 정상적으로 작동하는 것처럼 보이지만 이러한 변수를 사용하려고 할 때 정의되지 않았다고 말합니다.

아무도 왜 이것이 작동하지 않는지 말할 수 있습니까?

+0

난 당신이 너무 많은 당신의'set_fact' 블록에서 인용 한 것 같아요. "{{item.0}}"시도 : "{{item.1}}"'? – larsks

+0

@larsks 검색 결과가 없습니다. 내가 사실을 변수로 사용하려고 할 때까지 오류가 없습니다. –

답변

1

내 의견에 언급했듯이 첫 번째 문제는 set_fact 블록의 구문이 올바르지 않다는 것입니다. 이 경우 :

"{{item.0}}:{{item.1}}" 

이 아닌 하나의 문자열이 있습니다. 보이도록 수정해야합니다.

- name: set variables 
    set_fact: 
    "{{item.0}}": "{{item.1}}" 
    with_together: 
    - "{{ variable_keys.stdout_lines }}" 
    - "{{ variable_values.stdout_lines }}" 

그러나 문제의 절반 정도입니다. sed 표현식은 bash 함수 정의를 포함하기 때문에 구문 적으로 유효하지 않은 출력을 생성 할 수 있습니다. 즉, 내가 내 로컬 환경에서 첫 번째 명령을 실행하면, 출력은 다음과 같이 등 bash는 완료, 자식 프롬프트에 대한 쉘 기능의 모든 cruft에 포함 :

scl() 
{ 
    local CMD 
    if [ "$CMD" 
     eval "module [email protected]"; 
    else 
     /usr/bin/scl "[email protected]"; 
    fi 
} 

단지 ansible 깰 것 :

failed: [localhost] (item=[u"'", u"'"]) => {"changed": false, "failed": true, "item": ["'", "'"], "msg": "The variable name ''' is not valid. Variables must start with a letter or underscore character, and contain only letters, numbers and underscores."} 

콘텐츠를 필터링해야합니다.

FOO=bar 

그리고 내 작전에 내가있는 경우, 위의 후 :

- name: Source Env Properties 
    shell: . ./myvars.sh && (set -a posix; set| sed -n '/^[A-Z]/ s,=.*,,p') 
    register: variable_keys 

- shell: . ./myvars.sh && (set -a posix; set| sed -n '/^[A-Z]/ s,^.*=,,p') 
    register: variable_values 

- name: set variables 
    set_fact: 
    "{{item.0}}": "{{item.1}}" 
    with_together: 
    - "{{ variable_keys.stdout_lines }}" 
    - "{{ variable_values.stdout_lines }}" 

내가 가지고있는 경우, myvars.sh에서 :

- debug: 
    var: FOO 

내가 출력으로 볼 수 나는 이것을 사용 :

ok: [localhost] => { 
    "FOO": "bar" 
} 

인디 치과로, 나는이 모든 것을 sed와 함께 약해 버릴 것이고, 길 아래의 다른 문제를 일으킬지도 모른다라고 생각한다. 아마 이런 짓을 할 것이다 :

- name: Source Env Properties 
    shell: | 
    set -a 
    . ./myvars.sh 
    jq -n env 
    register: vars_raw 

- set_fact: 
    shellvars: "{{ vars_raw.stdout|from_json }}" 

- debug: 
    var: shellvars.FOO 

이 JSON으로 사용할 수있는 모든 환경 변수를 내보낼 jq를 사용하고 shellvars 변수에 결과를 할당합니다. set -amyvars.sh에 설정된 모든 변수가 환경으로 내보내 지도록 보장합니다.당신이 편리 jq이없는 경우에는 python을 사용할 수

- name: Source Env Properties 
    shell: | 
    set -a 
    . ./myvars.sh 
    python -c 'import json; import os; print(json.dumps(dict(os.environ)))' 
    register: vars_raw 

- set_fact: 
    shellvars: "{{ vars_raw.stdout|from_json }}" 

- debug: 
    var: shellvars.FOO 
+0

도움을 주셔서 대단히 감사합니다. 당신은'sed'가 문제가되는 상황에 처해 있지만,'sed'에 제공 한 비틀기는 지금 당장 내 문제를 해결했습니다. 파이썬 솔루션은 또한 대부분의 환경에서 작동 할 수 있지만 전부는 아닙니다. –