วิธีสร้างไดเรกทอรีโดยใช้ Ansible


375

คุณจะสร้างไดเรกทอรีwwwที่/srvบนระบบที่ใช้เดเบียนด้วยเพลย์บุ๊ค Ansible ได้อย่างไร

คำตอบ:


635

คุณต้องการโมดูลไฟล์ ในการสร้างไดเรกทอรีคุณต้องระบุตัวเลือกstate=directory:

- name: Creates directory
  file:
    path: /src/www
    state: directory

คุณสามารถดูตัวเลือกอื่น ๆ ได้ที่http://docs.ansible.com/file_module.html


36
หากstate=directoryไดเรกทอรีย่อยทันทีทั้งหมดจะถูกสร้างขึ้นหากไม่มีอยู่ตั้งแต่ 1.7 จะถูกสร้างขึ้นด้วยสิทธิ์ที่ให้มา
อเล็กซ์

1
@Alex all immediate subdirectoriesสับสนคุณสามารถกำหนดมันและยกตัวอย่างได้หรือไม่?
เจมี่แจ็คสัน

8
@JamieJackson มีข้อผิดพลาดควรเป็น "ไดเรกทอรีย่อยระดับกลางทั้งหมด"
อเล็กซ์

203

คุณสามารถขยายโมดูลไฟล์และตั้งค่าเจ้าของกลุ่ม & สิทธิ์ผ่านมันได้ (Ref: เอกสารประกอบไฟล์ Ansible )

- name: Creates directory
  file:
    path: /src/www
    state: directory
    owner: www-data
    group: www-data
    mode: 0775

แม้คุณสามารถสร้างไดเรกทอรีซ้ำ:

- name: Creates directory
  file:
    path: /src/www
    state: directory
    owner: www-data
    group: www-data
    mode: 0775
    recurse: yes

ด้วยวิธีนี้มันจะสร้างไดเรกทอรีทั้งสองถ้าพวกเขาไม่อยู่


38
recursiveอาร์กิวเมนต์ทำให้นี้มากเช่นการใช้mkdir -p(สำหรับผู้ googling เบิ้ล mkdir -p )
คาเอลเลียต

2
ฉันพบว่ามันเปลี่ยนการอนุญาตของไฟล์สำหรับเด็กด้วย ... เกือบจะเหมือน mkdir -p / foo / bar && chmod -R 0775 / foo / bar .. มีคนอื่นสังเกตสิ่งนี้ด้วย
Ansible 2.0.0.2

5
พารามิเตอร์ไม่ชอบrecurse mkdir -pจะตั้งค่าแอ็ตทริบิวต์ไฟล์ที่ระบุซ้ำ ๆ หากstate=directoryไดเรกทอรีย่อยทันทีทั้งหมดจะถูกสร้างขึ้นหากไม่มีอยู่ตั้งแต่ 1.7 จะถูกสร้างขึ้นด้วยสิทธิ์ที่ให้มา
อเล็กซ์

1
นี้ใช้ไวยากรณ์เก่ากับ=ตัวอักษรจะดีในการปรับปรุงด้วย:ไวยากรณ์กับแต่ละคนบนบรรทัดใหม่
ympostor

@ThePracticalOne - ใช่ ... ใช้ "recurse" พฤติกรรมทางเดียวกันว่าchmod -Rไม่ นั่นคือถ้าpathมีอยู่แล้วในฐานะ dir และมีไฟล์อยู่ข้างในrecurseตัวเลือกจะ (บางครั้งน่าเสียดาย) ก็จะใช้การอนุญาตแบบเดียวกันกับไฟล์เหล่านั้น นี่คือโดยการออกแบบให้ดีขึ้นหรือแย่ลง
Dale Anderson


14

สามารถสร้างไดเรกทอรีได้โดยใช้โมดูลไฟล์เท่านั้นเนื่องจากไดเรกทอรีไม่มี แต่ไฟล์

# create a directory if it doesn't exist
- file:
    path: /etc/some_directory
    state: directory
    mode: 0755
    owner: foo
    group: foo

8
- file:
    path: /etc/some_directory
    state: directory
    mode: 0755
    owner: someone
    group: somegroup

นั่นคือวิธีที่คุณสามารถกำหนดสิทธิ์เจ้าของและกลุ่มได้ พารามิเตอร์สามตัวสุดท้ายนั้นไม่จำเป็น


7

คุณสามารถสร้างไดเรกทอรี การใช้

# create a directory if it doesn't exist
- file: path=/src/www state=directory mode=0755

นอกจากนี้คุณยังสามารถศึกษา http://docs.ansible.com/ansible/file_module.html เพื่อดูรายละเอียดเพิ่มเติมเกี่ยวกับไดเร็กทอรีและระบบไฟล์ regaridng


7

เพิ่มเติมสำหรับคำตอบทั้งหมดที่นี่มีสถานการณ์มากมายเมื่อคุณต้องการสร้างมากกว่าหนึ่งไดเรกทอรีดังนั้นจึงเป็นความคิดที่ดีที่จะใช้ลูปแทนการสร้างงานแยกต่างหากสำหรับแต่ละไดเรกทอรี

- name: Creates directory
  file:
    path: "{{ item }}"
    state: directory
  with_items:
  - /srv/www
  - /dir/foo
  - /dir/bar

3

เพียงแค่ต้องใส่เงื่อนไขในการดำเนินงานสำหรับการกระจายที่เฉพาะเจาะจง

- name: Creates directory
  file: path=/src/www state=directory
  when: ansible_distribution == 'Debian'

3

คุณสามารถใช้คำสั่ง

