Ansible之roles

1.Roles介紹

ansible自1.2版本引入的新特性仲墨,用于層次性、結(jié)構(gòu)化地組織playbook俩由。roles能夠根據(jù)層次型結(jié)構(gòu)自動裝載變量文件幻梯、tasks以及handlers等努释。要使用roles只需要在playbook中使用include指令引入即可伐蒂。簡單來講,roles就是通過分別將變量恩沛、文件雷客、任務(wù)桥狡、模板及處理器放置于單獨的目錄中,并可以便捷的include它們的一種機制呈宇。角色一般用于基于主機構(gòu)建服務(wù)的場景中,但也可以是用于構(gòu)建守護進程等場景中存炮。playbook局限在于如果文件較多的情況蜈漓,不清楚哪些主機執(zhí)行了哪些狀態(tài)的yml文件融虽,roles能清楚哪些主機應(yīng)用哪些角色,主要使用場景代碼復(fù)用度較高的情況下般又。

2.Roles目錄結(jié)構(gòu)

目錄介紹
roles:          <--所有的角色必須放在roles目錄下茴迁,這個目錄可以自定義位置堕义,默認(rèn)的位置在/etc/ansible/roles
  project:      <---具體的角色項目名稱倦卖,比如nginx椿争、tomcat、php
    files:     <--用來存放由copy模塊或script模塊調(diào)用的文件嘉竟。
    templates: <--用來存放jinjia2模板舍扰,template模塊會自動在此目錄中尋找jinjia2模板文件边苹。
    tasks:     <--此目錄應(yīng)當(dāng)包含一個main.yml文件裁僧,用于定義此角色的任務(wù)列表慕购,此文件可以使用include包含其它的位于此目錄的task文件沪悲。
      main.yml
    handlers:  <--此目錄應(yīng)當(dāng)包含一個main.yml文件殿如,用于定義此角色中觸發(fā)條件時執(zhí)行的動作涉馁。
      main.yml
    vars:      <--此目錄應(yīng)當(dāng)包含一個main.yml文件爱致,用于定義此角色用到的變量糠悯。
      main.yml
    defaults:  <--此目錄應(yīng)當(dāng)包含一個main.yml文件,用于為當(dāng)前角色設(shè)定默認(rèn)變量叶沛。
      main.yml
    meta:      <--此目錄應(yīng)當(dāng)包含一個main.yml文件忘朝,用于定義此角色的特殊設(shè)定及其依賴關(guān)系局嘁。
      main.yml

3.ansible roles舉例

示例1

