ansible

Ansible

一、運維工具的分類

agent:基於專用的agent程序完成管理功能,puppet, func, zabbix, ...
agentless:基於ssh服務完成管理,ansible, fabric, ...
1、什麼是ansible
ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。僅需在管理工作站上安裝ansible程序配置被管控主機的IP信息,被管控的主機無客戶端。ansible應用程序存在於epel(第三方社區)源,依賴於很多python組件。ansible是基於模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。
參考站點:http://www.ansible.com.cn
2、ansible架構
Ansible Core:ansible自身核心模塊
Modules:
    Core Modules:自帶模塊
    Customed Modules:自定義模塊
Host Iventory 主機清單,定義可管控的主機列表
    Files:;通過配置文件定義
    CMDB:使用外部存儲裝載要管理的主機來定義
PlayBooks:劇本,把需要完成的多個任務定義在劇本中
    Hosts:定義的劇本角色
    roles:定義好的任務功能由角色來完成
Connection Plugins:連接插件
    ansible基於連接插件連接到各個主機上,雖然ansible是使用ssh連接到各個主機的,但是它還支持其他的連接方法,所以需要有連接插件,尤其是要完成併發連接

UPddWIa.png

3、ansible特性
模塊化設計,調用特定的模塊來完成特定任務,本身是核心組件,短小精悍;
基於Python語言實現,由Paramiko(python的一個可併發連接ssh主機功能庫), PyYAML和Jinja2(模板化)三個關鍵模塊實現;
不需要在被管理節點上安裝客戶端,只要有sshd即可,部署非常簡單
支持自定義模塊,使用任意編程語言;
強大的playbook機制;
冪等性;

ansible的安裝和使用

ansible無服務器端,使用時直接運行命令即可,同時不需要在被管控主機上安裝任何客戶端,因此ansible是一個十分輕量級的工具,可以在epel源進行安裝,ansible已經被紅帽收購,相信不久會被收入base源配置好epel源後直接yum安裝ansible

7ejYrLl.png

Mkr2TtM.png

3.1、程序環境及主要配置文件
程序:
    ansible
    ansible-playbook 
    ansible-doc
配置文件:
    /etc/ansible/ansible.cfg
主機清單:
    /etc/ansible/hosts 
插件目錄:
    /usr/share/ansible_plugins/
配置Host Inventory示例:
    ]# cp hosts{,.bak}先做備份
    # Ex 1: Ungrouped hosts, specify before any group headers.直接在任何組的頭部前面指定,不屬於任何組的主機           
        green.example.com
        blue.example.com
        192.168.100.1
        192.168.100.10
    # Ex 2: A collection of hosts belonging to the 'webservers' group一批主機屬於一個組,例如定義爲'webservers'的組,且一個主機可以屬於多個組
        [webservers]
        alpha.example.org
        beta.example.org
        192.168.1.100
        192.168.1.110

二、ansible應用程序命令格式

1.ansible-doc命令:獲取模塊列表,及模塊使用格式;
ansible-doc -l:獲取列表
ansible-doc -s  module_name:獲取指定模塊的使用信息
2.命令格式
ansible  <host-pattern>  [-f forks] [-m module_name]  [-a args]
    <host-pattern> :指明管控主機,以模式形式表示或者直接給定IP,必須事先定義在文件中;all設置所有
                    <host-pattern>默認讀取/etc/ansible/hosts,也可以指明自定義文件路徑
                    -iPATH, --inventory=PATH:指明使用的host inventory文件路徑;
    [-f forks] :指明每批管控多少主機,默認爲5個主機一批次
    [-m module_name] :使用何種模塊管理操作,所有的操作都需要通過模塊來指定
    [-a args] :指明模塊專用參數;args一般爲key=value格式
                注意:command模塊的參數非爲kv格式,而是直接給出要執行的命令即可;
常用選項
    -m MOD_NAME  -a MOD_ARGS
3.ansible的連接:

通過前面的介紹我們知道,ansible是基於ssh協議來進行數據傳輸,ssh連接一般有兩種方法,一種是使用密碼密鑰,一種是使用公私密碼免密碼登錄,爲了順利使用ansible,下面配置基於公私密碼免密碼登錄

