1. 程式人生 > >ansible學習(二)

ansible學習(二)

shell mkdir 不同的 module 包含 list add upn div

什麽是YAML?

  YAML是一種標記語言。適合用來表達層次結構式的數據結構。

  YAML的基本組件:清單(短杠——空白字符)和散列表(短杠+空白字符分隔key:value對)。

Playbook的核心元素:

  hosts:主機

  tasks:任務列表

  variables

  templates:包含了末班語法的文本文件

  handlers:由特定條件出發的任務。

  roles:

  Playbook的基礎組件:

    hosts:運行指定任務的目標主機

    remoute_user:在遠程主機上執行任務的用戶

      sudo_user:有必要的情況下切換到特權級用戶來

    tasks:任務列表

      模塊,模塊參數;

      格式:

        (
1)action:module arguments         (2)module:arguments         註意:shell和command模塊後面直接跟命令,而非key=value類的參數列表。       (1)某任務的狀態在運行後為changed時,可通過”notify“通知給響應的handlers;       (2)任務可以通過”tags“打標簽,而後在ansible-playbook命令上使用-t指定進行調用。就是說只執行指定標簽的任務。
運行playbook的方式:

  (1)測試:
    ansible
-playbook --check       只檢測可能會發生的改變,但不真正執行操作;     ansible-playbook --list-hosts       列出運行任務的主機   (2)運行 handlers:
  任務,在特定條件下觸發;   接收到其它任務的通知時被觸發;   notify: HANDLER TASK NAME
variables:向腳本傳遞參數法。    (
1)facts:可直接調用;     註意:可使用setup模塊直接獲取目標主機的facters;
      常用命令格式:ansible IP -m setup | less   (
2)用戶ansible-playbook命令的命令行中的自定義變量:       (a)ansible-playbook命令的命令行中的         -e VARS, --extra-vars=VARS
      變量引用:{{ vairable }}
      
      (b)在playbook中定義變量的方法:
        vars:
        - var1: value1
        - var2: value2
  (3)通過roles傳遞變量   (4)Host Inventory
    (a)用戶自定義變量       (i)向不同的主機傳遞不同的變量;(比如下面的給httpd添加端口的例子)         IP
/HOSTNAME variable=value var2=value2       (ii)向組中的主機傳遞相同的變量;         [groupname:vars]         variable=value     (b)inventory參數       用於定義ansible遠程連接目標主機時使用的參數,而非傳遞給playbook的變量;         ansible_ssh_host         ansible_ssh_port         ansible_ssh_user         ansible_ssh_pass         ansible_sudo_pass
  安裝多個包的寫法:
    技術分享圖片
ansible提供的模板:python-jinja2  
    是一個模板引擎。文本文件,嵌套有腳本(使用模板編程語言編寫)
    jinja2:
        技術分享圖片

    條件測試

      when語句:在task中使用,jinja2的語法格式,示例:

          技術分享圖片

       ansible會去判斷符合條件的才會去運行。

    循環或叠代:需要重復執行的任務;

          對叠代項的引用,固定變量名為”item“

         而後,要在task中使用with_items給定要叠代的元素列表;
            列表方法:
              字符串
              字典
      比如:
技術分享圖片

        或者是一個字典:

          技術分享圖片

角色(roles):
 角色集合:
   roles/
   mysql/
   httpd/
   nginx/
   memcached/

 每個角色,以特定的層級目錄結構進行組織:
   mysql/
     files/ :存放由copy或script模塊等調用的文件;
     templates/:template模塊查找所需要模板文件的目錄;
     tasks/:至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含;
     handlers/:至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含;
     vars/:至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含;
     meta/:至少應該包含一個名為main.yml的文件,定義當前角色的特殊設定及其依賴關系;其它的文件需要在此文件中通過include進行包含;
     default/:設定默認變量時使用此目錄中的main.yml文件;

 在playbook調用角色方法1:
   - hosts: websrvs
     remote_user: root
     roles:
     - mysql
     - memcached
     - nginx

 在playbook調用角色方法2:傳遞變量給角色
 - hosts:
   remote_user:
   roles:
   - { role: nginx, username: nginx }
   鍵role用於指定角色名稱;後續的k/v用於傳遞變量給角色;

 還可以基於條件測試實現角色調用;
 roles:
   - { role: nginx, when: "ansible_distribution_major_version == ‘7‘ " }

ansible的配置文件兩個需要註意的:

