ansible學習系列之tags的使用

ansible系列文章

ansible學習系列之tags的使用
ansible學習系列之順利啓動後臺程序
ansible學習系列之make模塊的使用
ansible學習系列之become的使用
ansible學習系列之lineinfile模塊的使用

場景

最近一段時間,準備使用Ansible編寫批量部署腳本,比如多主機批量部署程序,並實現批量啓動、終止程序等功能。那怎麼在一個role裏面就可以實現這些要求呢?那麼這個時候可以考慮tags來實現這種情況。

環境

軟件 版本
Ansible 2.9.4
Python 2.7.5
Centos 7

原因

在一個比較大的ansible-playbook裏面,如果要實現某部分腳本的話,ansible提供了Tags這個屬性來進行劃分。詳細的文檔可以查看官方文檔裏面的 playbooks_tags

嘗試

接下來就是進行一些試驗。

編寫Role腳本

我這裏是寫測試樣例,所以roletagTest,項目層級的話,是以下:

tagTest
├── tasks
│   ├── file2.yml
│   ├── file.yml
│   └── main.yml

這裏展示具體的文件內容:

[root@namenode01 tasks]# cat file.yml 
- name: test1
  shell: echo test1
  tags:
      - test1
 
- name: test2
  shell: echo test2
  tags:
      - test2
[root@namenode01 tasks]# cat file2.yml 
- name: test1
  shell: echo test1-1
  tags:
      - test1
 
- name: test3
  shell: echo test3
  tags:
      - test3
[root@namenode01 tasks]# cat main.yml 
- import_tasks: file.yml
  when:  ansible_os_family == "RedHat"
- import_tasks: file2.yml
  when:  ansible_os_family == "RedHat"
  tags:
      - test1
[root@namenode01 tasks]# pwd
/etc/ansible/roles/tagTest/tasks

使用不同標籤進行測試

使用test1標籤進行測試

  1. 腳本

    [root@namenode01 ansible-script]# ansible-playbook -i hosts_test2 --tags test1 test-tag.yml  --verbose
    
  2. 結果

    Using /etc/ansible/ansible.cfg as config file
    
    PLAY [test] ********************************************************************************************************************************************************
    
    TASK [Gathering Facts] *********************************************************************************************************************************************
    ok: [172.168.63.59]
    ok: [172.168.63.61]
    ok: [172.168.63.60]
    
    TASK [tagTest : test1] *********************************************************************************************************************************************
    changed: [172.168.63.59] => {"changed": true, "cmd": "echo test1", "delta": "0:00:00.063203", "end": "2020-04-13 15:38:03.050230", "rc": 0, "start": "2020-04-13 15:38:02.987027", "stderr": "", "stderr_lines": [], "stdout": "test1", "stdout_lines": ["test1"]}
    changed: [172.168.63.61] => {"changed": true, "cmd": "echo test1", "delta": "0:00:00.065364", "end": "2020-04-13 15:38:03.080510", "rc": 0, "start": "2020-04-13 15:38:03.015146", "stderr": "", "stderr_lines": [], "stdout": "test1", "stdout_lines": ["test1"]}
    changed: [172.168.63.60] => {"changed": true, "cmd": "echo test1", "delta": "0:00:00.058939", "end": "2020-04-13 15:38:03.962310", "rc": 0, "start": "2020-04-13 15:38:03.903371", "stderr": "", "stderr_lines": [], "stdout": "test1", "stdout_lines": ["test1"]}
    
    TASK [tagTest : test1] *********************************************************************************************************************************************
    changed: [172.168.63.59] => {"changed": true, "cmd": "echo test1-1", "delta": "0:00:00.063451", "end": "2020-04-13 15:38:04.472465", "rc": 0, "start": "2020-04-13 15:38:04.409014", "stderr": "", "stderr_lines": [], "stdout": "test1-1", "stdout_lines": ["test1-1"]}
    changed: [172.168.63.61] => {"changed": true, "cmd": "echo test1-1", "delta": "0:00:00.064136", "end": "2020-04-13 15:38:04.532075", "rc": 0, "start": "2020-04-13 15:38:04.467939", "stderr": "", "stderr_lines": [], "stdout": "test1-1", "stdout_lines": ["test1-1"]}
    changed: [172.168.63.60] => {"changed": true, "cmd": "echo test1-1", "delta": "0:00:00.059969", "end": "2020-04-13 15:38:05.368457", "rc": 0, "start": "2020-04-13 15:38:05.308488", "stderr": "", "stderr_lines": [], "stdout": "test1-1", "stdout_lines": ["test1-1"]}
    
    TASK [tagTest : test3] *********************************************************************************************************************************************
    changed: [172.168.63.59] => {"changed": true, "cmd": "echo test3", "delta": "0:00:00.062303", "end": "2020-04-13 15:38:05.896648", "rc": 0, "start": "2020-04-13 15:38:05.834345", "stderr": "", "stderr_lines": [], "stdout": "test3", "stdout_lines": ["test3"]}
    changed: [172.168.63.61] => {"changed": true, "cmd": "echo test3", "delta": "0:00:00.066197", "end": "2020-04-13 15:38:05.936347", "rc": 0, "start": "2020-04-13 15:38:05.870150", "stderr": "", "stderr_lines": [], "stdout": "test3", "stdout_lines": ["test3"]}
    changed: [172.168.63.60] => {"changed": true, "cmd": "echo test3", "delta": "0:00:00.059126", "end": "2020-04-13 15:38:06.799436", "rc": 0, "start": "2020-04-13 15:38:06.740310", "stderr": "", "stderr_lines": [], "stdout": "test3", "stdout_lines": ["test3"]}
    
    PLAY RECAP *********************************************************************************************************************************************************
    172.168.63.59              : ok=4    changed=3    unreachable=0    failed=0   
    172.168.63.60              : ok=4    changed=3    unreachable=0    failed=0   
    172.168.63.61              : ok=4    changed=3    unreachable=0    failed=0   
    