1)生成密鑰對
    [root@localhost]# ssh-keygen -t rsa 
        #-t表示使用的加密類型,其中rsa1表示version1版本,rsa、dsa、ecdsa的加密對於的是version2版本
    Generating public/private rsa key pair.
        #這裏詢問你要把生成的密鑰文件保存在哪裏,默認是在家目錄下的.ssh文件夾中,回車保存默認目錄
    Enter file in which to save the key (/root/.ssh/id_rsa): 
        #這裏是對密鑰文件加密,不輸入則表示不加密
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 

2)查看已經成功生成了一對密鑰
    [root@localhost ~]# ls /root/.ssh
    id_rsa  id_rsa.pub#其中id_rsa爲私鑰,id_rsa.pub爲公鑰

3)在生成完密鑰對之後將公鑰上傳給服務器對應用戶的家目錄
    [root@localhost ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
    [root@localhost ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
    [root@localhost ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]

4)配置ansible需要控制的主機列表,其配置在hosts文件中:
    [websrvs]
    192.168.25.139

    [dbsrvs]
    192.168.25.140
    192.168.25.141
3.1inventory參數:主機庫ssh參數設置

ansible基於ssh連接inventory中指定的遠程主機時,將以此處的參數指定的屬性進行;

ansible_ssh_port:指定ssh端口
ansible_ssh_user:指定ssh用戶
ansible_ssh_pass:指定ssh用戶登錄是認證密碼,明文密碼不安全
ansible_sudo_pass:指明sudo時候的密碼
示例:
    [websrvs]
    192.168.25.139  ansible_ssh_port=22  ansible_ssh_user=root  ansible_ssh_pass=ali
    192.168.25.140
注意:在/etc/ansible/hosts中直接定義連接時候的密碼不安全,一般建議基於ssh的密鑰認證方式實現
4.常用模塊

1)ping:探測目標主機是否存活;

[root@localhost ~]# ansible websrvs -m ping #指定一個主機組進行探測
[root@localhost ~]# ansible all -m ping #探測所有主機

2)command:默認模塊,可省略。在遠程主機上進行操作命令

-a 'COMMAND'

[root@localhost ~]# ansible all -m command -a "ifconfig"
[root@localhost ~]# ansible all -a "ifconfig"

3)shell:在遠程主機上調用shell解釋器運行命令,支持shell的各種功能,例如管道等 ;

-a 'COMMAND' 運行shell命令

[root@localhost ~]# ansible all -m shell -a "echo '1' |passwd --stdin root"
注意:command和shell模塊的核心參數直接爲命令本身;而其它模塊的參數通常爲“key=value”格式;

4)copy:複製文件到遠程主機

用法:(1) 複製文件 -a "src= dest= "(2) 給定內容生成文件 -a "content= dest= "

[root@localhost ~]# ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=640"
[root@localhost ~]# ansible all -m copy -a "content=hello\nmyali\n dest=/tmp/myali.ansible mode=640"

5)file:文件管理

用法:(1) 創建目錄:-a "path= state=directory" (2) 創建鏈接文件:-a "path= src= state=link" (3) 刪除文件:-a "path= state=absent“

[root@localhost ~]# ansible all -m file -a "path=/tmp/fstab.ansible owner=centos"
[root@localhost ~]# ansible all -m file -a "path=/tmp/fstab.ansible state=absent"
[root@localhost ~]# ansible all -m file -a "path=/tmp/dir.ansible state=directory"
[root@localhost ~]# ansible all -m file -a "path=/tmp/test.ansible.link src=/tmp/test.ansible state=link"

6)cron:管理週期性計劃任務

用法:-a ' minute= hour= day= month= weekday= job= name= user= state={present|absent}'

[root@localhost ~]# ansible all -m cron -a "minute='*/5' job='/usr/sbin/ntpdate 192.168.15.128 &> /dev/null' name='sync time'"
[root@localhost ~]# ansible all -m cron -a "name='sync time' state=absent"

7)hostname:設置主機名

用法:name=

8)yum:使用yum包管理器完成程序包管理

用法:(1) -a "name= state={present|latest}" 安裝程序包,(2) -a "name= state=absent" 刪除程序包

[root@localhost ~]# ansible all -m yum -a "name=httpd"
[root@localhost ~]# ansible all -m yum -a "name=httpd state=absent"