1、forks

  表示同時並發多少臺主機執行任務,一般會修改的比此值要大一些。使其能夠對更多的主機執行任務。

2、default_module

  ansible的默認運行模塊是 command,即-m command

一、案例演示:

  1、首先是編一個YAML文件,將要執行的操作寫在裏面

- hosts: all
  remote_user: root
  tasks:
  - name: install redis
    yum: name=redis state=latest- name: start redis
    service: name=redis state=started

  說明:一個tasks裏面定義多個執行的任務列表,執行順序是從上向下執行。”notify“表示一旦修改了配置文件,就觸發動作重啟redis。可以看出來notify一般和handlers聯合使用。

  2、先檢查一下語法看看:

    技術分享圖片

  3、運行一下試試

    技術分享圖片

    看到最後的狀態就表示我們執行成功了。

  4、到節點上查看一下端口

    技術分享圖片

    6379端口確實已經起來了。

  5、針對諸多的redis服務,如果我們想配置一下redis,那麽一臺臺的查看是很麻煩的,因此我們可以將redis的配置文件放在中控機上,然後修改完成後再上傳至節點上並進行修改。

    但是這裏有個需要註意的是,redis修改完配置文件後需要重啟服務才會生效,因此我們需要定義一個觸發器,當新的配置文件上傳至節點時,自動觸發重啟redis的操作。

  6、先從遠程節點復制一份配置文件到中控機,以便進行修改

技術分享圖片

  7、我們隨便修改一下redis.conf的某個參數的值。然後需要修改YAML文件的內容,主要是配置修改redis.conf文件自動觸發重啟redis操作。

- hosts: all
  remote_user: root
  tasks:
  - name: install redis
    yum: name=redis state=latest
  - name: copy config file
    copy: src=/root/ansible-playbook/redis.conf dest=/etc/redis.conf owner=redis
    notify: restart redis
  - name: start redis
    service: name=redis state=started
  handlers:
  - name: restart redis
    service: name=redis state=restarted

  8、檢查一下語法

    技術分享圖片

  9、執行以下:

技術分享圖片

  看的出來我們的執行沒有任何問題。

  10、-t參數指定,主要是用來指定標簽的用的。比如:

    技術分享圖片

    在對應的任務下添加一個標簽。可以做到只執行這一個任務就可以了。

  11、執行以下帶有標簽的哪個任務。

    技術分享圖片

    在上面的例子中,表示只執行了第二個name下的操作(復制文件並重啟redis),其他的操作,比如install redis不會再執行。

二、案例演示之---------------ansible-playbook傳遞參數來靈活的執行程序。

  使用-e參數可指定向yaml文件傳遞參數

  1、編輯yaml文件

- hosts: all
  remote_user: root
  tasks:
  - name: install package {{ pkgname }}
    yum: name={{ pkgname }} state=latest

  2、執行以下,主要演示傳遞參數(我們以幹跑為例)

  技術分享圖片

  3、下次我們就可以方便的換個程序包來安裝,非常靈活

  技術分享圖片

三、案例演示之------inventory參數。

  1、首先提前備好環境,也就是在節點上創建好用戶chaofeng,編寫好ansible-playbook腳本文件

- hosts: all
  remote_user: root
  tasks:
  - name: add user
    user: name=chaofeng system=no state=present
  - name: set passwd
    shell: echo chaofeng | passwd --stdin chaofeng

  2、執行一下:

  技術分享圖片

  表示在兩個節點上創建用戶chaofeng成功了。

  3、修改/etc/ansible/hosts文件。

    技術分享圖片

  4、測試一下:

    技術分享圖片

    向Inventory傳遞參數後,ansible則以指定的用戶運行程序。不過第一個用戶是root,這是因為在dbservers的執行順序是最後,因此172.16.0.53被重新使用root用戶來執行。所以同一臺主機之間會因主機組而受影響。

四、案例演示之-----使用模板自定義每個遠程節點的配置(遠程節點配置不相同)

  1、我們想在redis.conf配置文件中配置每個bind監聽為自己的IP,那麽要依照不同的節點IP來修改對應的bind值才行。 首先我們要使用setup模塊

[root@ELK-chaofeng01 ~]#ansible 172.16.0.52 -m setup | less

   找到如下所示的IP地址是如何獲取的。

   技術分享圖片

  2、接下來我們在redis的配置文件中取出ipv4的變量。此配置文件我又重新命名為redis.conf.j2

  技術分享圖片

  3、接下來編寫YAML文件

