ansible-role角色

不太聪明的大鹅發表於2024-03-15

ansible-role角色

官網文件
https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html

ansible-role的實際理念

為什麼要用role

把單個的大劇本,拆分為小劇本,便於維護,修改、使用

完成解耦、結構更清晰、除錯更方便

如果是小部署, 還是劇本更方便
大型專案,必須透過role管理

在實際的工作當中,一個完整的專案實際上是很多功能體的組合,如果將所有的功能寫在一個playbook中會存在如程式碼耦合程度高、playbook長而維護成本大、靈活性低等一系列的問題。

使用roles能巧妙的解決這一系列的問題。

roles是ansible1.2版本後加入的新功能,適合於大專案playbook的編排架構。

role解決了什麼問題

把單個的大劇本,拆分為小劇本,便於維護,修改、使用

完成解耦、結構更清晰、除錯更方便

在實際的工作當中,一個完整的專案實際上是很多功能體的組合,如果將所有的功能寫在一個playbook中會存在如程式碼耦合程度高、playbook長而維護成本大、靈活性低等一系列的問題。

使用roles能巧妙的解決這一系列的問題。

roles是ansible1.2版本後加入的新功能,適合於大專案playbook的編排架構。

角色目錄規劃

一個完整的roles是由task、handlers、files、vars、templates、meta等一系列目錄組成,各目錄存放不同的檔案實現不同的功能,在呼叫時直接下檔名即可呼叫。

參考官網即可,且必須按照如下的目錄格式來,不是隨便定義的
https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html#role-directory-structure

Ansible 角色具有定義的目錄結構,其中包含八個主要的標準目錄。您必須在每個角色中至少包含其中一個目錄。您可以省略角色不使用的任何目錄。例如如下的官網示例

# playbooks
site.yml
webservers.yml
fooservers.yml
roles/
    common/
        tasks/
        handlers/
        library/
        files/
        templates/
        vars/
        defaults/
        meta/
    webservers/
        tasks/
        defaults/
        meta/

具體role的用法

1.難度會大大降低
role理念就是把你以前部署的playbook進行拆分,拆成固定的目錄格式


2. 你來了新任務,直接基於role去部署


等於
ad-hoc 臨時命令
再去寫成palybook

先明確,建立好role的規範目錄

1.定義好role存放路徑
[root@master-61 /etc/ansible]#grep '^role' /etc/ansible/ansible.cfg 
roles_path    = /etc/ansible/roles


2. 建立role的固定目錄
# yuchaoit.cn  ansible-role
site.yml                    # role入口
nfs_servers.yml             # role
rsync_servers.yml           # role
roles/                      # role規範目錄結構
    nfs_servers/            # role具體名字
        tasks/              # 劇本任務
        handlers/           # 劇本里存放的handlers
        files/              # 如壓縮檔案,如需要複製的檔案
        templates/          # 存放配置檔案
        vars/               # 存放變數檔案
    rsync_servers/
        tasks/
        handlers/
        files/
        templates/
        vars/
        
3. 建立如上的目錄結構

mkdir -p /etc/ansible/roles
# 這裡定義的檔名,必須和roles目錄下的每一個任務目錄同名
touch  /etc/ansible/{site.yml,nfs_servers.yml,rsync_servers.yml}

4. 建立關於rsync_servers的目錄
mkdir -p /etc/ansible/roles/rsync_servers/{tasks,handlers,files,templates,vars}


5.檢查建立好的目錄結構
[root@master-61 /etc/ansible]#tree /etc/ansible/
/etc/ansible/
├── ansible.cfg
├── hosts
├── nfs_servers.yml
├── roles
│   └── rsync_servers
│       ├── files  # 指的是目錄中,存放劇本執行需要用到的檔案
│       ├── handlers
│       ├── tasks
│       ├── templates
│       └── vars
├── rsync_servers.yml
└── site.yml

部署rsyncd服務的role角色

