cloud-init.log에 write_files.0이 표시됩니다. 다른 속성은 허용되지 않습니다("지연"은 예상치 못한 일입니다).

cloud-init.log에 write_files.0이 표시됩니다. 다른 속성은 허용되지 않습니다("지연"은 예상치 못한 일입니다).

클라우드 초기화에는 매우 간단한 스탠자가 있습니다.

write_files:
  - path: /home/ecarroll/.zshrc
    content: |
      source ~/powerlevel10k/powerlevel10k.zsh-theme
    owner: ecarroll:ecarroll
    permissions: '0644'
    defer: true

defer플래그는 다음에 기록됩니다.클라우드 초기화:사인을 쓰다문서,

defer: (부울) 사용자가 생성되고 패키지가 설치된 후 "최종" 단계까지 파일 쓰기를 연기합니다. 기본: False.

하지만 위와 같이 사용하면

schema.py[WARNING]: Invalid config: write_files.0: Additional properties are not allowed ('defer' was unexpected)
util.py[DEBUG]: Writing to /home/ecarroll/.zshrc - wb: [644] 47 bytes
handlers.py[DEBUG]: finish: init-network/config-write-files: FAIL: running config-write-files with frequency once-per-instance
util.py[WARNING]: Running module write-files (<module 'cloudinit.config.cc_write_files' from '/usr/lib/python3/dist-packages/cloudinit/config/cc_write_files.py'>) failed
util.py[DEBUG]: Running module write-files (<module 'cloudinit.config.cc_write_files' from '/usr/lib/python3/dist-packages/cloudinit/config/cc_write_files.py'>) failed

내가 필요한 실제 이유는 defer추적에서 찾을 수 있습니다. ecarrollcloud-init이 아직 생성하지 않은 사용자 에게 파일을 chown'해야 하기 때문입니다 ()

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 1380, in chownbyname
    uid = pwd.getpwnam(user).pw_uid
KeyError: "getpwnam(): name not found: 'ecarroll'"

저는 우분투 20.04.4 LTS를 사용하고 있습니다.

답변1

write_files에 defer 속성을 추가하는 cloud-init v21.4로 업데이트해야 합니다.

실행 중인 버전을 확인하세요.

  • cloud-init -v, 그리고
  • head -n 1 /var/log/cloud-init.log위의 Brett의 답변을 참조하십시오.

이 두 가지가 동의하지 않으면 확인해 볼 수도 있습니다.로그 파일의 cloud-init 버전이 바이너리의 버전과 충돌하는 이유는 무엇입니까?

답변2

아래에는 무엇을 보여주나요?

head -n 1 /var/log/cloud-init.log

defer 문이 없으면 Ubuntu 20.04 cloud-init 22.1에서도 비슷한 예외가 표시됩니다.

arc~ cat ~/my-user-data
#cloud-config
users:
  - default
  - name: ecarroll
write_files:
  - path: /home/ecarroll/.zshrc
    content: |
      test content
    owner: ecarroll:ecarroll
    permissions: '0644'
arc~ lxc init ubuntu:focal ecarroll  -c user.user-data="$(cat ~/my-user-data)"
Creating ecarroll
arc~ lxc start ecarroll
arc~ lxc exec ecarroll -- grep -A12 Traceback /var/log/cloud-init.log
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 1430, in chownbyname
    uid = pwd.getpwnam(user).pw_uid
KeyError: "getpwnam(): name not found: 'ecarroll'"

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/cloudinit/stages.py", line 976, in _run_modules
    ran, _r = cc.run(run_name, mod.handle, func_args,
  File "/usr/lib/python3/dist-packages/cloudinit/cloud.py", line 54, in run
    return self._runners.run(name, functor, args, freq, clear_on_fail)
  File "/usr/lib/python3/dist-packages/cloudinit/helpers.py", line 186, in run
    results = functor(*args)
  File "/usr/lib/python3/dist-packages/cloudinit/config/cc_write_files.py", line 205, in handle
    write_files(name, filtered_files)
  File "/usr/lib/python3/dist-packages/cloudinit/config/cc_write_files.py", line 245, in write_files
    util.chownbyname(path, u, g)
  File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 1434, in chownbyname
    raise OSError("Unknown user or group: %s" % (e)) from e
arc~ lxc exec ecarroll -- grep "Additional properties" /var/log/cloud-init.log
arc~ lxc stop ecarroll && lxc rm ecarroll   

지연을 추가하면 예상대로 작동합니다.

arc~ cat ~/my-user-data
#cloud-config
users:
  - default
  - name: ecarroll
write_files:
  - path: /home/ecarroll/.zshrc
    content: |
      test content
    owner: ecarroll:ecarroll
    permissions: '0644'
    defer: true
arc~ lxc init ubuntu:focal ecarroll -c user.user-data="$(cat ~/my-user-data)" 
Creating ecarroll
arc~ lxc start ecarroll                                                      
arc~ lxc exec ecarroll -- grep -A12 Traceback /var/log/cloud-init.log         
arc~ lxc exec ecarroll -- grep -A12 "Additional properties" /var/log/cloud-init.log
arc~ lxc shell ecarroll                                                            
root@ecarroll:~# cat /home/ecarroll/.zshrc 
test content
root@ecarroll:~# exit
logout
arc~ lxc stop ecarroll && lxc rm ecarroll

내 로그에는 "기타 속성" 경고가 없습니다. 이 경고는 jsonschema 유효성 검사기에 알려지지 않은 클라우드 구성의 키를 사용하고 있음을 나타냅니다. 이 경우 실행 중인 버전이 defer키워드보다 이전 버전임을 나타냅니다.

보고한 트레이스백은 getpwname1380행에 있습니다.

20.04의 최신 버전의 cloud-init은 다음과 같습니다.버전 21.2.

통과버전 21.3, 통화가 getpwname1429번 라인으로 다시 푸시되었습니다.

위 정보를 바탕으로 cloud-init가 지원되지 않는 버전에서 실행 중이었고 defer이후 21.4로 업그레이드되었다고 가정합니다.

모든 cloud-init 단계를 다시 실행하려면 언제든지 시도한 cloud-init clean --logs후 재부팅하면 됩니다. 이렇게 하면 cloud-init 아티팩트가 제거됩니다. lxc위 명령은 클라우드에서 모듈을 실행하기 전에 로컬에서 모듈을 사용해 보는 데 도움이 될 수 있습니다 .

관련 정보