- hosts: all
  remote_user: root
  tasks:
  - name: install config file
    template: src=/root/ansible-playbook/redis.conf.j2 dest=/tmp/redis.conf

  註意:這裏我的目的是把redis.conf.j2的內容復制到遠程節點的/tmp/redis.conf文件裏面,最終的效果在這裏面看到。

  4、執行以下此腳本

  技術分享圖片

  5、我們到遠程節點查看一下/tmp/redis.conf文件。隨便一個遠程節點即可。

  技術分享圖片

  換一個遠程節點

  技術分享圖片

  成功了,我們在遠程主機上配置了模板,然後讓其按照不同節點的不同環境來進行配置。這就是模板的用處。

五、再來看一個案例------安裝httpd並添加其監聽端口。

  1、現在/etc/ansible/hosts文件裏面添加變量

    技術分享圖片

    兩個節點的默認監聽端口都有80端口,不過現在想一個節點添加端口8080,另外一個節點添加端口10080,在這裏定義要取用的變量

  2、定義YAML腳本文件

- hosts: all
  remote_user: root
  tasks:
  - name: install httpd
    yum: name=httpd state=installed
  - name: httpd config file
    template: src=/root/httpd_port.conf dest=/etc/httpd/conf.d/addport.conf
  - name: start httpd
    service: name=httpd state=started

  3、在中控機上添加httpd獲取變量值的配置文件,這個腳本最終是復制到節點上的/etc/httpd/conf.d目錄下,因此要以.conf結尾才行。

   技術分享圖片

  4、執行playbook腳本。

[root@ELK-chaofeng01 ~]#ansible-playbook fifth.yaml 

PLAY [all] ************************************************************************************************

TASK [Gathering Facts] ************************************************************************************
ok: [172.16.0.53]
ok: [172.16.0.52]

TASK [install httpd] **************************************************************************************
changed: [172.16.0.53]
changed: [172.16.0.52]

TASK [httpd config file] **********************************************************************************
changed: [172.16.0.53]
changed: [172.16.0.52]

TASK [start httpd] ****************************************************************************************
changed: [172.16.0.52]
changed: [172.16.0.53]

PLAY RECAP ************************************************************************************************
172.16.0.52                : ok=4    changed=3    unreachable=0    failed=0   
172.16.0.53                : ok=4    changed=3    unreachable=0    failed=0   

  5、去兩個節點上查看下狀況:

    第一個節點:

技術分享圖片

    第二個節點:

技術分享圖片

  成功,符合我們的需求。

六、Ansible-playbook之角色roles案例演示

  1、首先是創建角色需要的環境目錄

[root@ELK-chaofeng01 ~]#mkdir -pv /etc/ansible/roles

[root@ELK-chaofeng01 roles]#mkdir -pv nginx1/{files,templates,tasks,vars,handlers,meta,default}
mkdir: created directory ‘nginx1’
mkdir: created directory ‘nginx1/files’
mkdir: created directory ‘nginx1/templates’
mkdir: created directory ‘nginx1/tasks’
mkdir: created directory ‘nginx1/vars’
mkdir: created directory ‘nginx1/handlers’
mkdir: created directory ‘nginx1/meta’
mkdir: created directory ‘nginx1/default

  2、接下來需要創建基本的nginx.yml文件,這個是負責調用roles文件的

    技術分享圖片

  3、接下來我們就開始準備環境配置文件了。首先是

技術分享圖片

  4、接下來依次創建好各個需要的目錄和文件。先來創建基於模板虛擬主機配置文件

技術分享圖片

  5、既然修改了配置文件後需要重啟,那麽我們需要定義觸發器操作

技術分享圖片

  6、接下來是創建站點目錄

技術分享圖片

  因為我們已經在主任務tasks文件中有創建站點目錄的操作了,因此我們這裏只需要定義創建什麽目錄即可。

  7、復制html文件至站點

  技術分享圖片

  要復制的普通文本文件則是放在files目錄下。

  8、部署完成後,我們就可以執行了。

[root@ELK-chaofeng01 ~]#ansible-playbook nginx1.yaml

PLAY [all] ****************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************
ok: [172.16.0.53]
ok: [172.16.0.52]

TASK [nginx1 : install nginx] *********************************************************************************
changed: [172.16.0.53]
changed: [172.16.0.52]

