ตอบได้: ตั้งค่าตัวแปรเป็นเนื้อหาไฟล์


94

ฉันใช้โมดูล ec2 กับansible-playbookฉันต้องการตั้งค่าตัวแปรเป็นเนื้อหาของไฟล์ นี่คือวิธีที่ฉันกำลังทำอยู่

  1. Var กับชื่อไฟล์
  2. งานเชลล์ไปcatยังไฟล์
  3. ใช้ผลลัพธ์ของการcatส่งผ่านไปยังโมดูล ec2

ตัวอย่างเนื้อหาของ playbook ของฉัน

vars:
  amazon_linux_ami: "ami-fb8e9292"
  user_data_file: "base-ami-userdata.sh"
tasks:
- name: user_data_contents
  shell: cat {{ user_data_file }}
  register: user_data_action
- name: launch ec2-instance
  local_action:
...
  user_data: "{{ user_data_action.stdout }}"

ฉันคิดว่ามีวิธีที่ง่ายกว่านี้มาก แต่ฉันไม่พบขณะค้นหาเอกสาร Ansible


อันนี้ใช้ได้ผลสำหรับฉัน ฉันไม่พบวิธีการฝังตัวแปรในคำสั่ง lookup (ไปป์)
ericson.cepeda

คำตอบ:


93

คุณสามารถใช้การค้นหาใน Ansible เพื่อรับเนื้อหาของไฟล์เช่น

user_data: "{{ lookup('file', user_data_file) }}"

คำเตือน: การค้นหานี้จะทำงานกับไฟล์ในเครื่องไม่ใช่ไฟล์ระยะไกล

นี่คือตัวอย่างที่สมบูรณ์จากเอกสาร :

- hosts: all
  vars:
     contents: "{{ lookup('file', '/etc/foo.txt') }}"
  tasks:
     - debug: msg="the value of foo.txt is {{ contents }}"

91
โปรดทราบว่าการค้นหาจะทำงานในเครื่องขณะที่catคำสั่งในตัวอย่างของ @ TesterJeff กำลังทำงานบนเครื่องระยะไกล
Alex Dupuy

8
สำหรับการค้นหาระยะไกลตรวจสอบ slurp และเรียกโมดูล
Marco Ferrari

16

คุณสามารถใช้ โมดูลslurpเพื่อดึงไฟล์จากโฮสต์ระยะไกล: (ขอบคุณ @mlissner ที่แนะนำ)

vars:
  amazon_linux_ami: "ami-fb8e9292"
  user_data_file: "base-ami-userdata.sh"
tasks:
- name: Load data
  slurp:
    src: "{{ user_data_file }}"
  register: slurped_user_data
- name: Decode data and store as fact # You can skip this if you want to use the right hand side directly...
  set_fact:
    user_data: "{{ slurped_user_data.content | b64decode }}"

8

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


6
ฉันใหม่มากที่จะตอบได้ แต่ทำไมไม่ใช้ slurp สำหรับสิ่งนี้? ดูเหมือนว่าจะทำงานบนรีโมทเพื่อดึงเนื้อหาของไฟล์
mlissner

0

การค้นหาใช้งานได้กับ localhost เท่านั้น หากคุณต้องการที่จะดึงตัวแปรจากตัวแปรไฟล์ที่คุณทำระยะไกลใช้ {{ varfile }}include_vars: เนื้อหาของ{{ varfile }}ควรเป็นพจนานุกรมของแบบฟอร์ม {"key":"value"}คุณจะพบว่า ansible ทำให้คุณมีปัญหาหากคุณใส่ช่องว่างหลังเครื่องหมายทวิภาค


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