使用test2標籤進行測試

  1. 腳本

    [root@namenode01 ansible-script]# ansible-playbook -i hosts_test2 --tags test2 test-tag.yml  --verbose
    
  2. 結果

    Using /etc/ansible/ansible.cfg as config file
    
    PLAY [test] ********************************************************************************************************************************************************
    
    TASK [Gathering Facts] *********************************************************************************************************************************************
    ok: [172.168.63.61]
    ok: [172.168.63.59]
    ok: [172.168.63.60]
    
    TASK [tagTest : test2] *********************************************************************************************************************************************
    changed: [172.168.63.59] => {"changed": true, "cmd": "echo test2", "delta": "0:00:00.063807", "end": "2020-04-13 15:36:40.430624", "rc": 0, "start": "2020-04-13 15:36:40.366817", "stderr": "", "stderr_lines": [], "stdout": "test2", "stdout_lines": ["test2"]}
    changed: [172.168.63.61] => {"changed": true, "cmd": "echo test2", "delta": "0:00:00.063950", "end": "2020-04-13 15:36:40.432991", "rc": 0, "start": "2020-04-13 15:36:40.369041", "stderr": "", "stderr_lines": [], "stdout": "test2", "stdout_lines": ["test2"]}
    changed: [172.168.63.60] => {"changed": true, "cmd": "echo test2", "delta": "0:00:00.060464", "end": "2020-04-13 15:36:41.352903", "rc": 0, "start": "2020-04-13 15:36:41.292439", "stderr": "", "stderr_lines": [], "stdout": "test2", "stdout_lines": ["test2"]}
    
    PLAY RECAP *********************************************************************************************************************************************************
    172.168.63.59              : ok=2    changed=1    unreachable=0    failed=0   
    172.168.63.60              : ok=2    changed=1    unreachable=0    failed=0   
    172.168.63.61              : ok=2    changed=1    unreachable=0    failed=0 
    

