2016-01-23 55 views
3

我的Ansible手冊中有一個相當長的任務,它使用APT安裝各種軟件包。這些任務在我的筆記本上花費很長時間。有什麼方法可以讓Ansible在它遍歷包的時候「回顯」它正在安裝的哪個項目,這樣我就可以知道這個任務需要多長時間了?可以Ansible「回聲」項目,因爲它安裝它們?

- name: install global packages 
    apt: pkg={{ item }} update_cache=yes cache_valid_time=3600 
    become: True 
    become_user: root 
    with_items: 
    - git 
    - vim 
    - bash-completion 
    - bash-doc 
    - wput 
    - tree 
    - colordiff 
    - libjpeg62-turbo-dev 
    - libopenjpeg-dev 
    - zlib1g-dev 
    - libwebp-dev 
    - libffi-dev 
    - libncurses5-dev 
    - python-setuptools 
    - python-dev 
    - python-doc 
    - python-pip 
    - virtualenv 
    - virtualenvwrapper 
    - python-psycopg2 
    - postgresql-9.4 
    - postgresql-server-dev-9.4 
    - postgresql-contrib 
    - postgresql-doc-9.4 
    - postgresql-client 
    - postgresql-contrib-9.4 
    - postgresql-9.4-postgis-2.1 
    - postgis-doc 
    - postgis 
    - nginx 
    - supervisor 
    - redis-server 
+0

你用什麼命令來運行它?你添加了'-vvv'嗎? – tedder42

+0

我知道我可以使用-vvv,但它顯示出比我需要看到的更多信息。如果設置了一個標誌,只是說「正在安裝package1,正在安裝package2,...」等,那將會很不錯。 – William

+0

我遇到了同樣的問題,我使用簡單的一行修改來安裝我的軟件。對該解決方案感興趣? – helloV

回答

0

當我想要對playbook run有更多的反饋意見時,我會根據他們的目的將它們組合在一起。 cache_valid_time允許你這樣做,而不會每次都更新repo緩存。我發現這也提高了可讀性和文檔。

- name: install global packages 
    apt: pkg={{ item }} update_cache=yes cache_valid_time=3600 
    become: True 
    with_items: 
    - git 
    - vim 
    - bash-completion 
    - bash-doc 
    - wput 
    - tree 
    - colordiff 
    - libjpeg62-turbo-dev 
    - libopenjpeg-dev 
    - zlib1g-dev 
    - libwebp-dev 
    - libffi-dev 
    - libncurses5-dev 

- name: install python and friends 
    apt: pkg={{ item }} update_cache=yes cache_valid_time=3600 
    become: True 
    with_items: 
    - python-setuptools 
    - python-dev 
    - python-doc 
    - python-pip 
    - virtualenv 
    - virtualenvwrapper 
    - python-psycopg2 

- name: install postgresql 
    apt: pkg={{ item }} update_cache=yes cache_valid_time=3600 
    become: True 
    with_items: 
    - postgresql-9.4 
    - postgresql-server-dev-9.4 
    - postgresql-contrib 
    - postgresql-doc-9.4 
    - postgresql-client 
    - postgresql-contrib-9.4 
    - postgresql-9.4-postgis-2.1 

- name: install postgis 
    apt: pkg={{ item }} update_cache=yes cache_valid_time=3600 
    become: True 
    with_items: 
    - postgis-doc 
    - postgis 

- name: install nginx 
    apt: pkg=nginx update_cache=yes cache_valid_time=3600 
    become: True 

- name: install supervisor 
    apt: pkg=supervisor update_cache=yes cache_valid_time=3600 
    become: True 

- name: install redis 
    apt: pkg=redis-server update_cache=yes cache_valid_time=3600 
    become: True 
2

一般來說,Ansible實際上確實如此。它會分別輸出每個項目。這意味着:它構建一個python包,將其上傳到主機並執行它 - 用於每個項目。

aptyum模塊已針對迴路進行了優化。 Ansible不會遍歷每個項目,而是構建一個可以一次性安裝所有循環項目的程序包。

你的命令轉換爲這樣的事情:

apt-get -y install git vim bash-completion bash-doc wput ... 

因此,在這種情況下,沒有,沒有辦法輸出單獨的步驟,看看那裏Ansible是。因爲沒有單獨的步驟。

apt模塊的文檔丟失的說明這是在yum module頁面可供選擇:

當包名在劇本的循環使用,ansible優化調用yum的模塊。不是每次通過循環都調用一個包,而是使用循環中的所有包名調用該模塊一次。

當您使用遠程機器時,這實際上是一種更好的行爲。這大大加快了遊戲速度。如果你在本地運行你的劇本,當然沒有太大的好處。

一個簡單的解決方法是簡單地不使用apt模塊,但運行一個shell命令。

- name: install global packages 
    shell: apt-get -y install {{ item }} 
    become: True 
1

使用查找您的ansible安裝目錄:

> python -c 'import ansible; print ansible.__file__' 
/usr/local/lib/python2.7/dist-packages/ansible/__init__.pyc 

備份<ansible_install>/runner/__init__.py文件

/usr/local/lib/python2.7/dist-packages/ansible/runner/__init__.py 

編輯文件,搜索 '容易',並從列表中刪除 '貼切'。

if len(items) and utils.is_list_of_strings(items) and self.module_name in [ 'apt', 'yum', 'pkgng' ]: 

if len(items) and utils.is_list_of_strings(items) and self.module_name in [ 'yum', 'pkgng' ]: 

完蛋了!

+0

這是一個有趣的方法,我會檢查。不過,我並不喜歡猴子補丁。 – William

相關問題