클라우드 초기화에는 매우 간단한 스탠자가 있습니다.
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
추적에서 찾을 수 있습니다. ecarroll
cloud-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
키워드보다 이전 버전임을 나타냅니다.
보고한 트레이스백은 getpwname
1380행에 있습니다.
20.04의 최신 버전의 cloud-init은 다음과 같습니다.버전 21.2.
통과버전 21.3, 통화가 getpwname
1429번 라인으로 다시 푸시되었습니다.
위 정보를 바탕으로 cloud-init가 지원되지 않는 버전에서 실행 중이었고 defer
이후 21.4로 업그레이드되었다고 가정합니다.
모든 cloud-init 단계를 다시 실행하려면 언제든지 시도한 cloud-init clean --logs
후 재부팅하면 됩니다. 이렇게 하면 cloud-init 아티팩트가 제거됩니다. lxc
위 명령은 클라우드에서 모듈을 실행하기 전에 로컬에서 모듈을 사용해 보는 데 도움이 될 수 있습니다 .