9)service:控制服務

用法:-a 'name= state={started|stopped|restarted} enabled=(是否開機自動啓動) runlevel='

[root@localhost ~]# ansible all -m service -a "name=httpd state=started enabled=true"

10)group:添加或刪除組

用法:-a 'name= state={present|absent} gid= system=(系統組)'

[root@localhost ~]# ansible all -m group -a 'name=mygroup state=present system=true'

11)user:管理組帳號

用法:-a 'name= state={present(創建)|absent(刪除)} force=(是否強制操作刪除家目錄) system= uid= shell= home='

[root@localhost ~]# ansible all -m user -a 'name=ansible state=present'

12)script:運行腳本

用法:-a '/PATH/TO/SCRIPT'運行腳本

[root@localhost ~]# ansible all -m script -a '/tmp/a.sh'

13)setup:獲取指定主機的facts變量;

[root@localhost ~]# ansible 192.168.25.139 -m setup

三、Playbooks劇本

playbooks是ansible更強大的配置管理組件,實現基於文本文件編排執行的多個任務,且多次重複執行

1.playbook組織格式:YAML語言格式

YAML類似於半結構化數據,聲明式配置;可讀性較高的用來表達資料序列的格式,易於與腳本語言交互

2.語法格式

1)任何數據結構都用縮進來標識,可以嵌套

2)每一行是一個鍵值數據key:value,冒號隔開。若想在一行標識需要用{ }和,分隔格式

3)列表用 – 標識

3Playbook

1)核心元素

Tasks:任務,由模塊定義的操作的列表;
Variables:變量
Templates:模板,即使用了模板語法的文本文件;
Handlers:處理器,由特定條件觸發的Tasks;
Roles:角色;由多個自包含的完整的Tasks,Variables,Templates,Handlers...等等組成的操作的集合

2)基礎組件:

Hosts:運行指定任務的目標主機;
remote_user:在遠程主機以哪個用戶身份執行;
    sudo_user:非管理員需要擁有sudo權限;
tasks:任務列表
    列表由模塊,模塊參數組成如下:
        格式:
            (1) action: module arguments
            (2) module: arguments

3)playbook定義任務: playbook的存儲在*.yaml文本中,需要創建一個yaml文件

- name: task description   註釋描述信息

module_name: module_args   聲明模塊:定義ansible模塊參數

lbBVUK1.png

4)ansible-playbook執行命令:

(1) 檢測語法
    ansible-playbook  --syntax-check  /path/to/playbook.yaml
(2) 測試運行
    ansible-playbook -C /path/to/playbook.yaml
        --list-hosts
        --list-tasks
        --list-tags
    [root@localhost ~]# ansible-playbook  --check --list-hosts --list-tasks group.yaml
(3) 運行
    ansible-playbook  /path/to/playbook.yaml
        -t TAGS, --tags=TAGS:只運行標記了的任務
        --skip-tags=SKIP_TAGS:跳過指定的標籤所標記的任務
        --start-at-task=START_AT:從指定的任務開始向後 運行

5)playbook---Variables 變量

1)變量命名:字母、數字和下劃線組成,僅能以字母開頭;
2)變量類型
    內建:
        1) facts:由遠程主機發回的主機特有的屬性信息,這些信息被保存在ansible變量中;無須聲明,可直接調用;
    自定義變量:
        1) 命令行傳遞;ansible-playbook  test.yml  --extra-vars "host=www user=test"
        2) 在hosts Inventory中爲每個主機定義專用變量值;
            a) 向不同的主機傳遞不同的變量 ;
                [websrvs]
                192.168.25.139    host=mail
                192.168.25.140
                192.168.25.141
            b) 向組內的所有主機傳遞相同的變量 ;
                [groupname:vars]
                variable_name=value
                注意:組名要事先存在,實例如下:
                    [websrvs]
                    192.168.25.139
                    192.168.25.140
                    [websrvs:vars]
                    host=mail
        3) 在playbook中定義
            vars:
            - var_name: value
            - var_name: value

        4) 在角色調用時傳遞
            roles:
            - { role: ROLE_NAME, var: value, ...}

3)變量調用:
    {{ var_name }}

6)Templates:模板