1.準備寫裝rsync服務的role

2.建立好對應的目錄結構

  1. 寫好playbook模式
  2. 拆開即可

先寫好純playbook形式

什麼時候定義變數,在你的  寫劇本,。寫寫好ad-hoc臨時命令模式

看你臨時命令,使用這個屬性,重複了2次以上,就可以抽象為變數

部署rsync的劇本
讓大家理解,透過ad-hoc去思考,抽象變數
然後轉為yaml,的變數提取形式

ansible bakcup  -m group  -a "name={{rsyncd_name}}  gid={{rsyncd_id}}"
ansible bakcup  -m user  -a  "name={{rsyncd_name}}  group={{rsyncd_id}}    "

建立備份目錄了
ansible bakcup  -m file   -a "path=/data  state=direcotry owner={{rsyncd_name}} group={{rsyncd_id}}  "

你會發現,這個使用者資訊,是重複使用

vars:
  rsyncd_name: "www"
  rsyncd_id: 666


- hosts: backup
  vars:
    user_id: '666'
    rsync_user: 'www'
  tasks:
  # 1.建立www使用者和組
  - name: 01_create_group
    group:
      name: "{{ rsync_user }}"
      gid: "{{ user_id }}"

  # 2.建立www使用者
  - name: 02_create_user
    user:
      name: "{{ rsync_user }}"
      gid: "{{ user_id }}"
      group: "{{ rsync_user}}"
      create_home: no
      shell: /sbin/nologin

  # 3.建立資料目錄且授權
  - name: 03_createUdata
    file:
      path: "{{ item }}"
      state: direcotry
      owner: "{{ rsync_user }}"
      group: "{{ rsync_user}}"
      mode: "755"
    loop:
      - /data
      - /backup
  # 4.安裝rsync軟體
  - name: 04_install_rsync
    yum:
      name: rsync
      state: latest
  # 5.複製配置檔案與密碼檔案
  - name: 05_copy_config
    copy:
      src: "{{ item.src }}"
      dest: /etc/
      mode: "{{ item.mode }}"
    notify:
      - restart_rsyncd
    loop:
      - { src:/script/rsyncd.conf,mode:'644'}
      - { src:/script/rsync.passwd,mode:'600'}

  # 6.啟動服務
  - name: 06_start_rsync
    systemd:
      name: rsyncd
      state: started
      enabled: yes
  # 7.重啟服務
  handlers:
    - name: restart_rsyncd
      systemd:
        name: rsyncd
        state: restarted

下一步,思考,如何吧這個劇本,拆開,拆為role的形式

1.如何拆,先看你的劇本中,有多少個部分,是符合role的目錄規範的(有多少部分需要拆)

2.對配置檔案,解析完畢後,可以去逐步的拆了

拆最多的tasks任務

1.建立tasks/main.yml

[root@master-61 /script]#touch /etc/ansible/roles/rsync_servers/tasks/main.yml


2.往tasks的主體檔案中,寫入拆分出來的任務列表
只需要複製原本的劇本中的 tasks任務列表,無須攜帶tasks這個key了,複製貼上如下的任務列表即可,寫入到該 tasks/main.yml

劇本中,依然會呼叫 變數資訊,但是不寫在這個tasks/main.yml中了
而是,role角色會自動的去 vars/main.yml 尋找這個變數 {{rsync_user}}





3.再次理解,咱們在拆分 這個大劇本

# 劇本如下
# 1.建立www組
- name: 01_create_group
  group:
    name: "{{rsync_user}}"
    gid: "{{user_id}}"

# 2.建立www使用者
- name: 02_create_user
  user:
    name: "{{rsync_user}}"
    uid: "{{user_id}}"
    group: "{{rsync_user}}"
    create_home: no
    shell: /sbin/nologin

# 3.建立資料目錄並更改授權
- name: 03_create_data
  file:
    path: "{{item}}"
    state: directory
    owner: "{{rsync_user}}"
    group: "{{rsync_user}}"
    mode: '755'
  loop:
    - /data
    - /backup/


