2015-10-09 14 views
5

Làm cách nào để nối một nội dung của nhiều tệp vào một biến?Ansible - cách kết nối nội dung tệp thành một biến

Đây là vấn đề: Tôi đang cố gắng đặt khóa công khai cho người dùng trên máy từ xa. Ví dụ từ authorized_key documentation rằng hầu hết các công trình:

- name: Set up authorized_keys for the deploy user 
    authorized_key: user=deploy 
        key="{{ item }}" 
    with_file: 
    - public_keys/doe-jane 
    - public_keys/doe-john 

Nhưng trong thực tế, tôi cần phải sử dụng exclusive=yes, vì vậy sau khi cập nhật tất cả các phím không được cung cấp nào được loại bỏ.

Nếu số exclusive=yes được cung cấp thì chỉ có khóa công khai cuối cùng được liệt kê trong tệp .ssh/authorized_keys (cũng được báo cáo là bug).

Tiếp cận của tôi hiện tại:

- name: create empty temporary keys file 
    local_action: "shell > /tmp/auth_keys" 

- name: concat keys to temporary file 
    local_action: "shell echo {{ item }} >> /tmp/auth_keys" 
    with_file: 
    - public_keys/doe-jane 
    - public_keys/doe-john 

- name: set up authorized_keys 
    authorized_key: user=deploy 
        key="{{ lookup('file', '/tmp/auth_keys') }}" 
        exclusive=yes 

này hoạt động nhưng hai lệnh đầu tiên luôn tạo ra "thay đổi". Ngoài ra tôi cảm thấy phải có một giải pháp thanh lịch hơn cho việc này.

Vì vậy, có cách nào để nối nội dung của nhiều tệp vào một biến không? Hoặc có cách tiếp cận nào tốt hơn nói chung cho nhiệm vụ này không?

+0

Suy nghĩ về điều này, để loại bỏ trạng thái "đã thay đổi" 'changed_when: False' có thể được thêm vào hai lệnh đầu tiên nhưng tôi vẫn không hài lòng với kết quả. –

Trả lời

6

Không có gì quá sai với tùy chọn đầu tiên của bạn, như ý kiến ​​của bạn, chỉ cần sử dụng changed_when: False để xác nhận rằng đây không phải là thứ bạn quan tâm.

Để trả lời câu tiêu đề câu hỏi thực tế bạn có thể, như đã đề cập trong GitHub "issue" bạn liên kết, chỉ cần nối các tra cứu trực tiếp trong công việc như vậy:

- name: set up authorized_keys 
    authorized_key: user=deploy 
        key="{{ lookup('file', 'public_keys/doe-jane') + lookup('file', 'public_keys/doe-john')}}" 
        exclusive=yes 

Tuy nhiên, một lựa chọn sạch hơn có thể sử dụng assemble module để nối các khóa của bạn.

này sau đó sẽ thay đổi cách tiếp cận hiện tại của bạn vào một cái gì đó giống như:

- name: create concatenated keys file 
    local_action: "assemble src=roles/ssh_keys/files/ssh_keys/ dest=/tmp/ssh_keys_file" 

- name: set up authorized_keys 
    authorized_key: user=deploy 
        key="{{ lookup('file', '/tmp/ssh_keys_file' }}" 
        exclusive=yes 

này sẽ chỉ được đánh dấu là đã thay đổi nếu các tập tin đích đã thay đổi ở tất cả để chạy nó lặp đi lặp lại một bức tường đáng yêu màu xanh lá cây .

Điều này phụ thuộc vào khóa ssh của bạn tất cả là tệp và trong cùng một thư mục (tập hợp thường được sử dụng để chuyển thư mục kiểu conf.d thành một tệp .conf duy nhất cho các chương trình không sử dụng cấu hình kiểu conf.d) nhưng đây có lẽ là cách hợp lý nhất để giữ chúng.

Lợi ích của việc này là bạn có thể chỉ cần thêm/xóa các khóa ssh khỏi thư mục được chỉ định và nó sẽ được chọn trong lần phát tiếp theo mà không cần phải thêm/xóa các khóa được xác định rõ ràng trong chính tác vụ.

+0

Cảm ơn, điều đó có ý nghĩa. Mặc dù tôi vẫn thích ví dụ xác định một danh sách các phím để dàn dựng, một để kiểm tra và một danh sách cho các nhóm máy chủ sản xuất mà không cần phải lặp lại các khóa trong kho lưu trữ. Đừng bận tâm, tôi vui vì không có giải pháp "quá rõ ràng" mà tôi không thể tìm ra;) –

+2

Như đã đề cập với khối mã đầu tiên, bạn có thể chỉ cần ghép nối tất cả các tra cứu trong biến trực tiếp và công việc. Nó trông khủng khiếp với tôi và tôi không tin rằng đó là một cách tốt để quản lý chúng nhưng nó sẽ làm chính xác như bạn muốn.Cá nhân tôi thích ý tưởng có các thư mục khác nhau đầy đủ các khóa công khai được áp dụng cho các loại môi trường khác nhau ngay cả khi có một số trùng lặp của các khóa. Bằng cách đó, nếu bạn thấy "doe-jane" trong cả thư mục dev và test, bạn biết ngay rằng Jane Doe có quyền truy cập vào dev và test. – ydaetskcoR

Các vấn đề liên quan