配置Ansible Role

Ansible可以按照不同的角色來部署服務,這樣可以更加清晰地爲不同用途的服務器進行分類管理。
例如創建一個base 角色,用來初始化新裝的服務器,比如安裝基本的軟件包、關閉防火牆和selinux,啓動相關的服務等。同時分別創建web 和database的角色來定義和安裝配置web服務器和數據庫服務器。

系統環境和軟件版本同上一篇文章。

創建一個base 角色
在/etc/ansible/roles目錄下創建base目錄,並且在base下創建三個目錄tasks, templates和handlers.

/etc/ansible/roles/
└── base                                    # 角色名base
    ├── handlers                          # 用來觸發一些重啓服務的操作
    ├── tasks                               # 要編排的任務放在該目錄下
    └── templates                        # 放置一些配置的模板文件

每個目錄下必須包含main.yml文件用來添加任務內容,例如添加任務到tasks/main.yml文件:

---
- name: disable selinux                                         # 禁用selinux
  selinux: state=disabled

- name: stop unused services                              # 停止不需要的服務
  service: name={{ item }} state=stopped 
  with_items:
     - atd
     - firewalld
     - chronyd
     - tuned
     - NetworkManager

- name: install packages                                       # 安裝需要的軟件包
  yum: name={{ item }} state=installed                  # 採用循環的方式取出各種安裝包名稱
  with_items:
    - "@base"
    - "@Development tools"
    - "@System Administration Tools"
    - ntp

- name: ntp template                                                 # 配置ntp文件模板
  template: src=ntp.conf.j2 dest=/etc/ntp.conf           # 設置ntp模板文件的源路徑和目標路徑,模板採用jinja模板格式
  tags: ntp                                                                    # 設置標籤爲ntp
  notify: restart ntp                                                       # notify 觸發handler的重啓操作,一旦更新了配置後就重啓服務

- name: add group                                                      # 添加一個組
  group: name=testgroup state=present gid=1010

- name: add users                                                       # 添加用戶, 可按循環方式添加用戶
  user: name={{item.name}} state=present groups={{item.groups}} uid={{item.uid}}
  with_items:
    - {name: 'testuser1',groups: 'testgroup',uid: '1021'}
    - {name: 'testuser2',groups: 'testgroup',uid: '1022'}

- name: set sysctl value                                              # 設置sysctl內核參數
  sysctl:
    name: "{{item.name}}"
    value: "{{item.value}}"
    state: present
    sysctl_set: yes
    reload: yes
  with_items:
     - { name: 'net.core.rmem_max', value: '16777216' }
     - { name: 'net.core.wmem_max', value: '7340032' }
     - { name: 'vm.swappiness', value: '5' }

在templates 目錄中放置ntp模板文件ntp.conf.j2

driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery
restrict 127.0.0.1 
restrict ::1
server {{ ntp_server }}                                 # 此處可以將ntp服務器IP地址設置爲變量,並且可以在/etc/ansible/group_vars中定義該變量
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor

在handlers的main.yml配置文件中添加要觸發的服務,一旦ntp配置更新後,就會觸發handler去重啓ntp服務達到生效的目的

---
- name: restart ntp
  service: name=ntpd state=restarted

關於配置中變量的定義, 在/etc/ansible 目錄下分別創建 group_vars和host_vars,分別代表組變量和主機變量,我們在group_vars目錄下面建立testservers文件,添加如下內容
ntp_server: 192.168.1.101

則模板文件會調用該變量的值並傳遞給客戶端機器

依照上述步驟在分別建立兩個角色 web 和 database
web 目錄結構如下所示

web
├── handlers
├── tasks
│   └── main.yml
└── templates

任務tasks/main.yml 配置如下,爲簡化配置暫時使用默認配置

---
- name: install httpd server
  yum:
   name: httpd
   state: installed

database 目錄結構如下所示

database/
├── handlers
│   └── main.yml
├── tasks
│   └── main.yml
└── templates
    └── my.cnf.j2

任務tasks/main.yml 配置如下:

---
- name: setup database server
  yum: name={{ item }} state=present      # 安裝 mariadb 服務器端, present和installed代表狀態相同
  with_items:
    - mariadb-server
    - mariadb-devel
    - mariadb

- name: database template
  template: src=my.cnf.j2 dest=/etc/my.cnf    # 設置 mariadb 的配置模板
  tags: mariadb
  notify: restart mariadb 

模板 templates/my.cnf.j2 內容如下:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

handlers/main.yml 配置如下,當配置變更時,觸發重啓mariadb命令

---
- name: restart mariadb
  tags: mariadb
  service: name=mariadb state=restarted

最後編輯playbook /etc/ansible/dev.yml,該playbook作爲最終調用的配置,內容如下

---
- name: apply base config for dev servers    
  hosts: testservers                                          # 對testservers組的主機更改配置
  remote_user: root
  roles:                                                              # 應用的角色爲base 和 web
    - base
    - web

- name: apply db config for db servers              # 對dbservers組的主機更改配置
  hosts: dbservers
  remote_user: root
  roles:                                                                 # 應用base 和database角色
    - base
    - database                       

注意 /etc/ansible/hosts文件要更新對應組和主機列表,才能匹配角色對主機的應用

[testservers]    # 組
test3                # 主機

[dbservers]
test4

運行命令 ansible-playbook dev.yml 來執行該playbook
至此完成了一個比較簡單的Ansible角色定義的配置和操作。

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