Ansible: Đặt biến thành nội dung tệp


93

Tôi đang sử dụng mô-đun ec2 với ansible-playbooktôi muốn đặt một biến cho nội dung của tệp. Đây là cách tôi hiện đang làm.

  1. Thay đổi với tên tệp
  2. tác vụ shell vào cattệp
  3. sử dụng kết quả của catđể chuyển đến mô-đun ec2.

Nội dung ví dụ trong sách vở của tôi.

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 }}"

Tôi cho rằng có một cách dễ dàng hơn nhiều để làm điều này, nhưng tôi không thể tìm thấy nó khi tìm kiếm tài liệu Ansible.


Điều này đã làm việc cho tôi. Tôi không tìm thấy cách nhúng các biến trong lệnh tra cứu (ống dẫn).
ericson.cepeda

Câu trả lời:


91

Bạn có thể sử dụng tra cứu trong Ansible để lấy nội dung của tệp, ví dụ:

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

Lưu ý: Tra cứu này sẽ hoạt động với các tệp cục bộ, không phải các tệp từ xa.

Đây là một ví dụ đầy đủ từ tài liệu :

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

90
Lưu ý rằng tra cứu chạy cục bộ, trong khi catlệnh trong ví dụ của @ TesterJeff đang chạy trên máy từ xa.
Alex Dupuy

8
Để tra cứu từ xa, hãy kiểm tra mô-đun slurp và tìm nạp
Marco Ferrari

15

Bạn có thể sử dụng mô-đun slurp để tìm nạp tệp từ máy chủ từ xa: (Cảm ơn @mlissner đã đề xuất)

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

Bạn có thể sử dụng mô-đun tìm nạp để sao chép tệp từ máy chủ từ xa sang máy cục bộ và mô-đun tra cứu để đọc nội dung của tệp đã tìm nạp.


6
Tôi hoàn toàn mới với ansible, nhưng tại sao không sử dụng slurp cho việc này? Nó dường như hoạt động trên điều khiển từ xa để lấy nội dung của tệp.
mlissner

0

tra cứu chỉ hoạt động trên localhost. Nếu bạn muốn lấy các biến từ một biến tập tin bạn đã thực hiện từ xa sử dụng include_vars: {{ varfile }}. Nội dung của {{ varfile }}phải là một từ điển của biểu mẫu {"key":"value"}, bạn sẽ thấy ansible gây rắc rối cho bạn nếu bạn bao gồm một khoảng trắng sau dấu hai chấm.


7
Thật vô nghĩa. include_varshoạt động cục bộ trên máy điều khiển, không phải với các tệp trên mục tiêu.
techraf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.