프로그래밍 방식으로 생성 된 Ansible 플레이 북을 사용하고 있습니다. 일반적으로 플레이 북은 YAML이므로 간단합니다. 그러나 “간단한” key=value
양식을 사용할 때 플레이 북 은 순수한 YAML 이 아니며shlex
구문 분석 가능한 양식이 포함 된 컨텐츠를 포함합니다 .
이 형식의 모호성을 피하기 위해 ( key=value
명령에 대한 인수 또는 ansible에 대한 인수를 결합합니까?) 단일 형식으로 구문 분석 및 생성 해야합니다. -examples 저장소 .
이것은 다음 종류의 구문을 사용합니다.
action: module-name
args:
key1: value1
key2: value2
… 좋아요. 그러나, shell
또는 command
모듈 에이 양식을 사용하려고 할 때 ( 문서에 이름 free_form
이 지정된 인수로 전달 된 실제 명령을 설명하는 )이 기능이 제대로 작동하지 않습니다.
action: shell
args:
free_form: echo hello_world >/tmp/something
creates: /tmp/something
호출되면 다음이 실행됩니다.
/bin/sh -c " free_form='echo hello_world >/tmp/something' "
… 나는 달성하려는 것이 아닙니다.
순수한 YAML 구문을 사용하여 “자유 형식”명령을 수행하는 Ansible 모듈을 사용하는 올바른 방법은 무엇입니까?
답변
짧은 답변 : 할 일이 사용하지 command
, raw
, script
, 또는 shell
모듈을. 명령을 “정상”인수로 받아들이는 자체 모듈을 작성하십시오.
긴 대답 :
대부분의 경우 다음을 수행 할 수 있습니다.
- shell: echo hello_world > /tmp/something
args:
creates: /tmp/something
그러나 일부 경우에는 실패합니다.
- shell: echo hello_world > creates=something
args:
creates: creates=something # The file is named "creates=something"
나는 이것을 처리하는 일반적인 방법을 모르지만 bash 특정 솔루션은 다음과 같습니다.
- shell: echo hello_world > "creates=something"
args:
creates: creates=something
답변
이것은 지금 Ansible 문서 에서 다루어 졌습니다.
# You can also use the 'args' form to provide the options. This command
# will change the working directory to somedir/ and will only run when
# /path/to/database doesn't exist.
- command: /usr/bin/make_database.sh arg1 arg2
args:
chdir: somedir/
creates: /path/to/database
‘free_form’이라는 매개 변수가 없습니다.