- name: webfolder - Creates web folder
  file: path=/srv/www state=directory owner=www-data group=www-data mode=0775`

3

หากคุณต้องการสร้างไดเรกทอรีใน windows:

  • ชื่อ: สร้างโครงสร้างไดเรกทอรี
    win_file:
    เส้นทาง: C: \ Temp \ folder \ subfolder>
    state: directory


2

เรามีโมดูลที่พร้อมใช้งานในการสร้างไดเรกทอรีไฟล์ใน ansible

ตัวอย่าง

- name: Creates directory
  file:
    path: /src/www
    state: directory

1

คุณสามารถเรียกใช้คำสั่งโดยตรงและสร้างโดยตรงโดยใช้ ansible

ansible -v targethostname -m shell -a "mkdir /srv/www" -u targetuser

หรือ

ansible -v targethostname -m file -a "path=/srv/www state=directory" -u targetuser

1
---
- hosts: all
  connection: local
  tasks:
    - name: Creates directory
      file: path=/src/www state=directory

playbook ด้านบนจะสร้างไดเรกทอรี www ใน / src path

ก่อนเล่นข้างบน playbook โปรดตรวจสอบให้แน่ใจว่าการตั้งค่าการเชื่อมต่อโฮสต์ของคุณนั้น

"localhost ansible_connection = local"

ควรมีอยู่ใน / etc / ansible / hosts

สำหรับข้อมูลเพิ่มเติมโปรดแจ้งให้เราทราบ


ไฟล์: path = / src / www state = directory
Saurabh


1

ใช้โมดูลไฟล์เพื่อสร้างไดเรกทอรีและรับรายละเอียดเกี่ยวกับโมดูลไฟล์โดยใช้คำสั่ง "ไฟล์ ansible-doc"

นี่คือตัวเลือก "สถานะ" ที่อธิบาย:

หากdirectoryไดเรกทอรีย่อยทันทีทั้งหมดจะถูกสร้างขึ้นหากไม่มีอยู่ตั้งแต่ 1.7 จะถูกสร้างขึ้นด้วยสิทธิ์ที่ให้มา
หากfileไฟล์นั้นจะไม่ถูกสร้างขึ้นหากไม่มีอยู่ให้ดูที่โมดูล [คัดลอก] หรือ [แม่แบบ] หากคุณต้องการพฤติกรรมดังกล่าว
หากlinkลิงก์สัญลักษณ์จะถูกสร้างหรือเปลี่ยนแปลง ใช้hardสำหรับการเชื่อมโยง
หากabsentไดเร็กทอรีจะถูกลบซ้ำและไฟล์หรือ symlink จะถูกยกเลิกการเชื่อมโยง

โปรดทราบว่าfileจะไม่ล้มเหลวหากเส้นทางไม่มีอยู่เนื่องจากสถานะไม่เปลี่ยนแปลง

หากtouch(ใหม่ใน 1.4) ไฟล์ว่างเปล่าจะถูกสร้างขึ้นหากไม่มีพา ธ ในขณะที่ไฟล์หรือไดเรกทอรีที่มีอยู่จะได้รับการเข้าถึงไฟล์ที่ปรับปรุงและเวลาแก้ไข (คล้ายกับวิธีการtouchทำงานจากบรรทัดคำสั่ง)


1

คุณสามารถใช้โมดูล "ไฟล์" ในกรณีนี้มีข้อโต้แย้งมากมายที่คุณสามารถส่งผ่านไปยังไดเรกทอรีที่สร้างขึ้นใหม่เช่นเจ้าของกลุ่มที่ตั้งโหมดและอื่น ๆ .....

โปรดอ้างอิงเอกสารนี้สำหรับคำอธิบายโดยละเอียดเกี่ยวกับโมดูลไฟล์ ...

https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module

โปรดจำไว้ว่าโมดูลนี้ไม่ได้เป็นเพียงการสร้างไดเรกทอรี !!!


1

วิธีที่ง่ายที่สุดในการสร้างไดเรกทอรีใน Ansible

  • ชื่อ: สร้าง your_directory หากไม่มีอยู่ ไฟล์: เส้นทาง: / etc / your_directory

หรือ

คุณต้องการให้สิทธิ์ sudo แก่ไดเรกทอรีนั้น

  • ชื่อ: สร้าง your_directory หากไม่มีอยู่ ไฟล์: เส้นทาง: / etc / your_directory โหมด: '777'

0

ฉันเห็นตัวอย่าง Playbooks มากมายและฉันต้องการพูดถึงตัวอย่างคำสั่ง Adhoc

$ ansible -i inventory -m file -a "path = / tmp / direcory state = ไดเรกทอรี (แทนที่จะเป็นไดเรกทอรีเราสามารถพูดถึง touch เพื่อสร้างไฟล์)


0

คุณต้องใช้โมดูลไฟล์สำหรับกรณีนี้ Playbook ด้านล่างคุณสามารถใช้สำหรับการอ้างอิงของคุณ

    ---
     - hosts: <Your target host group>
       name: play1
       tasks: 
        - name: Create Directory
          files:
           path=/srv/www/
           owner=<Intended User>
           mode=<Intended permission, e.g.: 0750>
           state=directory 

0

ในการตรวจสอบว่ามีไดเรกทอรีอยู่หรือไม่จากนั้นเรียกใช้งานบางอย่าง (เช่นสร้างไดเรกทอรี) ให้ใช้สิ่งต่อไปนี้

- name: Check if output directory exists
    stat:
    path: /path/to/output
    register: output_folder

- name: Create output directory if not exists
    file:
    path: /path/to/output
    state: directory
    owner: user
    group: user
    mode: 0775
    when: output_folder.stat.exists == false

0

คุณต้องการfileโมดูล ในการสร้างไดเรกทอรีคุณต้องระบุตัวเลือกstate: directory:

- name: Creates directory
  file:
    path: /src/www
    state: directory

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.