Ansible

Ansible 在使用查找函式進行模板化時發生未處理的異常

  • October 7, 2022

我目前正在建構一個劇本來測試是否存在一些 conf 文件,然後檢查內容。文件如下

  • /etc/resolv.conf - 然後檢查名稱伺服器是否配置正確
  • /etc/systemd/timesyncd.conf - 檢查是否已配置某些內容
  • /etc/ntp.conf - 還要檢查是否已配置某些內容

.yml 程式碼如下,您可以看到每次檢查的任務都是相同的,如果需要,只需重新配置文件路徑和正則表達式部分。

 tasks:
   # RESOLV.CONF
   - name: Check if resolv.conf exist
     stat:
       path: /etc/resolv.conf
     register: resolv_conf

   - name: Retrieve nameservers
     debug:
       msg: "{{ contents }}"
     vars:
       contents: "{{ lookup('file', '/etc/resolv.conf') | regex_findall('\\s*nameserver\\s*(.*)') }}"
     when: resolv_conf.stat.exists == True

   # NTP.CONF
   - name: check if ntp.conf exists
     stat:
       path: /etc/ntp.conf
     register: ntp_conf

   - name: retrieve ntp conf server content
     debug:
       msg: "{{ contents }}"
     vars:
       contents: "{{ lookup('file', '/etc/ntp.conf') | regex_search('^server.*') }}"
     when: ntp_conf.stat.exists == True

   # TIMESYNC.CONF
   - name: check if timesyncd
     stat:
       path: /etc/systemd/timesyncd.conf 
     register: timesyncd_conf 

   - name: Affiche le contenu de timesyncd.conf s'il est configure
     debug:
       msg: "{{ contents }}"
     vars:
       contents: "{{ lookup('file', '/etc/systemd/timesyncd.conf') | regex_search('^NTP=.*') }}"
     when: timesyncd_conf.stat.exists == True

除了關於 NTP.CONF 檢查失敗並顯示以下內容的任務外,這些任務執行良好:

vendredi 07 octobre 2022  08:28:07 +0200 (0:00:00.509)       0:00:05.115 ******
[WARNING]: Unable to find '/etc/ntp.conf' in expected paths (use -vvvvv to see paths)
fatal: [my_server]: FAILED! => {"msg": "An unhandled exception occurred while templating '{{ lookup('file', '/etc/ntp.conf') | regex_search('^server.*') }}'. Error was a <class 'ansible.errors.AnsibleError'>, original message: An unhandled exception occurred while running the lookup plugin 'file'. Error was a <class 'ansible.errors.AnsibleError'>, original message: could not locate file in lookup: /etc/ntp.conf. could not locate file in lookup: /etc/ntp.conf"}

我不明白為什麼它會失敗,因為我使用相同的功能,使用者和文件獲得了相同的權限,在 /etc/. 此外,我很快嘗試對“cat”做同樣的事情,它有效:

- name: check ntp.conf content  
     command: "cat /etc/ntp.conf"
     register: ntp_conf_contenu
   - debug:
       msg:
       - " {{ ntp_conf_contenu  | regex_findall ('server') }}"

你知道它為什麼失敗嗎?

非常感謝 !

查找不在遠端主機上執行,而是在本地執行。

文件中

與所有模板一樣,查找在 Ansible 控制機器上執行和評估。

因此,您檢查文件是否存在於遠端機器上,然後從執行劇本的本地機器上讀取它。

要從遠端機器讀取文件,您可以使用slurp 模組

引用自:https://serverfault.com/questions/1112457