Ansible: วิธีตั้งค่าการอนุญาตไดเรกทอรีและไฟล์ซ้ำ ๆ


52

ในการสำรวจฉันสามารถทำสิ่งนี้:

file: dest=/foo/bar/somedir owner=root group=apache mode=0775 recurse=yes

และจะตั้งค่าเจ้าของกลุ่มและการอนุญาตซ้ำเป็น 0775 ในไดเรกทอรีและไฟล์ทั้งหมดในเส้นทางนั้น แต่ฉันต้องการตั้งค่าไดเรกทอรีเป็น 0775 และไฟล์เป็น 0664 มีวิธีทำให้ ansible ทำเช่นนี้หรือไม่?


คำตอบ:


33
file: dest=/foo/bar/somedir owner=root group=apache mode=u=rwX,g=rX,o=rX recurse=yes

จะตั้งค่าไดเรกทอรีเป็น 755 และไฟล์เป็น 644


สิ่งนี้ใช้ไม่ได้กับไฟล์
mirza

1
@Adam โอกาสมายากลอยู่ที่ไหน? การระบุ u, g, o ทำให้แตกต่างจากตัวเลข (และเขียนที่ไหน 644?)
linuxbandit

4
ซอร์สโค้ดระบุว่าการจัดการ ugo สัญลักษณ์นั้นเหมือนกับการจัดการ "man chmod" - ตัว X มีการจัดการพิเศษตามสถานะ dir / file และบิตเรียกใช้ที่มีอยู่ github.com/ansible/ansible/blob/…
Marc Tamsky

2
กล่าวอีกนัยหนึ่งXก็คือxสำหรับไดเรกทอรีและไม่มีอะไรสำหรับไฟล์ และนั่นเป็นวิธีที่chmodไม่ansibleปฏิบัติกับสตริงโหมด ฉันหวังว่าSจะได้รับการปฏิบัติเช่นเดียวกัน
x-yuri

1
แต่ไม่ทราบว่ามันทำให้ไฟล์ปฏิบัติการโดยปฏิบัติการเจ้าของโดยทั้งหมด
x-yuri

25

โมดูลไฟล์ / การคัดลอก Ansible ไม่ได้ให้ความละเอียดในการระบุสิทธิ์ตามประเภทไฟล์ดังนั้นคุณอาจต้องทำด้วยตนเองโดยทำบางสิ่งตามบรรทัดเหล่านี้:

- name: Ensure directories are 0755
  command: find {{ path }} -type d -exec chmod 0755 {} \;

- name: Ensure files are 0644
  command: find {{ path }} -type f -exec chmod 0644 {} \;

สิ่งเหล่านี้จะมีผลกระทบจากการเรียกซ้ำผ่าน{{ path }}และเปลี่ยนการอนุญาตของทุกไฟล์หรือไดเรกทอรีเป็นสิทธิ์ที่ระบุ

ที่มา: https://stackoverflow.com/a/28782805/1306186


@ luckytaxi คำตอบที่ให้โดย gmangin ไม่ได้ตั้งค่าการอนุญาตของไดเรกทอรีย่อยแบบเรียกซ้ำ
Dejay Clayton

อ่าคุณถูกต้องแล้ว! ฉันเห็นrecurseตัวเลือกหนึ่งแต่ไม่ใช่ตัวเลือกอื่น
luckytaxi

9

หากคุณต้องการใช้ไฟล์โมดูลใน ansible คุณสามารถ:

ไฟล์: dest = / foo / bar / somedir owner = กลุ่ม root = โหมด apache = 0644 recurse = ใช่

ไฟล์: dest = / foo / bar / somedir owner = กลุ่ม root = โหมด apache = 0775

ด้วยวิธีนี้คุณจะตั้งค่าไฟล์ทั้งหมด (recurse = yes) เป็น '644' ก่อนจากนั้นคุณตั้งค่า / foo / bar / somedir เป็น '775'

สิ่งนี้ไม่สมบูรณ์เพราะจะเปลี่ยนการอนุญาตไดเรกทอรีทุกครั้งที่คุณเล่น playbook แต่อย่างน้อยมันก็เป็น idempotent ไม่เหมือนคำสั่งโมดูล

หากคุณไม่ต้องการที่จะมีสถานะ 'เปลี่ยน' คุณสามารถใช้โมดูลสถิติ มันจะแสดงรายการไฟล์และไดเรกทอรีทั้งหมดใน / foo / bar / somedir เพื่อให้คุณลงทะเบียนคำตอบแล้วทำการวนซ้ำบนไฟล์เหล่านั้นเท่านั้น


7
คำตอบของคุณจะตั้งค่าไฟล์ย่อยและไดเรกทอรีย่อยทั้งหมดเป็น 644 ในขณะที่ตั้งค่าเฉพาะไดเรกทอรีระดับบนสุดเป็น 775 จำเป็นสำหรับไดเรกทอรีทั้งหมดเป็น 775 รวมถึงไดเรกทอรีย่อย
Edward Ned Harvey

ข้อเสนอแนะนี้ไม่ใช่ idempotent การตั้งค่าการอนุญาตก่อนเป็นหนึ่งค่าและต่อมาอื่นหมายถึงการอนุญาตจะมีการเปลี่ยนแปลงในการทำงานทุกครั้ง
Kevin Keane

5

ฉันไม่แน่ใจว่าควรจะตั้งค่าไดเรกทอรีเป็น 0775 ( rwxrwxr-x) และไฟล์เป็น 0644 ( rw-r--r--): ไดเรกทอรีที่เขียนได้เป็นกลุ่ม แต่ไม่ใช่ไฟล์

หากคุณต้องการตั้งค่าไฟล์เป็น 0664 ( rw-rw-r--) เพื่อให้แน่ใจว่าไฟล์นั้นไม่สามารถเรียกใช้งานได้ในขณะที่ไดเรกทอรีต่างๆนั้นสามารถผ่านได้มีวิธีแก้ไขที่สวยงามที่เกี่ยวข้องกับchmodคำสั่งเดียวเท่านั้น:

chmod -c -R ug=rw,o=r,a-x+X "{{top_dir}}"

นี่คือวิธีการใช้ในAnsible :

- name: recursive chmod example
  command: |
    chmod -c -R ug=rw,o=r,a-x+X "{{item}}"
  register: chmod_status
  changed_when: chmod_status.stdout != ""
  with_items:
    - "/home/user/sample/dir"

chmod -cพิมพ์การเปลี่ยนแปลงทั้งหมดที่เราสามารถใช้เพื่อเติมสถานะ "เปลี่ยนแปลง" ในAnsibleได้อย่างสะดวก ฉันหวังว่ามันจะสมเหตุสมผล


3

หากต้องการเปลี่ยน mods เมื่อจำเป็นเท่านั้น:

- name: make dirs 0755   
  command: find {{ your_path }} -type d ! -perm 0755 -exec chmod 0755 {} \;

- name: make files 0644   
  command: find {{ your_path }} -type f ! -perm 0644 -exec chmod 0644 {} \;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.