使用test3標籤進行測試

  1. 腳本

    [root@namenode01 ansible-script]# ansible-playbook -i hosts_test3 --tags test1 test-tag.yml  --verbose
    
  2. 結果

    Using /etc/ansible/ansible.cfg as config file
    
    PLAY [test] ********************************************************************************************************************************************************
    
    TASK [Gathering Facts] *********************************************************************************************************************************************
    ok: [172.168.63.59]
    ok: [172.168.63.61]
    ok: [172.168.63.60]
    
    TASK [tagTest : test3] *********************************************************************************************************************************************
    changed: [172.168.63.59] => {"changed": true, "cmd": "echo test3", "delta": "0:00:00.062268", "end": "2020-04-13 15:37:50.524353", "rc": 0, "start": "2020-04-13 15:37:50.462085", "stderr": "", "stderr_lines": [], "stdout": "test3", "stdout_lines": ["test3"]}
    changed: [172.168.63.61] => {"changed": true, "cmd": "echo test3", "delta": "0:00:00.063547", "end": "2020-04-13 15:37:50.563405", "rc": 0, "start": "2020-04-13 15:37:50.499858", "stderr": "", "stderr_lines": [], "stdout": "test3", "stdout_lines": ["test3"]}
    changed: [172.168.63.60] => {"changed": true, "cmd": "echo test3", "delta": "0:00:00.061710", "end": "2020-04-13 15:37:51.493069", "rc": 0, "start": "2020-04-13 15:37:51.431359", "stderr": "", "stderr_lines": [], "stdout": "test3", "stdout_lines": ["test3"]}
    
    PLAY RECAP *********************************************************************************************************************************************************
    172.168.63.59              : ok=2    changed=1    unreachable=0    failed=0   
    172.168.63.60              : ok=2    changed=1    unreachable=0    failed=0   
    172.168.63.61              : ok=2    changed=1    unreachable=0    failed=0    
    

