2015-02-19 4 views
13

मैं एक फ़ाइल की सामग्री को पढ़ने की कोशिश कर रहा हूं, इन्हें एक चर में संग्रहित करता हूं और फिर उन्हें किसी अन्य फ़ाइल में डालने का प्रयास करता हूं यदि वे पहले से मौजूद नहीं हैं।lineinfile मॉड्यूल में फ़ाइल नाम और फ़ाइल सामग्री के लिए चर का उपयोग करना

# Create a variable that represents the path to the file that you want to read from 
ssh_public_key_file: '../../jenkins_master/files/{{ hostvars[inventory_hostname]["environment"] }}/id_rsa.pub' 

# Create a variable that represents the contents of this file: 
ssh_public_key: "{{ lookup('file', '{{ ssh_public_key_file }}') }}" 

मैं तो इस प्रकार मेरी Ansible प्लेबुक में इन चर का उपयोग:

- name: Install SSH authorized key 
    lineinfile: create=yes dest=~/.ssh/authorized_keys line=" {{ ssh_public_key }}" mode=0644 

लेकिन जब मैं कोशिश,

तो, मैं इस बारे में जाने का प्रयास कर रहा हूँ इस प्रकार है और प्लेबुक चलाएं, मुझे निम्न त्रुटि संदेश मिलता है:

could not locate file in lookup: {{ ssh_public_key_file }} 

क्या कोई भी समाधान की सिफारिश कर सकता है n या सुझाव है कि मैंने क्या गलत किया होगा?

धन्यवाद,

शॉन

+0

मुझे लगता है jinja2 एकल उद्धरण के अंदर का विस्तार नहीं करता है: क्या आप इसे इस तरह से कर सकते हैं चर और तार जोड़ की जरूरत है

# Create a variable that represents the contents of this file: ssh_public_key: "{{ lookup('file', ssh_public_key_file) }}" 

। हालांकि उस पर 100% निश्चित नहीं है। किसी भी मामले में, कृपया lineinfile के बजाय 'टेम्पलेट' मॉड्यूल का उपयोग करें। यह लाइन के नीचे बहुत कम गन्दा होगा। – tedder42

+0

अरे @ सेन क्या आपको अपनी समस्या का समाधान मिला? मेरे पास वर्तमान में एक ही समस्या है और शायद आप अपना समाधान मुझे/दूसरों को साझा कर सकते हैं। धन्यवाद – ByteNudger

उत्तर

1

सबसे पहले मुझे यकीन है कि अपने ssh_public_key_file चर ठीक से सेट किया गया है जाएगा। यदि आप निम्न कार्य जैसे कार्य जोड़ते हैं तो यह क्या दिखाता है?

- name: display variable 
    debug: var=ssh_public_key_file 

उत्पादन इस तो चर ठीक से परिभाषित नहीं है की तरह कुछ लग रहा है (। उदाहरण के लिए "पर्यावरण" वास्तव मेजबान के लिए मौजूद नहीं है):

ok: [localhost] => { 
    "ssh_public_key_file": "../../jenkins_master/files/{{ hostvars[inventory_hostname][\"environment\"] }}/id_rsa.pub" 
} 

लेकिन अगर सब कुछ है

ok: [localhost] => { 
    "ssh_public_key_file": "../../jenkins_master/files/foo/id_rsa.pub" 
} 

सत्यापित करने के बाद कि उसके बाद मैं अपनेसाथ एक ही बात करना होगा: ठीक से परिभाषित फिर अपने उत्पादन चर दिखाना चाहिए उनके सही मानों से बदल 10 चर। डीबग मॉड्यूल का उपयोग करके बस अपना मान आउटपुट करें। इसे सार्वजनिक कुंजी फ़ाइल की सामग्री के रूप में प्रदर्शित करना चाहिए।

एक और चीज जो मैं दृढ़ता से सुझाव दूंगा वह लाइनिनफाइल का उपयोग करने से बचने के लिए है। चूंकि आप एसएसएच कुंजी के साथ काम कर रहे हैं, इसलिए मैं आपको authorized_key मॉड्यूल का उपयोग करने की सलाह दूंगा। यह अधिकृत_की फ़ाइलों को प्रबंधित करने का एक बहुत साफ तरीका है।

15

आप के लिए लाइन बदलने के लिए:

# Example with two variables 
ssh_public_key: "{{ lookup('file', var_1+var_2) }}" 

# Example with string and variable 
ssh_public_key: "{{ lookup('file", '~/config/'+var_1) }}" 
संबंधित मुद्दे