Ansible能夠按照不一樣的角色來部署服務,這樣能夠更加清晰地爲不一樣用途的服務器進行分類管理。
例如建立一個base 角色,用來初始化新裝的服務器,好比安裝基本的軟件包、關閉防火牆和selinux,啓動相關的服務等。同時分別建立web 和database的角色來定義和安裝配置web服務器和數據庫服務器。mysql
系統環境和軟件版本同上一篇文章。linux
建立一個base 角色
在/etc/ansible/roles目錄下建立base目錄,而且在base下建立三個目錄tasks, templates和handlers.web
/etc/ansible/roles/ └── base # 角色名base ├── handlers # 用來觸發一些重啓服務的操做 ├── tasks # 要編排的任務放在該目錄下 └── templates # 放置一些配置的模板文件
每一個目錄下必須包含main.yml文件用來添加任務內容,例如添加任務到tasks/main.yml文件:sql
--- - 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
app
則模板文件會調用該變量的值並傳遞給客戶端機器socket
依照上述步驟在分別創建兩個角色 web 和 database
web 目錄結構以下所示ide
web ├── handlers ├── tasks │ └── main.yml └── templates
任務tasks/main.yml 配置以下,爲簡化配置暫時使用默認配置ui
--- - 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角色定義的配置和操做。