ฉันมีโครงสร้างนี้ในโมดูลหุ่นกระบอกของฉันเพื่อเพิ่มบรรทัด/etc/sudoersหลังจากบรรทัด"ค่าเริ่มต้น" สุดท้าย:

  augeas { "sudoers.ssh_auth_sock" :
    lens => "Sudoers.lns",
    incl => "/etc/sudoers",
    onlyif  => "match Defaults/env_keep/var[. = 'SSH_AUTH_SOCK'] size==0",
    changes => [
       # Create a new Defaults line for the two variables
       "ins Defaults after Defaults[last()]",
       # Make this Defaults line a += type
       "clear Defaults[last()]/env_keep/append",
       # assign values to the two variables
       "set Defaults[last()]/env_keep/var[1] SSH_AUTH_SOCK",
    ],
  }

มันทำงานได้อย่างสมบูรณ์แบบบนเครื่อง RedHat 6 ของฉัน

Notice: Augeas[sudoers.ssh_auth_sock](provider=augeas):
--- /etc/sudoers        2021-10-12 13:30:52.880901115 +0000
+++ /etc/sudoers.augnew 2021-10-12 13:31:28.697931561 +0000
@@ -77,6 +77,7 @@
 # Defaults   env_keep += "HOME"

 Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
+Defaults env_keep += SSH_AUTH_SOCK

 ## Next comes the main part: which users can run what software on

Notice: /Stage[main]/Sudoers/Augeas[sudoers.ssh_auth_sock]/returns: executed successfully

แต่มันล้มเหลวในเครื่อง RedHat 7 ของฉัน:

Warning: Augeas[sudoers.ssh_auth_sock](provider=augeas): Loading failed for one or more files, see debug for /augeas//error output
Error: /Stage[main]/Sudoers/Augeas[sudoers.ssh_auth_sock]: Could not evaluate: Error sending command 'ins' with params ["Defaults", "after", "/files/etc/sudoers/Defaults[last()]"]/Error sending command 'ins' with params ["Defaults", "after", "/files/etc/sudoers/Defaults[last()]"]

ใครสามารถช่วยฉันเข้าใจสิ่งที่เปลี่ยนแปลงไป หรือสิ่งที่ฉันทำผิด เพื่อที่ฉันจะได้ใช้ข้อมูลโค้ดนี้ในทั้งสองสภาพแวดล้อม

answer

ขอบคุณค่ะ @raphink

augtool errors กล่าวว่า

Error in /etc/sudoers:96.12 (parse_failed)
  Iterated lens matched less than it should
  Lens: /usr/share/augeas/lenses/dist/sudoers.aug:530.10-.70:
    Last matched: /usr/share/augeas/lenses/dist/sep.aug:47.18-.40:
    Next (no match): /usr/share/augeas/lenses/dist/sudoers.aug:500.16-501.47:

เลยเช็คบรรทัดที่ 96 /etc/sudoersแล้วขึ้นว่า

@includedir /etc/sudoers.d

เห็นได้ชัดว่า@includedirตอนนี้เป็นไวยากรณ์ที่ถูกต้องนอกเหนือจากไวยากรณ์แบบเก่า#includedir... แต่เลนส์ augeas (ของฉัน) ไม่รู้จักเวอร์ชันใหม่

(* View: includedir *)
let includedir =
  [ key /#include(dir)?/ . Sep.space . store Rx.fspath . eol ]

ผมเปลี่ยน@ไป#ใน/etc/sudoersและที่ดูเหมือนว่าจะมีการแก้ไขปัญหาที่เกิดขึ้น