文本文件,內部嵌套有模板語言腳本(使用模板語言編寫)模板文件中可使用jinja2表達式,表達式要定義在{{}},也可以簡單地僅執行變量替換;

語法:

字面量:
    字符串:使用單引號或雙引號; 
    數字:整數、浮點數;
    列表:[item1, item2, ...]
    元組:(item1, item2, ...)
    字典:{key1:value1, key2:value2, ...}
    布爾型:true/false

算術運算:
    +, -, *, /, //, %, **

比較操作:
    ==, !=, >, <, >=, <=

邏輯運算:and, or, not 

執行模板文件中的腳本,並生成結果數據流,需要使用template模塊;
template模塊格式:
    -a ”“
    src=
    dest=
    mode=
    onwer=
    group=  
    注意:此模板不能在命令行使用,而只能用於playbook;   

定義方法:
    步驟1:在本地的nginx配置文件中寫入fact變量名稱
    步驟2:在yam文件中使用template模版將nginx配置文件複製到遠程主機,並且模版文件要以.j2結尾
    步驟3:執行ansible-playbook xxx.yaml命令,
    步驟4:在遠程主機上測試查看配置文件中的變量名稱傳遞過去的是否有值
示例:見後方;

7)條件測試

在某task後面添加when子句即可實現條件測試功能;when語句支持Jinja2語法;

有的時候在特定的主機需要跳過特定的步驟,例如在安裝包的時候,需要指定主機的操作系統類型,或者是當操作系統的硬盤滿了之後,需要清空文件等,可以使用when語句來做判斷 。when關鍵字後面跟着的是python的表達式,在表達式中你能夠使用任何的變量或者fact,當表達式的結果返回的是false,便會跳過本次的任務

示例:當系統版本是centos6和7時各使用不同的命令

- hosts: all
  remote_user: root
  tasks:
  - name: install nginx package
    yum: name=nginx state=latest
  - name: start nginx service6
    shell: service ngixn start
    when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6"
  - name: start nginx service
    shell: systemctl start ngixn.service
    when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"

8)循環:迭代,需要重複執行的任務;在task中調用內置的item變量;在某task後面使用with_items語句來定義元素列表;

元素:列表有兩種方式; 字符串和字典

循環迭代:基於字符串列表給出元素示例:

[root@localhost ~]# vim websrvs.yaml
    - hosts: websrvs
      remote_user: root
      tasks:
      - name: install packages
        yum: name={{ item  }} state=latest
        with_items:
        - httpd
        - php
        - php-mysql
        - php-mbstring
        - php-gd

循環迭代:基於字典列表給元素示例:

[root@localhost ~]# vim users.yaml
- hosts: all
  remote_user: root
  tasks:
  - name: create groups
    group: name={{ item }} state=present
    with_items:
    - groupx1
    - groupx2
    - groupx3
  - name: create users
    user: name={{ item.name }} group={{ item.group }} state=present
    with_items:
    - {name: 'userx1', group: 'groupx1'}
    - {name: 'userx2', group: 'groupx2'}
    - {name: 'userx3', group: 'groupx3'}

9)roles:角色

當單個playbook文件越來越大的時候,我們就需要重新來組織Playbooks了。我們可以將一個大的playbook拆成若干個小的 playbook文件,然後通過include的方式,在主配置文件中將這些零碎的小文件包含進來,這叫做playbook的包含。我們也可以按照一定的 規則將執行的某一類型任務放在一個目錄裏,並在這個目錄中再次對這個playbook按照 tasks,handlers,files,templates,vars等類型劃分成若干文件,將對應文件存放在對應的目錄中,這種組織方式就叫做 playbook的roles。

以特定的層級目錄結構進行組織的tasks、variables、handlers、templates、files等;

role_name/

files/:存儲由copy或script等模塊調用的文件; tasks/:此目錄中至少應該有一個名爲main.yml的文件,用於定義各task;其它的文件需要由main.yml進行“包含”調用; handlers/:此目錄中至少應該有一個名爲main.yml的文件,用於定義各handler;其它的文件需要由main.yml進行“包含”調用; vars/:此目錄中至少應該有一個名爲main.yml的文件,用於定義各variable;其它的文件需要由main.yml進行“包含”調用; templates/:存儲由template模塊調用的模板文本; meta/:此目錄中至少應該有一個名爲main.yml的文件,定義當前角色的特殊設定及其依賴關係;其它的文件需要由main.yml進行“包含”調用; default/:此目錄中至少應該有一個名爲main.yml的文件,用於設定默認變量;

