在Solaris上,Ansible的setup
模塊不收集有關已安裝區域的信息。如何擴展setup
模塊以收集zoneadm list -iv
的輸出?如何擴展Ansible的設置模塊以收集更多信息?
回答
創建一個名爲
/etc/ansible/facts.d/zoneadm.fact
的腳本並收集您需要的任何信息。這可以是任何你想要的(bash/python/etc)。當你完成,
echo
它以標準輸出爲json格式。部署通過ansible該腳本,使其可執行
收集的事實和發現新的事實存在下
ansible_local.zoneadm
更多的相關信息,可以發現here
我〜2年前處理相同的困境。以前的答覆是正確的,但你必須在之前部署一些東西,並重新運行Ansible以獲得新的事實。
有寫自己的Ansible模塊,它返回JSON
看起來像一個選項:然後通過這樣的模塊返回
{
'changed': false,
'ansible_facts': {
'sunos': {
'zonename': 'global',
'zones': {},
}
}
事實被合併到那些從setup
模塊來。爲了更加便於攜帶,最好將此模塊包含到Ansible角色中,並且只包含一個調用此模塊的任務,並添加標記always
,即使您通過在cmdline上指定標記來選擇任務子集,也可以運行此事實集合。
我有我的舊角色pushed here on GitHub。可能不會開箱即用......與Ansible 1.0一起使用,但獲得啓發。
我誤解的原因是,我認爲,我必須在Ansible機器上放置一些東西,它會自動部署到目標系統,就像完成模塊一樣。但事實收集工作不同!一個人必須吃蛋糕,在setup
開始工作之前,fatcs收集腳本已經在目標系統上。我會說這是Ansible中的一個設計錯誤,或者至少還有一個尚未實現的功能。
要添加此缺少的功能,有必要編寫一個播放,它在所有其他事情之前工作。我想出了以下解決方案:
---
- name: facts deployment
gather_facts: false
hosts: all
become: true
tasks:
- set_fact: setup_necessary=false
- file:
path: "/etc/ansible/facts.d"
state: directory
recurse: yes
register: facts_directory
- set_fact: setup_necessary=true
when: facts_directory.changed
- name: solaris facts
gather_facts: false
hosts: solaris
become: true
tasks:
- include: deploy_fact.yml
with_items:
- { shell: bash, file: nonglobal_zones }
- { shell: bash, file: solaris_eeprom }
- name: setup after facts update
gather_facts: false
hosts: all
tasks:
- setup:
when: setup_necessary
以上的劇本做所有戲劇與gather_facts: false
,以防止任何setup
運行的事實已經部署之前。當對目標系統進行任何更改時,所有播放都設置變量setup_necessary
。這是不可能使用處理程序的,因爲處理程序在遊戲結束時運行,但不在遊戲結束時或在某些遊戲結束後運行(Ansible限制1)。
首先創建目錄,然後部署所有事實文件。有必要將外觀的主體放入單獨的任務文件中,因爲無法將兩個任務組合在一個劇本中(Ansible限制2)。
deploy_fact.yml
文件的內容使用template
模塊將事實腳本傳輸到目標系統。
---
- name: "/etc/ansible/facts.d/{{item.file}}.fact"
template:
src: "{{inventory_dir}}/facts.d/{{item.shell}}.j2"
dest: "/etc/ansible/facts.d/{{item.file}}.fact"
mode: 0755
register: facts_file
- set_fact: setup_necessary=true
when: facts_file.changed
爲什麼我用template
模塊,每一個事實腳本需要某種形式的錯誤處理這需要照顧,適當的JSON得到一個錯誤的情況下產生的原因。這是我目前的錯誤處理,但仍可以改進。有些人也不喜歡set -eu
,這在某種程度上是品味的問題。
#! /bin/bash
{% include item.file + '.bash' %}
set -eu
_stderr=$(mktemp)
trap 'rm -f "$_stderr"' EXIT
if _stdout=$(main 2>$_stderr); then
if [ "$_stdout" ]; then
echo "$_stdout"
else
echo null
fi
else
jq -Rsc "{\"ERROR\":{\"failed\":true,\"exit\":$?,\"msg\":.}}" $_stderr
fi
模板什麼也不做的不僅僅是包括通過隱item
變量由循環傳遞的文件更多。包裝器期望從包含的文件中定義一個main
函數。這是我對非全局區域的主要功能:
main()
{
zoneadm list -i |
grep -v global |
jq -Rc . |
jq -sc .
}
而這其中收集了Solaris EEPROM數據:
main()
{
eeprom |
sed 's/^\([^=]*\)=\(.*\)$/{"\1":"\2"}/' |
sed 's/^\(.*\): data not available.$/{"\1":null}/' |
sed 's/:"false"}$/:false}/g' |
sed 's/:"true"}$/:true}/g' |
sed 's/:"\([0-9][0-9]*\)"}$/:\1}/' |
sed '/^{"boot-device"/{s/":"/":["/;s/ /","/g;s/"}$/"]}/;}' |
jq -sc add
}
我的底線是,它在某種程度上可以延長Ansible的事實收集,但它遠非明顯,並且有點痛苦,因爲它不可能臨時使用setup
模塊。 Ansible不要求用戶實現上述內容,而應將以上所有內容移至setup
模塊(Ansible限制3)。
- 1. 更多信息 - 擴展div
- 2. 開發的Ansible模塊是否可以包含或擴展Ansible核心模塊?
- 3. 如何使用ansible收集所有EC2卷的信息?
- 4. Braintree-javascript - 收集更多客戶信息?
- 5. 如何收集類似信息,以panopticlick.eff.org
- 6. Spring多模塊i18n,模塊擴展消息源內容
- 7. 需要擴展DateDiff以獲取更多詳細信息
- 8. 如何擴展nodejs模塊
- 9. 更新mysql和設置信息塊
- 10. 集的版本信息不安裝MSBuild擴展包爲DotNetNuke模塊創建
- 11. Ansible - 我可以在模塊執行期間打印信息嗎?
- 12. 如何擴展Magento API catalog_product.list以包含更多產品信息XML-RPC
- 13. 如何收集信用卡信息
- 14. 如何設置頻率以收集Android中的位置更新?
- 15. 擴展模塊
- 16. 如何訪問收集擴展中的收集成員標籤
- 17. Ansible設置模塊出現故障
- 18. elasticsearch集羣設置信息
- 19. 如何收集每個CPU的信息?
- 20. Arraylist信息收集
- 21. 如何設置Postgres擴展?
- 22. 如何訪問Django中的模板來擴展用戶信息?
- 23. 擴展一個擴展類的模塊
- 24. Node.js創建一個模塊來收集內存(RAM)信息?
- 25. 怎麼幹很多模塊的擴展
- 26. 擴展django.contrib.auth模塊
- 27. 擴展Haskell模塊
- 28. 擴展angularJS模塊
- 29. 模塊化擴展
- 30. Chrome擴展:鏈接收集
你是什麼意思的'靜態'?每次執行設置步驟時都會運行該腳本,即「ansible all -m setup」。 – user2599522
也許我很想理解它。此腳本是在目標主機上還是在Ansible主機上執行? – ceving
它們將在它們所在的機器上運行,這就是爲什麼@ user2599522建議您首先將事實腳本部署到所有主機。更多關於[這裏](https://docs.ansible.com/ansible/playbooks_variables.html#local-facts-facts-d)。 –