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中文权威指南

随缘求赞

如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;
如果有好的讨论,可以留言;
如果想继续查看我以后的文章,可以左上角点击关注

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