#playbook安裝tomcat
[root@m01 /project1]# ll
total 202624
-rw-r--r-- 1 root root  12326996 Apr  5 16:45 apache-tomcat-9.0.26.tar.gz
-rwxr-x--- 1 root root     23689 Apr  5 18:08 catalina.sh
-rw-r--r-- 1 root root        17 Apr  4 22:23 hosts
-rw-r--r-- 1 root root 195094741 Apr  5 16:45 jdk-8u221-linux-x64.tar.gz
-rw-r--r-- 1 root root      1617 Apr  5 18:13 server.xml.j2
-rw-r--r-- 1 root root       126 Apr  5 18:08 setenv.sh
-rw-r--r-- 1 root root       290 Apr  5 18:08 tomcat.service
-rw-r--r-- 1 root root      2353 Apr  6 10:54 tomcat.yml
[root@m01 /project1]# vim tomcat.yml
---
- hosts: web
  vars:
    - tomcat_version: 9.0.26
    - jdk_packages: 8u221
    - jdk_version: jdk1.8.0_221
  tasks:
    - name: add group
      group:
        name: www
        gid: 666
        state: present

    - name: add user
      user:
        name: www
        uid: 666
        group: www
        create_home: no
    - name: mkdir directory
      file:
        path: /usr/java
        state: directory

    - name: unarchive jdk-{{ jdk_packages }}-linux-x64.tar.gz
      unarchive:
        src: ./jdk-{{ jdk_packages }}-linux-x64.tar.gz
        dest: /usr/java

    - name: add java environment
      lineinfile:
        path: /etc/profile
        regexp: "{{ item.re }}"
        line: "{{ item.li }}"
      loop:
        - { re: '^export JAVA_HOME=', li: 'export JAVA_HOME=/usr/java/{{ jdk_version }}' }
        - { re: '^export PATH=', li: 'export PATH=$JAVA_HOME/bin:$PATH' }
        - { re: '^export CLASSPATH=', li: 'export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JA
VA_HOME/lib' }

    - name: reloade profile
      shell: source /etc/profile

   - name: unarchive apache-tomcat-{{ tomcat_version }}.tar.gz
      unarchive:
        src: ./apache-tomcat-{{ tomcat_version }}.tar.gz
        dest: /usr/local

    - name: rename tomacat
       shell: cd /usr/local/;mv apache-tomcat-{{tomcat_version}} /usr/local/tomcat;chown -R www.www /usr/local/
tomcat

    - name: copy tomact server rename tomacat
      template:
        src: ./server.xml.j2
        dest: /usr/local/tomcat/conf/server.xml
        backup: yes

    - name: copy file
      copy:
        src: "./{{ item.src }}"
        dest: "{{ item.dest }}"
      loop:
        - { src: 'setenv.sh', dest: '/usr/local/tomcat/bin/' }
        - { src: 'tomcat.service', dest: '/lib/systemd/system/' }
        - { src: 'catalina.sh', dest: '/usr/local/tomcat/bin/' }
      notify: restart tomcat

    - name: ln -s enable
      file:
        src: /lib/systemd/system/tomcat.service
        dest: /etc/systemd/system/multi-user.target.wants/tomcat.service
        state: link

    - name: start tomcat
      systemd:
        daemon_reload: yes
        name: tomcat
        state: started
        enabled: yes

  handlers:
    - name: restart tomcat
      service:
        name: tomcat
        state: restarted              
將playbook改寫為rolse
#目錄結(jié)構(gòu)
[root@m01 /etc/ansible/roles]# tree tomcat
tomcat
├── files
│   ├── catalina.sh
│   ├── setenv.sh
│   └── tomcat.service
├── handlers
│   └── main.xml
├── tasks
│   └── main.yml
├── templates
│   └── server.xml.j2
└── vars
    └── main.yml
#模塊詳細類容
1.files
[root@m01 /etc/ansible/roles/tomcat/files]# ll
total 32
-rwxr-x--- 1 root root 23689 Apr  2 21:20 catalina.sh
-rw-r--r-- 1 root root   126 Apr  2 21:23 setenv.sh
-rw-r--r-- 1 root root   290 Apr  2 21:20 tomcat.service
2.tasks
[root@m01 /etc/ansible/roles/tomcat/tasks]# cat main.yml
- name: add group
      group:
        name: www
        gid: 666
        state: present
- name: add user
  user:
     name: www
     uid: 666
     group: www
     create_home: no

- name: mkdir dir
  file:
    path: /usr/java
    state: directory  

- name: unarchive jdk-8u221-linux-x64.tar.gz
  unarchive:
    src: /root/jdk-8u221-linux-x64.tar.gz
    dest: /usr/java

- name: add java environment
  lineinfile:
    path: /etc/profile
    regexp: "{{item.re}}"
    line: "{{item.li}}"
  loop:
    - { re: '^export JAVA_HOME=', li: 'export JAVA_HOME=/usr/java/jdk1.8.0_221' }
    - { re: '^export PATH=', li: 'export PATH=$JAVA_HOME/bin:$PATH' }
    - { re: '^export CLASSPATH=', li: 'export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib' }

  
- name: reloade profile
  shell: source /etc/profile


- name: unarchive tomcat-{{tomcat_version}}.tar.gz
  unarchive:
    src: /root/apache-tomcat-{{tomcat_version}}.tar.gz
    dest: /usr/local

- name: rename tomacat
  shell: cd /usr/local/;mv apache-tomcat-{{tomcat_version}} /usr/local/tomcat;chown -R www.www /usr/local/tomcat
 
- name: copy  tomcat server.xml start file
  template:
    src: "{{ item.src }}"
    dest: "{{ item.dest }}"
    backup: yes
  loop:
    - { src: 'server.xml.j2', dest: '/usr/local/tomcat/conf/server.xml' }

- name: copy file
  copy:
    src: "{{ item.src }}"
    dest: "{{ item.dest }}"
  loop:
    - { src: 'setenv.sh', dest: '/usr/local/tomcat/bin/' }
    - { src: 'tomcat.service', dest: '/lib/systemd/system/' }
    - { src: 'catalina.sh', dest: '/usr/local/tomcat/bin/' }

- name: ln -s enable
  file:
    src: /lib/systemd/system/tomcat.service
    dest: /etc/systemd/system/multi-user.target.wants/tomcat.service
    state: link

- name: start tomcat
  systemd:
    daemon_reload: yes
    name: tomcat
    state: started
    enabled: yes
3.template
[root@m01 /etc/ansible/roles/tomcat/templates]# ls
server.xml.j2
4.vars
[root@m01 /etc/ansible/roles/tomcat/vars]# cat main.yml 
tomcat_version: 9.0.26
jdk_packages: 8u221
jdk_version: jdk1.8.0_221
5.handlers
[root@m01 /etc/ansible/roles/tomcat/handlers]# cat main.yml
 - name: restart tomcat
      service:
        name: tomcat
        state: restarted      

示例2
Ansible安裝keepalive實現(xiàn)主/備模式高可用

#目錄結(jié)構(gòu)
[root@m01 /etc/ansible/roles/keepalived]# ll
total 0
drwxr-xr-x 2 root root 24 Oct 21 20:44 files
drwxr-xr-x 2 root root 22 Apr  6 09:45 handlers
drwxr-xr-x 2 root root 22 Apr  6 10:53 tasks
drwxr-xr-x 2 root root 55 Apr  6 10:29 templates
#rolse詳情
1.tasks
[root@m01 /etc/ansible/roles/keepalived/tasks]# vim main.yml
- name: install keepalived server
  yum:
    name: keepalived
    state: present

- name: configure keepalived server
  template:
    src: keepalived.conf.j2
    dest: /etc/keepalived/keepalived.conf
    backup: yes
  notify: restart keepalived

- name: create dir
  file:
    path: /server/scripts/
    state: directory

- name: copy check_web.sh
  template:
    src: check_web.sh.j2
    dest: /server/scripts/check_web.sh
    mode: '0755'

- name: start keepalived server
  systemd:
    name: keepalived
    state: started
    enabled: yes
2.files
[root@m01 /etc/ansible/roles/keepalived/files]# ll
total 4
-rw-r--r-- 1 root root 65 Oct 21 20:44 local.repo
3.templates
[root@m01 /etc/ansible/roles/keepalived/templates]# ls
check_web.sh.j2  keepalived.conf.j2
4.handlers
[root@m01 /etc/ansible/roles/keepalived/handlers]# cat main.yml 
- name: restart keepalived
  systemd:
    name: keepalived
    state: restarted

4.ansible roles總結(jié)

1抗楔、編寫任務(wù)(task)的時候连躏,里面不需要寫需要執(zhí)行的主機,單純的寫某個任務(wù)是干什么的即可拍棕,裝軟件的就是裝軟件的,啟動的就是啟動的绰播。單獨做某一件事即可,最后通過main.yml將這些單獨的任務(wù)安裝執(zhí)行順序include進來即可蠢箩,這樣方便維護且一目了然。
2示弓、定義變量時候直接安裝k:v格式將變量寫在vars/main.yml文件即可奏属,然后task或者template直接調(diào)用即可潮峦,會自動去vars/main.yml文件里面去找。
3嘱腥、定義handlers時候齿兔,直接在handlers/main.yml文件中寫需要做什么事情即可础米,多可的話可以全部寫在該文件里面,也可以像task那樣分開來寫医寿,通過include引入一樣的可以靖秩。在task調(diào)用notify時直接寫與handlers名字對應(yīng)即可(二者必須高度一直)竖瘾。
4、模板文件一樣放在templates目錄下即可事扭,task調(diào)用的時后直接寫文件名字即可求橄,會自動去到templates里面找。
注意:如果是一個角色調(diào)用另外一個角色的單個task時后罐农,那么task中如果有些模板或者文件,就得寫絕對路徑了宰睡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載拆内,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者麸恍。
  • 序言:七十年代末搀矫,一起剝皮案震驚了整個濱河市瓤球,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌噪馏,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逝薪,死亡現(xiàn)場離奇詭異,居然都是意外死亡要门,警方通過查閱死者的電腦和手機廓啊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炒瘟,“玉大人疮装,你說我怎么就攤上這事缘琅∷⑴郏” “怎么了樊展?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵雷酪,是天一觀的道長。 經(jīng)常有香客問我太闺,道長嘁圈,這世上最難降的妖魔是什么最住? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮轧粟,結(jié)果婚禮上脓魏,老公的妹妹穿的比我還像新娘茂翔。我一直安慰自己,他們只是感情好惭嚣,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布悔政。 她就那樣靜靜地躺著谋国,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捌蚊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天牡整,我揣著相機與錄音逃贝,去河邊找鬼迫摔。 笑死,一個胖子當(dāng)著我的面吹牛沪摄,可吹牛的內(nèi)容都是我干的纱烘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼哄陶,長吁一口氣:“原來是場噩夢啊……” “哼屋吨!你這毒婦竟也來了山宾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤敢课,失蹤者是張志新(化名)和其女友劉穎台妆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡懊缺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年鹃两,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片途蒋。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡号坡,死狀恐怖梯醒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情畜隶,我是刑警寧澤号胚,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布猫胁,位于F島的核電站杜漠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏驾茴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望峡捡。 院中可真熱鬧们拙,春花似錦、人聲如沸械拍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迄损。三九已至,卻和暖如春痊远,著一層夾襖步出監(jiān)牢的瞬間拗引,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工矾削, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哼凯,地道東北人楚里。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓班缎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蔑祟。 傳聞我的和親對象是個殘疾皇子疆虚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容