วิธีง่ายๆในการสร้าง dir ที่ไม่มีอยู่โดยอัตโนมัติใน ansible คืออะไร


117

ใน Ansible playbook ของฉันหลาย ๆ ครั้งฉันต้องสร้างไฟล์ที่นั่น

 - name: Copy file
   template:
     src: code.conf.j2
     dest: "{{project_root}}/conf/code.conf"

หลายครั้งที่confผช. ไม่อยู่ที่นั่น จากนั้นฉันต้องสร้างงานเพิ่มเพื่อสร้างผบ. นั้นก่อน

มีวิธีง่ายๆในการสร้าง dir โดยอัตโนมัติหรือไม่หากไม่มีตัวเลือกบางอย่าง



ฉันไม่อยากจะเชื่อเลยว่านี่ยังคงเป็นปัญหาในข้อ 2.9 มันยากแค่ไหนที่โมดูลเหล่านี้จะมีการสลับการสร้าง dir โดยค่าเริ่มต้นเป็นปิด มันจะช่วยประหยัดได้มากใน playbooks โดยต้องจัดการกับข้ออ้างเช่นคำตอบด้านล่าง
krad

คำตอบ:


139

ตอนนี้นี่เป็นวิธีเดียว

- name: Ensures {{project_root}}/conf dir exists
  file: path={{project_root}}/conf state=directory
- name: Copy file
  template:
    src: code.conf.j2
    dest: "{{project_root}}/conf/code.conf"

2
ฉันคิดว่าเป็นคำที่ถูกต้องที่นี่ มั่นใจ: "บอกบางสิ่งบางอย่างในเชิงบวกเพื่อปัดเป่าข้อสงสัย" ให้แน่ใจว่า: "ตรวจสอบให้แน่ใจว่า (บางอย่าง) จะเกิดขึ้นหรือเป็นกรณี"
Daniel Compton

ดูเหมือนจะตรวจสอบว่ามี directorty อยู่หรือไม่ แต่ดูเหมือนจะไม่สร้างขึ้น
Matt

8
โปรดทราบว่าคุณอาจต้องการเพิ่มrecurse=yesในการfileโทรเพื่อรับmkdir -pพฤติกรรมประเภท
Mitch

1
ปริศนาอีกชิ้นที่อาจเป็นประโยชน์คือตัวกรองเฉพาะdirnameที่ตอบได้เพื่อรับไดเร็กทอรีที่มีไฟล์
Caspar

1
@radtek โมดูลไฟล์ทำกับไดเร็กทอรี state = แล้ว มันจะล้มเหลวหากไม่สามารถตรวจสอบให้แน่ใจว่าพา ธ ไฟล์ที่เสนอชี้ไปยังไดเร็กทอรี
Alexander Jardim

21

เพื่อให้แน่ใจว่าประสบความสำเร็จด้วยเส้นทางแบบเต็มให้ใช้ recurse = ใช่

- name: ensure custom facts directory exists
    file: >
      path=/etc/ansible/facts.d
      recurse=yes
      state=directory

2
ตามเอกสาร (และการทดสอบของฉัน) ไดเร็กทอรีย่อยจะถูกสร้างขึ้นเสมอและrecurse=yesใช้สิทธิ์แบบวนซ้ำเท่านั้น อย่างไรก็ตามเอกสารระบุว่าสิ่งนี้เกิดขึ้นโดยอัตโนมัติตั้งแต่ v1.7 ดังนั้นrecurseอาจล้าสมัยไปแล้ว
หากต้องการ 마 SE

16

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

ตัวอย่างเช่นหากคุณมี playbook ที่dest_pathกำหนดไว้ในตัวแปรเช่นนี้คุณสามารถใช้ตัวแปรเดิมซ้ำได้:

- name: My playbook
  vars:
    dest_path: /home/ubuntu/some_dir/some_file.txt
  tasks:

    - name: Make sure destination dir exists
      file:
        path: "{{ dest_path | dirname }}"
        state: directory
        recurse: yes

    # now this task is always save to run no matter how dest_path get's changed arround
    - name: Add file or template to remote instance
      template: 
        src: foo.txt.j2
        dest: "{{ dest_path }}"

1
ในขณะที่วิธีนี้ยังคงเป็นแบบละเอียด แต่ฉันคิดว่ามันใกล้เคียงกับความตั้งใจของผู้เขียนมากที่สุด ฉันจะชอบถ้ามีพารามิเตอร์ 'makedirs' ง่ายๆเช่น Salt has: docs.saltstack.com/en/latest/ref/states/all/…
lsh

7

AFAIK วิธีเดียวที่นี้สามารถทำได้คือการใช้state=directoryตัวเลือก ในขณะที่templateโมดูลรองรับcopyตัวเลือกส่วนใหญ่ซึ่งสนับสนุนfileตัวเลือกส่วนใหญ่แต่คุณไม่สามารถใช้สิ่งที่ต้องการstate=directoryได้ ยิ่งไปกว่านั้นมันจะค่อนข้างสับสน (หมายความว่า{{project_root}}/conf/code.confเป็นไดเร็กทอรีหรือไม่หรือหมายความว่า{{project_root}}/conf/ควรสร้างก่อน

ดังนั้นฉันไม่คิดว่าตอนนี้จะเป็นไปได้โดยไม่ต้องเพิ่มfileงานก่อนหน้านี้

- file: 
    path: "{{project_root}}/conf"
    state: directory
    recurse: yes

7

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

- name: create directory with parent directories
  file:
    path: /data/test/foo
    state: directory

นี่เป็นค่าโดยสารเพียงพอที่จะสร้างข้อมูลไดเร็กทอรีหลักและทดสอบด้วยfoo

โปรดดูคำอธิบายพารามิเตอร์ - " state " http://docs.ansible.com/ansible/latest/modules/file_module.html


โปรดเพิ่มโซลูชันที่นี่แทนลิงก์ที่อาจใช้งานไม่ได้ในอนาคต
Ignacio Ara

@IgnacioAra ขอบคุณสำหรับความคิดเห็นที่มีค่าฉันได้เพิ่มวิธีแก้ปัญหาแล้ว
Alby

1

คุณสามารถสร้างโฟลเดอร์โดยใช้สิ่งต่อไปนี้ขึ้นอยู่กับเวอร์ชันที่ตอบได้ของคุณ

เวอร์ชั่นล่าสุด 2 <

- name: Create Folder
  file: 
   path: "{{project_root}}/conf"
   recurse: yes
   state: directory

รุ่นเก่ากว่า:

- name: Create Folder
  file: 
      path="{{project_root}}/conf"
      recurse: yes
      state=directory

อ้างอิง - http://docs.ansible.com/ansible/latest/file_module.html


1

โมดูลการคัดลอกจะสร้างไดเร็กทอรีหากไม่มี ในกรณีนี้จะสร้างไดเร็กทอรี modified.conf.d

- name: put fallback_dns.conf in place                                                                 
  copy:                                                                                                
    src: fallback_dns.conf                                                                             
    dest: /etc/systemd/resolved.conf.d/                                                                
    mode: '0644'                                                                                       
    owner: root                                                                                        
    group: root                                                                                        
  become: true                                                                                         
  tags: testing
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.