# 4.安裝rsync軟體
- name: 04_install_rsync
  yum:
    name: rsync
    state: latest

# 5.複製檔案
- name: 05-copy config
  copy:
    src: "{{item.src}}"
    dest: /etc
    mode: "{{item.mode}}"

  notify:
    - restart_rsyncd
  loop:
    - {src: rsyncd.conf,mode: '644'}
    - {src: rsync.passwd,mode: '600'}

# 6. 啟動服務
- name: start service
  systemd:
    name: rsyncd
    state: started
    enabled: yes

拆 vars/main.yml

1.寫入 劇本需要用到的變數即可,也是一樣,不需要新增 vars: 這個腦袋了
roles判斷,只要在 vars/main.yml 就識別這是一個變數yml檔案


2.建立  vars/main.yml

touch  vars/main.yml
寫入如下資訊,無須縮排
user_id: '666'
rsync_user: 'www'

拆配置檔案

1. 找到你原本的配置檔案所在地兒,複製到 roles的 files目錄下即可


2.建立檔案如下

[root@master-61 /etc/ansible/roles/rsync_servers]#cp /script/rsync*   /etc/ansible/roles/rsync_servers/files/
[root@master-61 /etc/ansible/roles/rsync_servers]#
[root@master-61 /etc/ansible/roles/rsync_servers]#
[root@master-61 /etc/ansible/roles/rsync_servers]#ls files/
rsyncd.conf  rsync.passwd

拆handlers

1. 建立handlers檔案
[root@master-61 /etc/ansible/roles/rsync_servers]#cat handlers/main.yml 
- name: restart_rsyncd
  systemd:
    name: rsyncd
    state: restarted

最後,安裝rsync的role建立好了

建立啟動檔案即可

注意點,該啟動檔案,入口在 和 roles這個目錄,平級的地方

寫入需要操作的主機組,以及定義角色的名字(和角色資料夾對應即可)
# 注意,這裡是錯的,解決辦法如下,讓你更清晰,角色的啟動檔案寫法
[root@master-61 /etc/ansible]#cat /etc/ansible/rsync_server.yml 
- hosts: backup
  roles:
    - rsync_server

留個伏筆,發現這個資料夾是錯的,對不上的,試試能執行嗎(發現的確是錯誤的)

1.除錯該啟動劇本是否可以執行,語法是否正確
ansible-playbook -C rsync_servers.yml

2.修改這個role的啟動劇本 ,正確的入口檔案,語法如下
[root@master-61 /etc/ansible]#cat /etc/ansible/rsync_servers.yml 
- hosts: backup
  roles:
    - rsync_servers

正式執行該rsync角色

1.準備好心機器,rsync-41機器測試

2. 執行角色程式
[root@master-61 /etc/ansible]#ansible-playbook  rsync_servers.yml

關於template模板模組的學習

ansible-playbook中的 template模組使用
專門用於動態替換配置檔案中的值,需要學習jinja2這個模板語言(內容太多,支援迴圈語句,條件判斷,以後有機會再學。。)

這裡學習它的 建立,使用規則;以及變數替換功能;實現配置檔案的變數替換;
改為變數形式的配置檔案
一個純普通的文字檔案,是沒法識別這樣的變數的

rsyncd.conf

uid = www 
gid = www 
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_bakcup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
[backup]
comment = chaoge rsync backup!
path = /backup
[data]
comment = yuchaoit.cn rsync!
path = /data

使用template模板替換配置檔案的思路
因此ansible提供了一個jinja2模板語言,要求如下

第一件事,改造配置檔案為 j2型別

1.建立配置檔案,但是字尾必須是 j2格式的
rsyncd.j2
該j2檔案寫入配置
uid = www 
gid = www 
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = {{ rsync_auth_user }}
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
[backup]
comment = chaoge rsync backup!
path = /backup
[data]
comment = yuchaoit.cn rsync!
path = /data

