大家好,我是藍胖子,前面一節我簡單的講了講Ansible的架構和編排任務的語法,可以發現,通過playbook方式編排任務時,能夠將任務檔案化,但是在面對比較複雜且不同業務的任務編排時,維護playbook就變得複雜,所以Ansible產生了role模式針對複雜的任務進行編排工作。今天我們就通過一個實際的案例來看看如何使用role模式。
平時我們在進行紀錄檔收集的時候,往往會在每臺機器上安裝filebeat,並且由於每臺機器執行服務的不同,那麼收集紀錄檔的組態檔也是不一樣的,如何快速高效的部署filebeat以及擁有不同的組態檔就是我們要思考的問題,當然不可能一臺機器一臺機器的修改組態檔。
接下來我將會以一個我自己寫的filebeat相關的role舉例,來分析role模式涉及的一些規範以及如何寫一個好的任務編排, 案例中的filebeat的role模式擁有對filebeat的安裝,更新設定的功能。
role其實是對之前使用playbook的檔案目錄進行了一些規範(比如必須有roles目錄且和playbook入口檔案在同一位置,roles目錄下的各個特定role的目錄也是固定命名的)。
程式碼已經上傳github
https://github.com/HobbyBear/ansible-role-filebeat.git
整個專案的目錄結構如下所示,filebeatop.yml到時候是我們執行ansible playbook命令的入口檔案,我們可以使用這樣的命令使用這個role , ansible-playbook -i hosts filebeatop.yml ,其中hosts目錄就是存放inventory主機清單。
.
├── ReadMe.md
├── filebeatop.yml
├── group_vars
│ └── test.yml
├── hosts
│ ├── prod
│ └── test
└── roles
└── filebeat
├── handlers
│ └── main.yml
├── tasks
│ ├── install.yml
│ ├── main.yml
│ ├── rpm.yml
│ └── updatecfg.yml
└── templates
├── debug.conf
├── filebeatbox.yml
└── log.yml
filebeatop.yml 的內容如下,其中roles設定項可以設定多個role,不過案例中就只設定了一個filebeat的role,這個role的名稱就是上述roles目錄下的filebeat這個資料夾的名稱。同時filebeatop.yml同時設定了變數version和logstashendpoint,不同的是version變數是role級別的。
- hosts: test
roles:
- role: filebeat
version : '7.14.2'
vars:
logstashendpoint: 192.168.0.2:5054
接著瞭解下roles目錄的結構,filebeat 就代表一個role,其下有handlers,tasks,templates目錄,它們存放的內容如下,
roles
└── filebeat
├── handlers
│ └── main.yml
├── tasks
│ ├── install.yml
│ ├── main.yml
│ ├── rpm.yml
│ └── updatecfg.yml
└── templates
├── debug.conf
├── filebeatbox.yml
└── log.yml
- include: install.yml
tags:
- install
- include: rpm.yml
tags:
- rpm
- include: updatecfg.yml
tags:
- updatecfg
become 設定為yes,become_method 設定為sudo 代表在執行這個service的命令時是要以sudo許可權執行的。
- name: restart Filebeat service
become: yes
become_method: sudo
service:
name: filebeat
enabled: yes
state: restarted
這個handler在tasks/updatecfg.yml中有被用到,如下,在更新完filebeat服務設定後,通過notify設定,定義所需的handler的名稱,便可以在特定task執行完成後執行對應的handler。
- name: 更新服務設定
shell: "sudo systemctl daemon-reload"
notify:
- restart Filebeat service
log_path: "- /home/webserver/logs/box-api/box-api.log\r\n - /home/webserver/logs/box-bsk/box-bsk.log\r\n - /home/webserver/logs/box-flow/box-flow.log"
log_type:
box
這兩個變數被 templates目錄下的log.yml檔案所參照。log.yml檔案內容如下(是一個典型的filebeat設定紀錄檔採集路徑的設定)
- type: log
tail_files: true
paths:
{{ log_path}}
fields:
log_type: {{ log_type }}
如何使用這些模板檔案呢,其實就是通過ansible的template模組,拿filebeat role中的updatecfg.yml定義的任務片段舉例,將filebeat 相關的組態檔上傳到主機上對應的目錄。
- name: 傳送組態檔
become: yes
become_method: sudo
template: src=log.yml dest=/home/webserver/local/filebeat-{{ version }}-linux-x86_64/log.yml owner=root group=root
- name: 傳送組態檔
become: yes
become_method: sudo
template: src=filebeatbox.yml dest=/home/webserver/local/filebeat-{{ version }}-linux-x86_64/filebeatbox.yml owner=root group=root