TASK [nginx1 : config vhost1] *********************************************************************************
ok: [172.16.0.52]
changed: [172.16.0.53]

TASK [nginx1 : install site directory] ************************************************************************
ok: [172.16.0.53]
ok: [172.16.0.52]

TASK [nginx1 : install index html] ****************************************************************************
ok: [172.16.0.53]
ok: [172.16.0.52]

TASK [nginx1 : start nginx] ***********************************************************************************
changed: [172.16.0.52]
changed: [172.16.0.53]

RUNNING HANDLER [nginx1 : restart nginx] **********************************************************************
ok: [172.16.0.53]

PLAY RECAP ****************************************************************************************************
172.16.0.52                : ok=6    changed=2    unreachable=0    failed=0   
172.16.0.53                : ok=7    changed=3    unreachable=0    failed=0  

  這樣子就完成了。

總結:一個roles角色就是就是在/etc/ansible/roles目錄下創建一個主任務即可,比如我們這裏的主任務是nginx1,也就是要安裝nginx服務器。那麽在nginx1目錄下我們需要定義tasks、files、vars、handlers等環境依賴需要的目錄。所以說一個roles就是把一個大的任務通過分層來實現安裝並配置。在上面的例子中,我們還需要定義tags功能,可能有時候只是需要執行某一個步驟即可。

七、基於ansible的LNMT環境搭建。

  我們這裏是使用172.16.0.51作為ansible的中控機,172.16.0.52作為nginx的反向代理服務器同時還是負載均衡器,172.16.0.53是運行tomcat程序作為web服務器提供服務。不過只有一臺web服務器,我們依然使用負載均衡器來演示效果。

  1、首先是分配幾個角色,分別是nginx(反向代理)、tomcat(jsp執行器)、jdk(java運行環境),那麽需要我們依次在/etc/ansible/roles目錄下創建這幾個juese目錄。

[root@ELK-chaofeng01 roles]#mkdir -pv nginx/{files,templates,tasks,vars,handlers,meta,default}
[root@ELK-chaofeng01 roles]#mkdir -pv tomcat/{files,templates,tasks,vars,handlers,meta,default}
[root@ELK-chaofeng01 roles]#mkdir -pv jdk/{files,templates,tasks,vars,handlers,meta,default}

  2、接下來寫nginx的YAML文件

  技術分享圖片

  3、配置nginx負載均衡文件

  技術分享圖片

  4、準備handlers自動觸發文件

  技術分享圖片

  5、nginx服務器配置完成了,那麽現在我們需要配置tomcat的主任務tasks文件

  技術分享圖片

  6、tomcat配置完成後,開始配置jdk

  技術分享圖片

  7、env文件也是需要配置的,設置一下

  技術分享圖片

  8、配置tomcat需要的version

  技術分享圖片

  9、最後我們需要編輯playbook文件

  技術分享圖片

    在/etc/ansible/hosts看看我們是如何定義主機組的

      技術分享圖片

      我們就是在這裏針對不同的主機進行哪些操作。

  10、執行以下看看效果

[root@ELK-chaofeng01 ~]#ansible-playbook  nginx.2.yml 

PLAY [lb] ****************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************
ok: [172.16.0.52]

TASK [nginx : install nginx] *********************************************************************************
ok: [172.16.0.52]

TASK [nginx : install conf] **********************************************************************************
ok: [172.16.0.52]

TASK [nginx : start nginx] ***********************************************************************************
changed: [172.16.0.52]

PLAY [tcsrv] *************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************
ok: [172.16.0.53]

TASK [jdk : install openjdk] *********************************************************************************
changed: [172.16.0.53]

TASK [jdk : install env file] ********************************************************************************
changed: [172.16.0.53]

TASK [tomcat : install  package] *****************************************************************************
changed: [172.16.0.53]

TASK [tomcat : start tomcat] *********************************************************************************
changed: [172.16.0.53]

PLAY RECAP ***************************************************************************************************
172.16.0.52                : ok=4    changed=1    unreachable=0    failed=0   
172.16.0.53                : ok=5    changed=4    unreachable=0    failed=0   

  完美運行成功。

  11、最後我們在windows上運行一下,不過運行之前記得在172.16.0.52這個nginx反向代理主機上添加映射,如下所示:

    技術分享圖片

    還有在windows的hosts文件中定義:

    技術分享圖片

    最後在windows系統上的瀏覽器打開看一下。

        技術分享圖片

    完美運行成功。

ansible學習(二)