เขียนตัวแปรไปยังไฟล์ใน Ansible


103

ฉันกำลังดึง JSON ผ่านโมดูล URI และต้องการเขียนเนื้อหาที่ได้รับลงในไฟล์ ฉันสามารถรับเนื้อหาและส่งออกไปยังดีบักเกอร์ได้ดังนั้นฉันจึงทราบว่าได้รับเนื้อหาแล้ว แต่ฉันไม่รู้แนวทางปฏิบัติที่ดีที่สุดในการเขียนไฟล์

คำตอบ:


201

คุณสามารถใช้copyโมดูลโดยมีcontentพารามิเตอร์:

- copy: content="{{ your_json_feed }}" dest=/path/to/destination/file

เอกสารที่นี่: คัดลอกโมดูล


5
content = "{{your_json_feed}}" เกี่ยวข้องกับช่องว่างและบรรทัดใหม่ คำพูดมีความสำคัญ
m.kocikowski

@RamondelaFuente ถ้าฉันต้องการเพิ่มเนื้อหา vars หลาย ๆ ไฟล์ฉันต้องใช้โมดูล "คัดลอก" หลาย ๆ ครั้งหรือมีวิธีอื่นอีกไหม
KishoreReddy

1
@KishoreReddy ฉันคิดว่าคุณสามารถใช้ไวยากรณ์ jinja2 เพื่อต่อท้ายตัวแปร บางอย่างเช่น "{{variable ~ another_variable}}" ไม่สวย แต่ถ้าสิ่งต่างๆซับซ้อนขึ้นคุณสามารถใช้template:โมดูลและเติมด้วยตัวแปรที่ลงทะเบียนในรันไทม์
Ramon de la Fuente

สิ่งนี้จะทำงานได้ดีขึ้นเมื่อคุณต้องการสร้างไฟล์ผลรวม sha256 ในรูปแบบshahash /path/to/file(หมายเหตุ 2 ช่องว่างระหว่าง) จากนั้นตรวจสอบความถูกต้องจากบรรทัดคำสั่ง (ผ่านsha256sum -c shafile) สิ่งที่คุณสร้างผ่าน Ansible
Daniel Andrei Mincă

12

จากคำตอบของ Ramon ฉันพบข้อผิดพลาด ปัญหาที่ช่องว่างใน JSON ที่ฉันพยายามเขียนฉันได้รับการแก้ไขโดยการเปลี่ยนงานใน playbook ให้มีลักษณะดังนี้:

- copy:
    content: "{{ your_json_feed }}"
    dest: "/path/to/destination/file"

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


11

จนกว่าคุณจะเขียนไฟล์ขนาดเล็กมากคุณอาจจะใช้แม่แบบ

ตัวอย่าง:

- name: copy upstart script
  template: 
    src: myCompany-service.conf.j2 
    dest: "/etc/init/myCompany-service.conf"

2
แม้ว่าคำตอบของ Ramon จะระบุสิ่งที่ถาม แต่คำตอบนี้เป็นแนวทางที่ดีที่สุดโดยทั่วไป ตัวอย่างเช่นหากคุณมีเพลย์บุ๊กที่สร้าง VM ในระบบคลาวด์และคุณต้องการสร้างพื้นที่โฆษณาของโฮสต์สำหรับเพลย์บุ๊กอื่นเทมเพลตคือวิธีที่จะไป
Luis Artola

คุณอธิบายได้ไหมว่าทำไมถึงดีกว่านี้
Vorticity

@Vorticity ดีกว่ามีอะไรบ้าง?
Janus Troelsen

@JanusTroelsen ขออภัยคุณช่วยอธิบายได้ไหมว่าเหตุใดจึงดีกว่าคำตอบที่ยอมรับเมื่อเขียนไฟล์ขนาดใหญ่
Vorticity

1
@Vorticity เพราะมันจะไม่สะดวกเมื่อคุณมีไฟล์ที่ฝังอยู่ในไฟล์อื่น คุณต้องใช้ Escape และการเน้นไวยากรณ์จะไม่ทำงาน กลไกการสร้างเทมเพลตช่วยให้สามารถแทรกสิ่งต่างๆไว้ตรงกลางได้หากคุณต้องการ
Janus Troelsen

0

เราสามารถระบุไฟล์ปลายทางได้โดยตรงด้วยdestตัวเลือกตอนนี้ ในตัวอย่างด้านล่างเอาต์พุต json จะถูกเก็บไว้ในไฟล์/tmp/repo_version_file

- name: Get repository file repo_version model to set ambari_managed_repositories=false
  uri:
    url: 'http://<server IP>:8080/api/v1/stacks/HDP/versions/3.1/repository_versions/1?fields=operating_systems/*'
    method: GET
    force_basic_auth: yes
    user: xxxxx
    password: xxxxx
    headers:
      "X-Requested-By": "ambari"
      "Content-type": "Application/json"
    status_code: 200
    dest: /tmp/repo_version_file
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.