如何在沒有安裝(rpm)軟件包的情況下讓Ansible執行shell腳本?是否有可能利用yum模塊?如何讓Ansible在未安裝軟件包的情況下執行shell腳本
回答
我不認爲yum模塊在這種情況下會有所幫助。它目前有3個州:缺席,現在和最新。由於聽起來你不想實際安裝或移除軟件包(至少在這一點上),那麼你需要通過兩個手動步驟來完成。第一個任務將檢查包是否存在,然後第二個任務將根據第一個命令的輸出調用一個命令。
如果用「轉-q」檢查,如果再包存在輸出應該是這樣的一個存在的包:
# rpm -q httpd
httpd-2.2.15-15.el6.centos.1.x86_64
像這樣如果包不存在:
# rpm -q httpdfoo
package httpdfoo is not installed
所以你ansible任務將是這個樣子:
- name: Check if foo.rpm is installed
command: rpm -q foo.rpm
register: rpm_check
- name: Execute script if foo.rpm is not installed
command: somescript
when: rpm_check.stdout.find('is not installed') != -1
rpm命令也會用0,如果包存在,或1出口如果沒有找到該包,因此另一種可能性是使用:
when: rpm_check.rc == 1
基於上述布魯斯P答覆,對易於/ DEB文件類似的方法是
- name: Check if foo is installed
command: dpkg-query -l foo
register: deb_check
- name: Execute script if foo is not installed
command: somescript
when: deb_check.stdout.find('no packages found') != -1
與此相關。
將所有內容放在一起,完整的劇本爲Debian
(Ubuntu的),這隻有當它已經安裝更新包:
---
- name: Update package only if already installed (Debian)
hosts: all
sudo: yes
tasks:
- name: Check if Package is installed
shell: dpkg-query -W -f='${Status}' {{ package }} | grep 'install ok installed'
register: is_installed
failed_when: no
changed_when: no
- name: Update Package only if installed
apt:
name: {{ package }}
state: latest
update_cache: yes
when: is_installed.rc == 0
可悲的是Ansible仍然沒有內置的支持,使簡單的包更新,見例如: https://github.com/ansible/ansible/issues/10856
正如[注意下文](https://stackoverflow.com/a/36405647/2192488)所示,使用'shell:dpkg --status {{package}} | grep'install ok installed''比使用'command :dpkg-query -l {{package}}'。 –
您不應該使用dpkg -l package
,因爲它不知道您的軟件包是否已被刪除或仍然安裝。
相反,它可能更好使用dpkg -s package
。
要檢查是否安裝了軟件包:
- shell: dpkg -s package | grep 'install ok installed'
或者,如果你不介意擱置或其他國家的包裝:
- shell: dpkg -s package | grep 'installed'
這回安裝時0和1,如果不是。
(使用shell是很重要的,因爲我們使用的是管道|
)
如果包是通過系統的包管理器安裝(YUM,APT等)本身,那麼你可以使用支票模式標誌可以註冊安裝狀態而無需實際安裝軟件包。
- name: check if package is installed
package:
name: mypackage
state: present
check_mode: true
register: mypackage_check
- name: run script if package installed
shell: myscript.sh
when: not mypackage_check.changed
我發現使用shell或命令模塊不是「ansiblic」。
我更願意使用yum模塊和json_query過濾器來檢查包是否已安裝。例如。 httpd包:
- yum:
list: httpd
register: apache_service
- assert:
that:
- "'installed' in apache_service|json_query('results[*].yumstate')"
msg: 'httpd is not installed'
- 1. 如何在不「安裝」的情況下下載Anaconda軟件包?
- 2. 如何在不安裝R的情況下加載軟件包?
- 3. 如何在沒有安靜標誌的情況下運行軟件包安裝
- 4. 如何在Ansible中定義要安裝的軟件包版本
- 5. 在Ansible有條件安裝軟件包
- 6. 如何在沒有CronJob的情況下安排Unix Shell腳本
- 7. 在不依賴的情況下安裝python軟件包
- 8. 在沒有setup.py的情況下安裝github軟件包?
- 9. Jenkins在構建失敗的情況下不執行shell腳本
- 10. 只有在尚未安裝的情況下,如何全局安裝npm軟件包?
- 11. 如何讓vcredist_x86只在尚未安裝的情況下重新安裝?
- 12. 如何在沒有Internet連接的情況下在ActivePerl中安裝軟件包?
- 13. 如何在不依賴的情況下在作曲家中安裝軟件包
- 14. 軟件包安裝過程中執行R腳本
- 15. python如何讓bash腳本在不可執行的情況下運行?
- 16. Intellij如何在未安裝任何JRE的情況下運行?
- 17. rpmbuild:如何在不安裝%install的情況下構建軟件包?
- 18. 如何在沒有Cabal或Cabal-Install的情況下安裝軟件包/庫?
- 19. NuGET問題。如何在沒有Nuget的情況下安裝軟件包
- 20. 如何從已安裝的NPM軟件包運行腳本?
- 21. 在沒有安裝Robot的情況下運行Rational Robot腳本
- 22. 無法使用Ansible安裝軟件包
- 23. 如何在本地安裝軟件包?
- 24. 如何在本地安裝軟件包?
- 25. 如何在不移除本地安裝的npm軟件包的情況下對模塊進行壓縮
- 26. Nix shell:如何列出已安裝的Haskell軟件包版本
- 27. 如何在不執行的情況下加載腳本內容?
- 28. 如何在不訪問頁面的情況下執行腳本
- 29. OPAM:如何在不重新下載的情況下在本地重新安裝軟件包?
- 30. 如何在不被調用的情況下執行包含的腳本?
該命令的問題是,如果'rpm -q'退出0(沒有找到包),該劇本將失敗。爲了防止在任務中附加:'ignore_errors:True',以便在後續任務中使用輸出來安裝rpm。 – romanofski
此外,您可能想要添加'changed_when:no'來強制命令模塊不要說某些事情已經改變。 – Alicia
另外,爲避免找不到軟件包時的失敗消息,您可以設置'failed_when:rpm_check.rc> 1'。 – Alicia