在playbook中調用角色的方法: - hosts: HOSTS remote_user: USERNAME roles: - ROLE1 - ROLE2 - { role: ROLE3, VARIABLE: VALUE, ...} - { role: ROLE4, when: CONDITION }

5.playboot示例

1)基礎示例

[root@localhost ~]# vim group.yaml
[root@localhost ~]# cat group.yaml
 - hosts: all
   remote_user: root
   tasks:
   - name: install a group
     group: name=mygrp system=true
   - name: install a user
     user: name=user1 group=mygrp system=true

 - hosts: websrvs
   remote_user: root
   tasks:
   - name: install httpd package
     yum: name=httpd
   - name: start httpd service
     service: name=httpd state=started

正式使用時我們最好先預運行下看有沒有錯誤

[root@localhost ~]# ansible-playbook --check group.yaml

沒有問題就可以正式運行命令腳本了

[root@localhost ~]# ansible-playbook  group.yaml

fBHNRrQ.png

2)handlers:由特定條件觸發的Tasks;

只有其關注的條件滿足時,纔會被觸發執行的任務;

調用及定義方式:

tasks:
  - name: TASK_NAME
  module: arguments
  notify: HANDLER_NAME
handlers:
  - name: HANDLER_NAME
  module: arguments

handlers示例:

- hosts: websrvs
remote_user: root
tasks:
- name: install httpd package
  yum: name=httpd state=latest
- name: install conf file
  copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
  notify: reload httpd service
- name: start httpd service
  service: name=httpd state=started
handlers:
- name: reload httpd service
  shell: /usr/sbin/httpd reload

    修改Listen 80爲Linsten 8080:
[root@localhost ~]# ansible-playbook --check web.yaml
[root@localhost ~]# ansible-playbook web.yaml

bWUgZgL.png

3)tags:給指定的任務定義一個調用標識;

- name: NAME
module: arguments
tags: TAG_ID

tags示例:

- hosts: websrvs
  remote_user: root
  tasks:
  - name: install httpd package
    yum: name=httpd state=latest
  - name: install conf file
    copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
    tags: instconf
    notify: reload httpd service
  - name: start httpd service
    service: name=httpd state=started
  handlers:
  - name: reload httpd service
    shell: service httpd reload

[root@localhost ~]# ansible-playbook --check -t instconf web.yaml

[root@localhost ~]# ansible-playbook -t instconf web.yaml

8l3G331.png

mYd4N1O.png

注意:多個任務可以使用同一個tags,也可以一次任務指多個tags,執行命令時多個tags用,號隔開;如下圖

[root@localhost ~]# ansible-playbook -t instconf,instpkg web.yaml

i4cYc2n.png

sJGK6D9.png

4)variables示例(1)

- hosts: websrvs
  remote_user: root
  vars:
  - pkgname: vsftpd
  tasks:
  - name: install a package
    yum: name={{ pkgname }} state=present

[root@localhost ~]# ansible-playbook  pkg.yaml 直接執行yaml腳本,安裝的是劇本中定義的變量

[root@localhost ~]# ansible-playbook  -e pkgname=memcached pkg.yaml 注意:命令行變量的優先於劇本中定義的值

sFvyyo6.png

4)variables示例(2):向不同的系統傳遞不同的變量

編輯劇本

- hosts: websrvs
  remote_user: root
  tasks:
  - name: install a package
    yum: name={{ pkgname }} state=present

編輯hosts文件,將變量賦值到hosts對應的主機後,實現不同主機安裝不同的程序包

[websrvs]
192.168.25.139 pkgname=nginx
192.168.25.140 pkgname=httpd

4)variables示例(3):在hosts文件中向一個主機組賦值變量

[websrvs]
192.168.25.139 
192.168.25.140 

[websrvs:vars]
pkgname=memcached

[dbsrvs]
192.168.25.141

5)Templates:模板;示例1

第一步:ansible主機編輯配置文件作爲要使用templates傳遞的文件;以nginx的配置文件中的cpu核心數爲例

[root@localhost ~]# vim  /root/nginx.conf.j2 