第二件事,修改vars變數檔案,去替換j2檔案中的變數值

只需要在vars/main.yml中寫入變數即可

rsync_auth_user: "rsync_backup"

第三件事,修改tasks任務yaml檔案

還得修改tasks任務yaml檔案,指定配置檔案路徑,為j2模板形式

以部署sshd服務為演示(role角色)

1.建立sshd_server角色目錄

[root@master-61 /etc/ansible]#mkdir -p /etc/ansible/roles/sshd_server/{files,handlers,tasks,vars,templates}

檢查
[root@master-61 /etc/ansible]#tree /etc/ansible/roles/sshd_server/
/etc/ansible/roles/sshd_server/
├── files
├── handlers
├── tasks
├── templates
└── vars

5 directories, 0 files

2.需要建立role目錄下的每一個目錄資料

1.你在寫的時候,思路依然是

初學階段,這思路是最好的,明白了扣 3 不懂 4
- 想好ad-hoc命令模式,想清楚,每一步要如何使用模組
- 轉為playbook 劇本形式
- 思考如何拆為role要求的 files,template,tasks,vars目錄

當你以後寫的越來越熟練了,你可以直接上手roles,或者直接寫palybook

先建立部署sshd的tasks任務檔案

1. 建立tasks/main.yml
vim tasks/main.yml

# 2. 寫入劇本語法
[root@master-61 /etc/ansible/roles/sshd_server]#cat tasks/main.yaml 
# 1.複製檔案
- name: 01_copy_sshd
  template:
    src: sshd_config.j2
    dest: /etc/ssh/sshd_config
    mode: '600'
    backup: yes
  notify:
    - restart sshd


# 2.啟動服務
- name: start sshd service
  systemd:
    name: sshd
    state: started
    enabled: yes

3.建立template資訊

建立模板配置檔案,設定變數用於替換配置檔案的值

1.你要準備好 sshd_config的配置檔案
[root@master-61 /etc/ansible/roles/sshd_server]#cp /etc/ssh/sshd_config 
[root@master-61 /etc/ansible/roles/sshd_server]#ls templates/
sshd_config.j2

2.修改這個sshd_config.j2檔案,修改需要用變數替換的引數
修改埠
禁止公鑰登入

Port {{ sshd_port  }}
PubkeyAuthentication {{ pubkey_yes_no  }}


3.建立變數檔案,寫入這個對應的變數 值

4.檢查
[root@master-61 /etc/ansible/roles/sshd_server]#tree
.
├── files
├── handlers
├── tasks
│   └── main.yml
├── templates
│   └── sshd_config.j2
└── vars

4.建立變數檔案

1.建立檔案
[root@master-61 /etc/ansible/roles/sshd_server]#cat vars/main.yml 
sshd_port: "2999"
pubkey_yes_no:  "no"

5.建立handlers檔案,用於重啟sshd

[root@master-61 /etc/ansible/roles/sshd_server]#cat  handlers/main.yml
- name: restart sshd
  systemd: 
    name: sshd
    state: restarted

6.檢查當前服務的roles目錄資訊

[root@master-61 /etc/ansible/roles/sshd_server]#tree
.
├── files
├── handlers
│   └── main.yml
├── tasks
│   └── main.yml
├── templates
│   └── sshd_config.j2
└── vars
    └── main.yml

5 directories, 4 files

7.建立啟動檔案就完事

1.必須和roles同級
2.roles角色定義的工作目錄名,必須和roles/資料夾名字對應的上


# 先進入/etc/ansible目錄,建立啟動檔案
[root@master-61 /etc/ansible]#cat start_sshd.yml 
- hosts: backup
  roles:
    - sshd_server


3.測試劇本執行
[root@master-61 /etc/ansible/roles/sshd_server]#ansible-playbook /etc/ansible/start_sshd.yml 

相關文章