不使用標籤進行測試

  1. 腳本

    [root@namenode01 ansible-script]# ansible-playbook -i hosts_test2  test-tag.yml  --verbose
    
  2. 結果

    Using /etc/ansible/ansible.cfg as config file
    
    PLAY [test] ********************************************************************************************************************************************************
    
    TASK [Gathering Facts] *********************************************************************************************************************************************
    ok: [172.168.63.61]
    ok: [172.168.63.59]
    ok: [172.168.63.60]
    
    TASK [tagTest : test1] *********************************************************************************************************************************************
    changed: [172.168.63.59] => {"changed": true, "cmd": "echo test1", "delta": "0:00:00.063505", "end": "2020-04-13 15:40:12.165152", "rc": 0, "start": "2020-04-13 15:40:12.101647", "stderr": "", "stderr_lines": [], "stdout": "test1", "stdout_lines": ["test1"]}
    changed: [172.168.63.61] => {"changed": true, "cmd": "echo test1", "delta": "0:00:00.084014", "end": "2020-04-13 15:40:12.175715", "rc": 0, "start": "2020-04-13 15:40:12.091701", "stderr": "", "stderr_lines": [], "stdout": "test1", "stdout_lines": ["test1"]}
    changed: [172.168.63.60] => {"changed": true, "cmd": "echo test1", "delta": "0:00:00.080854", "end": "2020-04-13 15:40:13.160343", "rc": 0, "start": "2020-04-13 15:40:13.079489", "stderr": "", "stderr_lines": [], "stdout": "test1", "stdout_lines": ["test1"]}
    
    TASK [tagTest : test2] *********************************************************************************************************************************************
    changed: [172.168.63.59] => {"changed": true, "cmd": "echo test2", "delta": "0:00:00.069887", "end": "2020-04-13 15:40:13.678837", "rc": 0, "start": "2020-04-13 15:40:13.608950", "stderr": "", "stderr_lines": [], "stdout": "test2", "stdout_lines": ["test2"]}
    changed: [172.168.63.61] => {"changed": true, "cmd": "echo test2", "delta": "0:00:00.065877", "end": "2020-04-13 15:40:13.738946", "rc": 0, "start": "2020-04-13 15:40:13.673069", "stderr": "", "stderr_lines": [], "stdout": "test2", "stdout_lines": ["test2"]}
    changed: [172.168.63.60] => {"changed": true, "cmd": "echo test2", "delta": "0:00:00.070286", "end": "2020-04-13 15:40:14.603479", "rc": 0, "start": "2020-04-13 15:40:14.533193", "stderr": "", "stderr_lines": [], "stdout": "test2", "stdout_lines": ["test2"]}
    
    TASK [tagTest : test1] *********************************************************************************************************************************************
    changed: [172.168.63.59] => {"changed": true, "cmd": "echo test1-1", "delta": "0:00:00.069873", "end": "2020-04-13 15:40:15.180646", "rc": 0, "start": "2020-04-13 15:40:15.110773", "stderr": "", "stderr_lines": [], "stdout": "test1-1", "stdout_lines": ["test1-1"]}
    changed: [172.168.63.61] => {"changed": true, "cmd": "echo test1-1", "delta": "0:00:00.070462", "end": "2020-04-13 15:40:15.211153", "rc": 0, "start": "2020-04-13 15:40:15.140691", "stderr": "", "stderr_lines": [], "stdout": "test1-1", "stdout_lines": ["test1-1"]}
    changed: [172.168.63.60] => {"changed": true, "cmd": "echo test1-1", "delta": "0:00:00.062694", "end": "2020-04-13 15:40:16.162865", "rc": 0, "start": "2020-04-13 15:40:16.100171", "stderr": "", "stderr_lines": [], "stdout": "test1-1", "stdout_lines": ["test1-1"]}
    
    TASK [tagTest : test3] *********************************************************************************************************************************************
    changed: [172.168.63.59] => {"changed": true, "cmd": "echo test3", "delta": "0:00:00.066313", "end": "2020-04-13 15:40:16.691095", "rc": 0, "start": "2020-04-13 15:40:16.624782", "stderr": "", "stderr_lines": [], "stdout": "test3", "stdout_lines": ["test3"]}
    changed: [172.168.63.61] => {"changed": true, "cmd": "echo test3", "delta": "0:00:00.066483", "end": "2020-04-13 15:40:16.740898", "rc": 0, "start": "2020-04-13 15:40:16.674415", "stderr": "", "stderr_lines": [], "stdout": "test3", "stdout_lines": ["test3"]}
    changed: [172.168.63.60] => {"changed": true, "cmd": "echo test3", "delta": "0:00:00.059252", "end": "2020-04-13 15:40:17.580180", "rc": 0, "start": "2020-04-13 15:40:17.520928", "stderr": "", "stderr_lines": [], "stdout": "test3", "stdout_lines": ["test3"]}
    
    PLAY RECAP *********************************************************************************************************************************************************
    172.168.63.59              : ok=5    changed=4    unreachable=0    failed=0   
    172.168.63.60              : ok=5    changed=4    unreachable=0    failed=0   
    172.168.63.61              : ok=5    changed=4    unreachable=0    failed=0
    

結果

都已經跑通,從上面的測試我們可以得到以下幾點:

  1. 如果只是在tasks裏面的某個細節文件裏面指定了tag,並且腳本執行的時候,有指定特定的tag,就會根據tag只執行對應的腳本;
  2. tag存在繼承關係,作用域大的角色會覆蓋作用域小的角色。即如果在main.yml指定了某個文件爲某個tag,那某個文件裏面的腳本都會執行,而不會根據文件裏面那個tag來進行過濾;
  3. 如果沒有指定tag,則全部腳本都會執行;

總結

使用ansible編寫批量部署的腳本,很節省時間。如果大家有弄過運維,特別是機器數一多,如果不斷登錄再執行操作,會很痛苦的。ansible提供了不錯的處理手段。我建議大家可以學一下,很有好處的。

參考文檔

Ansible官方文檔
Ansible中文權威指南

隨緣求贊

如果我的文章對大家產生了幫忙,可以在文章底部點個贊或者收藏;
如果有好的討論,可以留言;
如果想繼續查看我以後的文章,可以左上角點擊關注

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章