#user  nobody;
worker_processes  {{ ansible_processor_vcpus }};

第二步:編輯playbook調用templates模塊

[root@localhost ~]# vim test.yaml

- hosts: websrvs
  remote_user: root
  tasks:
  - name: genrrate conf file
    template: src=/root/nginx.conf.j2 dest=/tmp/nginx.conf

第三步:執行playbook命令

[root@localhost ~]# ansible-playbook  test.yaml

第四步:在對應的被管控主機上查看配置文件中的變量是否是響應的值

[root@localhost ~]# less /tmp/nginx.conf    

#user  nobody;
worker_processes  1;

5)Templates:模板;示例2:定義一個名爲nginx.yaml的模版劇本,完成安裝nginx程序包,複製配置文件,啓動服務,定義tags通知處理器完成服務重載

第一步:在ansible主機的/etc/ansible/hosts文件中定義一個nginx組

[nginx]
192.168.25.139 
192.168.25.140

第二步:寫一個nginx專用的yaml文件,注意:在安裝程序包的時候依賴與遠程主機的yum源,如果沒有yum源的話,可以使用shell模塊讓遠程主機先下載一個程序包,然後再執行後續的安裝任務,在安裝任務時指明yum: name=絕對路徑來進行

- hosts: nginx
  remote_user: root
  tasks:
  - name: install nginx package
    yum: name=nginx state=latest
  - name: install conf file
    template: src=/root/nginx.conf.j2 dest=/etc/nginx/nginx.conf
    tags: ngxconf
    notify: reload nginx service
  - name: start nginx service
    service: name=nginx state=started enabled=true
  handlers:
  - name: reload nginx service
    shell: /usr/sbin/nginx -s reload

第三步:提供一個.j2結尾的nginx配置文件,裏邊寫上自己需要的配置

[root@localhost ~]# vim nginx.conf.j2

第四步:執行ansible-playbook命令,運行nginx.yaml

[root@localhost ~]# ansible-playbook --check nginx.yaml  注意:測試運行的時候因爲遠程主機沒有安裝程序包,所以在執行到第三個任務時會出錯,沒有影響,直接運行就可以了

[root@localhost ~]# ansible-playbook  nginx.yaml

第五步:在遠程主機查看是否生效

6)循環迭代:基於字符串列表給出元素示例:

[root@localhost ~]# vim websrvs.yaml
    - hosts: websrvs
      remote_user: root
      tasks:
      - name: install packages
        yum: name={{ item  }} state=latest
        with_items:
        - httpd
        - php
        - php-mysql
        - php-mbstring
        - php-gd

7)循環迭代:基於字典列表給元素示例:

[root@localhost ~]# vim users.yaml
- hosts: all
  remote_user: root
  tasks:
  - name: create groups
    group: name={{ item }} state=present
    with_items:
    - groupx1
    - groupx2
    - groupx3
  - name: create users
    user: name={{ item.name }} group={{ item.group }} state=present
    with_items:
    - {name: 'userx1', group: 'groupx1'}
    - {name: 'userx2', group: 'groupx2'}
    - {name: 'userx3', group: 'groupx3'}

8)roles示例nginx

cd到ansible角色目錄
[root@localhost ~]# cd /etc/ansible/roles/


創建角色和各角色下的目錄
[root@localhost roles]# mkdir ./{nginx,memcached,httpd,mysql}/{files,templates,vars,handlers,meta,default,tasks} -pv


爲nginx/files/目錄下提供nginx的rpm包
lftp 10.1.0.1:/pub/Sources/6.x86_64/nginx> mget nginx-1.6.2-1.el6.ngx.x86_64.rpm 

安裝nginx程序 只爲了拷貝配置文件
[root@localhost nginx]# yum install files/nginx-1.6.2-1.el6.ngx.x86_64.rpm 

編輯nginx的tasks
[root@localhost roles]# vim  nginx/tasks/main.yml
    - name: copy nginx package to remote host
      copy: src=nginx-1.6.2-1.el6.ngx.x86_64.rpm dest=/tmp/nginx-1.6.2-1.el6.ngx.x86_64.rpm
    - name: install nginx package
      yum: name=/tmp/nginx-1.6.2-1.el6.ngx.x86_64.rpm state=present
    - name: install conf file nginx.conf
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
      tags: ngxconf
      notify: reload nginx service
    - name: start nginx service
      service: name=nginx enabled=true state=started
    - name: install conf file default.conf
      template: src=default.conf.j2 dest=/etc/nginx/conf.d/default.conf
      tags: ngxconf
      notify: reload nginx service


