Roles的介紹
Roles是ansible自1.2版本引入的新特性,用于層次性,結構化地組織playbook,roles能夠根據層次型結構自動自動裝在變量檔案、tasks以及handlers
等。要使用roles隻需要在playbook中使用include指令即可。簡單來講,roles就是通過分别将變量、檔案、任務、模闆及處理器放置于單獨的目錄中
并可以便捷地include他們的一種機制,角色一般用于主機建構服務的場景中,但也可以是用于建構守護程序等場景中。
建立roles的步驟
建立以roles命名的目錄:
在roles目錄中分别建立以各角色名稱命名的目錄,如webservers等:
在每個角色命名的目錄中分别建立files、handlers、meta、tasks、templates和vars目錄:用不到的目錄可以建立為空目錄,也可以不建立。
在playbook檔案中,調用各角色
roles内各目錄中可用的檔案
tasks目錄:至少建立一個名為main.yml的檔案,其定義了此角色的任務清單:此檔案可以使用 include包含其他的位于此目錄中的tasks檔案:
files目錄:存放由copy或者script等子產品調用的檔案:
templates目錄:templates子產品會自動在此目錄中尋找Jinjia2模闆檔案:
handlers目錄:此目錄中應當包含一個main。
yml檔案:用于定義此角色用到的各handler:在handler中使用include包含的其他的handler檔案也應該位于此目錄中:
vars目錄:應當包含一個main.yml檔案,用于定義此角色用到的變量
meta目錄:應當包含一個main.yml檔案,用于定義此角色的特殊設定及其依賴關系:ansible 1.3及其以後的版本才支援
default目錄:為目前角色定義預設變量時使用此目錄,應該包含一個main.yml檔案
roles:
(1)目錄名同角色名
(2)目錄結構有固定格式:
(3) files:靜态檔案
(4) templates:Jinjia2 模闆檔案
(5) tasks:至少有一個main.yml檔案,定義tasks:
(6) hangdlers:至少有一個main.yml檔案,定義各handlers
(7) vars:至少有一個main.yml檔案,定義變量
(8) meta:定義依賴關系等資訊
Roles的使用案例
下面是一個role的目錄結構
1
2
3
4
5
6
7
8
9
10
11
<code>zengchengpeng@iZ2339ljvmkZ:</code><code>/etc/ansible/roles/wf_jdk</code><code>$ tree</code>
<code>.</code>
<code>├── defaults</code>
<code>│ └── main.yml</code>
<code>├── files</code>
<code>│ └── rpm</code>
<code>│ └── jdk-8u66-linux-x64.rpm</code>
<code>├── handlers</code>
<code>├── Readme</code>
<code>└── tasks</code>
<code> </code><code>└── main.yml</code>
解釋說明:
上面這個role是用來安裝JDK的,安裝包放在files目錄中,defaults目錄下面的main.yml則是定義預設變量的,檔案内容如下:
<code>zengchengpeng@iZ2339ljvmkZ:</code><code>/etc/ansible/roles/wf_jdk</code><code>$ </code><code>cat</code> <code>defaults</code><code>/main</code><code>.yml </code>
<code>---</code>
<code># stable or latest</code>
<code>jdk_path: </code><code>/etc/ansible/roles/wf_jdk</code>
可以看到這個檔案用來定義的是jdk_path這個變量
tasks目錄下的main.yml檔案内容:
<code>zengchengpeng@iZ2339ljvmkZ:</code><code>/etc/ansible/roles/wf_jdk</code><code>$ </code><code>cat</code> <code>tasks</code><code>/main</code><code>.yml</code>
12
13
14
15
16
17
18
19
<code>- name: create </code><code>/srv/jdk</code> <code>directory</code>
<code> </code><code>file</code><code>: path=</code><code>/srv/jdk</code> <code>state=directory mode=0755</code>
<code>- name: </code><code>sync</code> <code>jdk rpm package</code>
<code> </code><code>synchronize: src={{ jdk_path }}</code><code>/files/rpm/</code> <code>dest=</code><code>/srv/jdk/</code> <code>delete=</code><code>yes</code>
<code>- name: </code><code>install</code> <code>jdk</code>
<code> </code><code>yum: name={{ item }} state=present disable_gpg_check=</code><code>yes</code>
<code> </code><code>with_items:</code>
<code> </code><code>- </code><code>/srv/jdk/jdk-8u66-linux-x64</code><code>.rpm</code>
<code>- name: Edit profile JDK conf</code>
<code> </code><code>blockinfile:</code>
<code> </code><code>dest: </code><code>/etc/profile</code>
<code> </code><code>backup: </code><code>yes</code>
<code> </code><code>marker: </code><code>"# {mark} jdk config"</code>
<code> </code><code>content: |</code>
<code> </code><code>JAVA_HOME=</code><code>/usr/java/jdk1</code><code>.8.0_66</code>
<code> </code><code>CLASSPATH=.:$JAVA_HOME</code><code>/lib/tools</code><code>.jar:$JAVA_HOME</code><code>/lib/dt</code><code>.jar</code>
<code> </code><code>PATH=$JAVA_HOME</code><code>/bin</code><code>:$ANT_HOME</code><code>/bin</code><code>:$PATH</code>
<code> </code><code>export</code> <code>JAVA_HOME CLASSPATH PATH</code>
從上面的tasks中的main.yml檔案可以看到安裝JDK的一個基本流程,
1、在遠端伺服器上建立一個/srv/jdk的目錄
2、将本地的JDK RPM包同步到遠端主機上的/srv/jdk目錄中,如果遠端目錄中存在這個檔案,則先删除再同步
3、用yum子產品安裝這個RPM包
4、編輯遠端主機上的/etc/profile檔案,在檔案中追加以下配置。
<code>JAVA_HOME=</code><code>/usr/java/jdk1</code><code>.8.0_66</code>
<code>CLASSPATH=.:$JAVA_HOME</code><code>/lib/tools</code><code>.jar:$JAVA_HOME</code><code>/lib/dt</code><code>.jar</code>
<code>PATH=$JAVA_HOME</code><code>/bin</code><code>:$ANT_HOME</code><code>/bin</code><code>:$PATH</code>
<code>export</code> <code>JAVA_HOME CLASSPATH PATH</code>
如何調用Roles
Roles寫好之後,需要建立一個playbook檔案,然後用ansible-playbook指令去調用這個playbook。所有的playbook可以放在一個目錄中,這個目錄名開始自己随便定義。例如生産環境的playbook目錄名叫workflow。下面是所有的playbook
<code>zengchengpeng@iZ2339ljvmkZ:</code><code>/etc/ansible/workflow</code><code>$ </code><code>ls</code>
<code>update_fm.yml wf_init_iptables.yml wf_iptables_disabled_port.yml wf_start_app.yml</code>
<code>wf_add_user.yml wf_init_kernel.yml wf_iptables_open_port.yml wf_stop_app.yml</code>
<code>wf_app_check.yml wf_init_vim.yml wf_link_latest_version.yml wf_web_cdn.yml</code>
<code>wf_check_host.yml wf_init.yml wf_logstash.yml wf_web_check.yml</code>
<code>wf_code_upload.yml wf_init_zabbix_agent.yml wf_pgdb.yml wf_web_code_upload.yml</code>
<code>wf_del_user.yml wf_install_jdk.yml wf_redis.yml wf_zabbix_add_template.yml</code>
<code>wf_init_command_audit.yml wf_install_nginx.yml wf_reload_nginx.yml wf_zabbix_create_host.yml</code>
<code>wf_init_common.yml wf_install_python27.yml wf_slb_in.yml wf_zabbix_maintenance.yml</code>
<code>wf_init_deploy_user.yml wf_install_tomcat.yml wf_slb_out.yml</code>
Playbook的内容如下:
<code>zengchengpeng@iZ2339ljvmkZ:</code><code>/etc/ansible/workflow</code><code>$ </code><code>cat</code> <code>wf_install_jdk.yml</code>
<code> </code><code>- hosts: </code><code>'{{ HOST if HOST|length()>0 }}'</code>
<code> </code><code>remote_user: root</code>
<code> </code><code>roles:</code>
<code> </code><code>- yaegashi.blockinfile</code>
<code> </code><code>- wf_jdk</code>
注意:上面安裝JDK的playbook中多了一個
<code>yaegashi.blockinfile</code>
這個是因為生産環境的ansible是1.9版本,不支援blockinfile子產品。是以單獨寫了一個roles,來解決這個問題。
總結:
上面這個安裝JDK的roles是一個比較簡單的roles,使用的都是一些比較常用的子產品,如果看不明白,則需要熟悉下ansible的相關子產品的使用。
Ansible官方文檔有所有子產品的介紹,下面是官網連結
http://docs.ansible.com/ansible/modules_by_category.html
本文轉自 曾哥最愛 51CTO部落格,原文連結:http://blog.51cto.com/zengestudy/1795796,如需轉載請自行聯系原作者