Puppet의 환경은 어디에서 왔나요?

Puppet의 환경은 어디에서 왔나요?

스스로 훈련 puppet하고 다음 체크리스트를 작성했습니다.

class bratch::test {

  file { '/var/cache/tempFile':
    owner  => 'root',
    group  => 'root',
    mode   => '0644',
    source => "puppet://${puppetserver}/modules/bratch/tempFile"
  }

  exec { "create_file":
    command => "/bin/echo boop >> /tmp/outputFile",
  }

예상대로 작동했지만 실제로는 실행이 끝날 때까지 해당 실행 라인에 대해 생각하지 않았습니다.

출력 리디렉션을 이해 한다면 puppet쉘을 호출한다는 의미입니까? 그렇다면 그 환경은 어디에서 오는가? 매번 환경을 초기화합니까, 아니면 Puppet 에이전트에서 직접 상속합니까?

답변1

이것문서이 시점에서는 약간 혼란스럽습니다.

공급자

POSIX

셸을 통하거나 보간을 수행하지 않고 직접 외부 바이너리를 실행합니다. 이는 대부분의 명령을 실행하는 데 더 안전하고 예측 가능한 방법이지만 와일드카드 및 셸 내장("for" 및 "if" 문과 같은 제어 논리 포함)을 사용할 수 없습니다.

기본값은 feature== 입니다 posix.

껍데기

제공된 명령을 전달하십시오 /bin/sh. POSIX 시스템에만 적용됩니다. 이를 통해 쉘 와일드카드 및 내장 명령을 사용할 수 있으며 명령 경로가 정규화될 필요가 없습니다. 이는 제공자보다 더 편리할 수 있지만 posix, 항상 그렇듯이 탈출에 더 조심해야 한다는 의미이기도 합니다.

exec이 공급자는 Puppet 0.25.x의 유형과 매우 유사하게 작동합니다.

따라서 공급자를 사용하는 경우 shell리디렉션을 사용할 수 있어야 하지만 기본값은 입니다. posix즉, 직접 수행하므로 지정하지 않는 한 shell...

두 경우 모두 문서에는 환경에 대해 많은 내용이 나와 있지 않습니다. 확인이 필요하다암호:

begin
  # Do our chdir
  Dir.chdir(dir) do
    environment = {}

    environment[:PATH] = resource[:path].join(File::PATH_SEPARATOR) if resource[:path]

비어 있는 것으로 설정된 다음 environment해당 필드를 사용하여 제공하는 모든 설정으로 채워지므로 매번 다시 초기화됩니다.


그러나 이동 경로를 따라가면 다음을 발견합니다.함수 호출다음을 수행합니다.

      output = Puppet::Util::Execution.execute(command, :failonfail => false, :combine => true,
                              :uid => resource[:user], :gid => resource[:group],
                              :override_locale => false,
                              :custom_environment => environment)

Execution.execute수신 전화execute_posix, 이는 차례로하다:

  command = [command].flatten
  ...
    options[:custom_environment] ||= {}
    Puppet::Util.withenv(options[:custom_environment]) do
      Kernel.exec(*command)

저는 Ruby를 모릅니다. 명령과 인수를 배열로 명시적으로 지정하고 다음과 "/bin/echo boop >> /tmp/outputFile"같은 문자열을 제공하지 않는 한 그렇게 말하고 싶습니다.Kernel.exec,안에:

이 문자열은 명령줄로 처리되며 실행 전에 셸 확장이 필요합니다.

그렇기 때문에 shell공급자로 설정하지 않고도 리디렉션을 사용할 수 있습니다. 더 나아가서 보면withenv, environment위에 설정된 배열은 오버레이 집합으로 사용됩니다. environment필드가 다음과 같은 경우아니요지정하면 아무것도 덮어쓰지 않습니다. 따라서 환경은 Puppet에서 상속되어야 합니다. 이제 Puppet이 어떤 환경을 갖게 되는지 잘 모르겠지만 Ubuntu와 같은 Upstart-as-init 시스템에서 서비스로 실행된다면 최소한TERM그리고PATH사용 가능.

관련 정보