2016-01-20 91 views
1

當我在我的劇本中標記任何特定標籤時,Ansible忽略它並執行我角色中的每個任務。我觀察到的效果與在ansible-playbook命令中標記標籤時的效果相同。顯然,這是一個簡單的例子。我正在嘗試更改LAMP堆棧配置。 這裏的作用是:Ansible跳過我的標籤

- name: install packages [Debian] 
    apt: name={{ item }} state=present 
    with_items: 
    - php5-fpm 
    - php5-mysql 
    - php5-gd 
    - php5-imagick 
    - php5-pgsql 
    when: ansible_distribution == "Debian" 
    tags: 
    - debian_install 

- name: change php configuration 
    lineinfile: dest={{ item.dest }} regexp={{ item.regexp }} line={{ item.line }} 
    with_items: 
    - { dest: '/etc/php5/fpm/php.ini', regexp: '^cgi.fix_pathinfo=', line: 'cgi.fix_pathinfo=0' } 
    tags: 
    - configure 

- name: make site directory 
    file: path={{ site_directory }} owner={{ remote_user }} group={{ remote_group }} mode=0755 state=directory 
    tags: 
    - configure 

這裏是劇本:

--- 
- hosts: webservers 
    remote_user: "{{ remote_user }}" 
    become: sudo 
    gather_facts: yes 
    vars_files: 
    - host_vars/all.yml 

    roles: 
    - { role: iptables, tags: 'configure' } 
    - { role: apache, tags: 'configure' } 
    - { role: mysql, tags: 'configure' } 
    - { role: php, tags: 'configure' } 

    post_tasks: 
    - reboot.yml 

我通過這個命令運行它:

ansible-playbook lamp.yml -i hosts 

但它仍然無法在任務中的每一個角色。 第二種方法。角色配置是相同的。劇本例如:

--- 
- hosts: webservers 
    remote_user: "{{ remote_user }}" 
    become: sudo 
    gather_facts: yes 
    vars_files: 
    - host_vars/all.yml 

    roles: 
    - iptables 
    - apache 
    - mysql 
    - php 

    post_tasks: 
    - reboot.yml 

命令例如:

ansible-playbook lamp.yml -i hosts --tags "configure" 

相同的結果。如果有利於when條件,Ansible將跳過任務。我希望這不是一個錯誤,因爲我沒有遇到任何類似的問題。認爲這是我的不好,但仍然不能認出它在哪裏。可能Ansible的用戶面臨類似的問題。請提醒我。

+1

您的第一個示例實際上並未從命令行指定標記或跳過標記,因此所有內容都將默認運行。但第二個應該是跳過適當的任務。這不是發生了什麼? – ydaetskcoR

回答

4

我相信你誤解了標籤的工作原理。如果在調用劇本時沒有提供任何標籤,則執行。

絕對沒有辦法定義只有在分配標籤通過時纔會執行的任務。如果您不希望執行這些任務或使用其他標記調用Ansible,則必須明確指定--skip-tags "debian_install"。正如@ydaetskcoR上面已經提到的那樣,通過調用--tags "configure"您的任務沒有被標記爲configure實際上應該被跳過。

如果事實並非如此,您可能會發現一個錯誤。但我沒有意識到自從我使用Ansible以來,在任何版本中都沒有任何問題(約1年,我相信1.6版本)

此問題,您無法強制Ansible僅在執行任務時提供分配的標籤,在我看來是Ansible最大的問題之一。這不僅是一個缺乏特色,而且會變得非常危險。想象一下,您有一項任務來清除數據庫,重新啓動服務,刪除用戶等等。您可能創建的任務僅在將相應標記應用於呼叫時纔會調用。然後你意外地運行沒有任何標籤的劇本。繁榮!

因此,許多人不直接致電Ansible。相反,他們使用一個簡單的bash包裝腳本,它確保所有--tags--skip-tags設置正確。默認情況下,跳過危險標籤,只有在明確調用腳本才能運行危險任務時才允許它們。

+1

要解決您的問題,您可以將任務標記爲與您的破壞性任務相同,但只是調試未定義的變量('safety'可能是個好名字)。那麼你將不得不使用extra-vars來使劇本運行。 – ydaetskcoR

+0

我清理了這個,看看它的方式。現在一切正常。Ansible標籤機制比我想象的要複雜一點,但這也是一個很好的可能性。謝謝! – cazorla19