編輯nginx的handlers
[root@localhost roles]# vim nginx/handlers/main.yml
    - name: reload nginx service
      service: name=nginx state=restarted

爲nginx提供配置文件這裏直接複製本機的配置文件做修改
[root@localhost roles]# cp /etc/nginx/nginx.conf nginx/templates/nginx.conf.j2
[root@localhost roles]# vim nginx/templates/nginx.conf.j2
    user  nginx;
    worker_processes  {{ ansible_processor_vcpus }};注意cpu可以減1 或者減2 如: {{ ansible_processes_vcpus - 1 }};
[root@localhost nginx]# cp /etc/nginx/conf.d/default.conf templates/default.conf.j2
[root@localhost nginx]# vim templates/default.conf.j2
    server {
        listen       {{ ngxport }};
        server_name  localhost;

編輯nginx的變量
[root@localhost nginx]# vim vars/main.yml
    ngxport: "8090" 這裏定格寫

編輯調用角色的配置文件:
[root@localhost ansible]# vim /etc/ansible/nginx.yml
    - hosts: nginx
      remote_user: root
      roles:
      - nginx

編輯ansible的配置文件,啓用roles尋找路徑
[root@localhost ~]# vim /etc/ansible/ansible.cfg
    36 roles_path    = /etc/ansible/roles

測試運行
[root@localhost ansible]# ansible-playbook --check nginx.yml

沒有問題就可以直接運行了
[root@localhost ansible]# ansible-playbook  nginx.yml

執行成功以後就可以在其他主機上測試了 
[root@localhost ~]# ss -tnl
    8090端口處於監聽狀態

現在再次讓nginx監聽到8080端口;
編輯nginx.yml配置文件
[root@localhost ansible]# vim nginx.yml 
- hosts: nginx
 remote_user: root
 roles:
 - { role: nginx, ngxport: 8080 }

執行命令:指明標籤跳過其他任務只執行ngxconf標籤
[root@localhost ansible]# ansible-playbook -t ngxconf nginx.yml

在遠程主機上查看監聽端口,已經是8080了
    ]# ss -tnl

8)relos示例memcached

[root@localhost ansible]# yum install memcached -y

[root@localhost ansible]# vim roles/memcached/tasks/main.yml
    - name: install memcached
      yum: name=memcached state=latest
    - name: install conf file
      template: src=memcached.j2 dest=/etc/sysconfig/memcached
      tags: mcconf
      notify: reload memcached
    - name: start memcached service
      service: name=memcached state=started enabled=true

[root@localhost ansible]# vim roles/memcached/handlers/main.yml
    - name: reload memcached
      service: name=memcached state=restarted

[root@localhost ansible]# cp /etc/sysconfig/memcached roles/memcached/templates/memcached.j2

[root@localhost ansible]# vim roles/memcached/templates/memcached.j2
    PORT="11211"
    USER="memcached"
    MAXCONN="1024"
    CACHESIZE="{{ ansible_memtotal_mb // 4 }}"
    OPTIONS=""

[root@localhost ansible]# vim nginx.yml 
    - hosts: nginx
      remote_user: root
      roles:
      - nginx
      - memcached
[root@localhost ansible]# ansible-playbook nginx.yml 
[root@localhost ~]# cat /etc/sysconfig/memcached 遠程主機查看內存大小
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="245"
OPTIONS=""

8)relos示例mysqk

[root@localhost ansible]# vim roles/mysql/tasks/main.yml
    - name: install mysql-server
      yum: name=mysql-server state=latest
      when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6"
    - name: install mariadb-server
      yum: name=mysql-server state=latest
      when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"
    - name: start mysql service
      service: name=mysqld state=started
      when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6"
    - name: start mariadb service
      service: name=mariadb state=started
      when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"

[root@localhost ansible]# vim db.yml
    - hosts: dbsrvs
      remote_user: root
      roles:
      - mysql

[root@localhost ansible]# ansible-playbook  db.yml


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