20171118 Ansible

  • ansible介紹
  • ansible常用模塊使用
  • playbook
  • templates,模板
  • 條件測試和循環(huán)迭代
  • roles宁舰,角色

一拼卵、ansible介紹

  • ansible:自動化運(yùn)維工具,實(shí)現(xiàn)了批量系統(tǒng)配置蛮艰、批量程序部署腋腮、批量運(yùn)行命令

  • 特性:
    模塊化:調(diào)用特定的模塊,完成特定任務(wù)
    基于Python語言實(shí)現(xiàn):包含Paramiko, PyYAML和Jinja2三個關(guān)鍵模塊
    部署簡單:agentless壤蚜,不需在被配置主機(jī)安裝客戶端
    支持自定義模塊
    支持playbook
    冪等性:任意多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的影響相同

  • 文件結(jié)構(gòu):
    配置文件:/etc/ansible/ansible.cfg
    主機(jī)清單:/etc/ansible/hosts

    • 主機(jī)清單配置文件格式:
    [webservers]      // 主機(jī)組名即寡,包含下面的主機(jī)
    alpha.example.org
    beta.example.org
    192.168.1.100
    192.168.1.110
    
  • 主程序:
    /usr/bin/ansible
    /usr/bin/ansible-playbook
    /usr/bin/ansible-doc

二、ansible常用模塊使用

(一)ansible使用語法:

// 調(diào)用模塊執(zhí)行操作
ansible  HOST-PATTERN  -m MOD_NAME  -a  MOD_ARGS -f FORKS -C -u USERNAME -c CONNECTION
// 列出所有可以調(diào)用的模塊
ansible-doc  -l
// 列出指定模塊的使用方法
ansible-doc -s MOD_NAME
  • 測試1:ping模塊袜刷,測試管理的主機(jī)的網(wǎng)絡(luò)連接狀態(tài)聪富,連接成功返回pong
    ansible all -m ping

(二)command模塊:在遠(yuǎn)程主機(jī)運(yùn)行命令

  • chdir=/PATH/TO/DIR:
    執(zhí)行命令前切換工作目錄至指定的位置
  • creates=/PATH/TO/SOMEFILE_OR_DIR:
    如果此處給定的文件或目錄存在,則不執(zhí)行命令
  • removes=/PATH/TO/SOMEFILE_OR_DIR:
    如果此處給定的文件或目錄不存在著蟹,則不執(zhí)行命令墩蔓;即此處給定的文件或目錄存在時方執(zhí)行命令
  • 測試2:查詢管理主機(jī)指定網(wǎng)卡狀態(tài)
    ansible all -m command -a 'ip a show ens33'
  • 測試3:chdir的作用為在執(zhí)行命令前切換至相應(yīng)目錄
    ansible 192.168.136.230 -m command -a 'pwd chdir=/tmp'
    ansible 192.168.136.230 -m command -a 'pwd'
  • 省略-m MOD_NAME時,則代表command模塊

(三)shell模塊:在遠(yuǎn)程主機(jī)的shell進(jìn)程下運(yùn)行命令萧豆,支持shell特性奸披,如管道等

  • chdir=:
    執(zhí)行命令前切換工作目錄至指定的位置
  • creates=/PATH/TO/SOMEFILE_OR_DIR:
    如果此處給定的文件或目錄存在,則不執(zhí)行命令
  • removes=/PATH/TO/SOMEFILE_OR_DIR:
    如果此處給定的文件或目錄不存在涮雷,則不執(zhí)行命令阵面;即此處給定的文件或目錄存在時方執(zhí)行命令
  • executable=/PATH/TO/SHELL:指定運(yùn)行命令使用的shell解釋器
  • 測試4:管理遠(yuǎn)程主機(jī)——修改賬號密碼
    ansible websrvs -m shell -a 'echo centos | passwd --stdin user1 '

(四)group模塊:管理組賬號

  • name=:必須參數(shù),組賬號名
  • state=present | absent:建立/刪除組賬號
  • system=yes | no:是否為系統(tǒng)賬號
  • gid=:組ID
  • 測試5:管理遠(yuǎn)程主機(jī)——建立組
    ansible websrvs -m group -a 'name=haproxy system=yes state=present'

(五)user模塊:管理用戶賬號

  • name=:必須參數(shù)洪鸭,用戶賬號名
  • system=yes | no:是否為系統(tǒng)賬號
  • uid=:用戶ID
  • shell=:指定shell類型
  • group=:指定主組
  • groups=:指定附加組
  • comment=:指定說明
  • home=:指定家目錄
  • generate_ssh_key=:是否生成ssh密鑰
  • 測試6:管理遠(yuǎn)程主機(jī)——建立用戶
    ansible websrvs -m user -a 'name=john groups=haproxy state=present shell=/bin/tcsh generate_ssh_key=true'

(六)copy模塊: Copies files to remote locations

  • 用法1:src= dest=:
    將本地的文件復(fù)制到管理的主機(jī)組中
  • 用法2:content= dest=:
    在管理的主機(jī)組中中創(chuàng)建文件样刷,由content關(guān)鍵詞指定內(nèi)容
  • owner=:指定所有者
  • group=:指定所屬組
  • mode=:指定權(quán)限
  • 測試7:復(fù)制文件至遠(yuǎn)程主機(jī)指定目錄
    ansible all -m copy -a 'src=test.txt dest=/tmp/ owner=nobody group=daemon mode=664'
  • 測試8:將內(nèi)容裝入文件復(fù)制至遠(yuǎn)程主機(jī)指定目錄
    ansible all -m copy -a "content='hello everyone\n' dest=/tmp/test2.txt owner=nobody group=daemon mode=664"

(七)fetch模塊:Fetches a file from remote nodes

從遠(yuǎn)程節(jié)點(diǎn)獲取文件

(八)file模塊: Sets attributes of files

  • 用法:
    創(chuàng)建鏈接文件:path= src= state=link
    修改屬性:path= owner= mode= group=
    創(chuàng)建目錄:path= state=directory

  • 注意:state屬性的可用值
    file:僅在修改已經(jīng)存在文件的屬性時使用
    directory:目錄
    link:軟鏈接
    hard:硬鏈接
    touch:創(chuàng)建空白文件
    absent:刪除

  • 測試9:在遠(yuǎn)程主機(jī)建立目錄
    ansible all -m file -a "path=/tmp/hidir state=directory mode=770"

  • 測試10:在遠(yuǎn)程主機(jī)建立空文件
    ansible all -m file -a "path=/tmp/hifile state=touch mode=660"

  • 測試11:在遠(yuǎn)程主機(jī)建立軟鏈接
    ansible all -m file -a "path=/tmp/mytext.txt src=/tmp/test2.txt state=link"

  • 測試12:在遠(yuǎn)程主機(jī)刪除軟鏈接
    ansible all -m file -a "path=/tmp/mytext.txt state=absent"

(九)get_url模塊: Downloads files from HTTP, HTTPS, or FTP to node

  • url=:必須參數(shù)
  • dest=:必須參數(shù)
  • sha256sum=:校驗(yàn)完整性
  • owner, group, mode:所有者,所屬組览爵,權(quán)限
  • 測試13:在遠(yuǎn)程主機(jī)上從網(wǎng)絡(luò)鏈接下載文件
    ansible all -m get_url -a "url=http://172.16.0.1/centos/7/Packages/ImageMagick-6.7.8.9-15.el7_2.x86_64.rpm dest=/tmp/"

(十)cron 模塊:Manage cron.d and crontab entries.

  • minute=:時間
  • day=:天
  • month=:月
  • weekday=:工作日
  • hour=:消失
  • job=:執(zhí)行的程序
  • name=:名稱置鼻,必須參數(shù)
  • state=present|absent:創(chuàng)建或刪除
  • 測試14:設(shè)置遠(yuǎn)程主機(jī)每5分鐘向主機(jī)172.18.0.1同步時間
    ansible all -m cron -a "name='timesync' job='/usr/sbin/ntpdate 172.18.0.1 &> /dev/null' minute='*/5' "

(十一)hostname模塊:Manage hostname

  • name=:主機(jī)名

(十二)包管理相關(guān)模塊

(1)yum模塊:Manages packages with the 'yum' package manager
  • name=:程序包名稱,可以帶版本號
  • state=
    present, latest, installed:安裝
    absent, removed:卸載
  • 測試15:遠(yuǎn)程安裝軟件包
    ansible websrvs -m yum -a "name=nginx state=latest"
  • 查看遠(yuǎn)程主機(jī)指定軟件包的安裝狀態(tài)
    ansible websrvs -m yum -a "list=nginx"
(2)pip模塊:Manages Python library dependencies
  • name=
  • state=
  • version=
(3)npm模塊:Manage node.js packages with npm
  • name=
  • state=
  • version=

(十三)service模塊:管理服務(wù)

  • name=:服務(wù)名稱拾枣,必備參數(shù)
  • state=started | stopped | restarted:服務(wù)啟動沃疮,關(guān)閉盒让,重啟
  • enabled=:是否開機(jī)啟動
  • runlevel=:運(yùn)行級別梅肤,適用于init腳本啟動
  • 測試16:遠(yuǎn)程啟動指定服務(wù)司蔬,并設(shè)置為開機(jī)啟動服務(wù)
    ansible websrvs -m service -a "name=nginx enabled=true state=started"

(十四)其他模塊

(1)git模塊:Deploy software (or files) from git checkouts
  • repo=:git源
  • dest=:存儲的本地路徑
  • version=
(2)deploy_helper模塊:Manages some of the steps common in deploying projects
(3)haproxy模塊:Enable, disable, and set weights for HAProxy backend servers using socket commands.
  • backend=:后端主機(jī)
  • host=:必備參數(shù),后端主機(jī)名稱
  • state=:必備參數(shù)姨蝴,后端主機(jī)狀態(tài)
  • weight=:后端主機(jī)權(quán)重

三俊啼、playbook

  • playbook:一種簡單的配置管理系統(tǒng)與多機(jī)器部署系統(tǒng)的基礎(chǔ),可以編排有序的執(zhí)行過程左医,甚至于做到在多組機(jī)器間,來回有序的執(zhí)行特別指定的步驟授帕,并且可以同步或異步的發(fā)起任務(wù)

(一)YAML介紹:

  • playbook采用YAML格式
  • YAML:Yet Another Markup Language,一個可讀性高浮梢,用來表達(dá)數(shù)據(jù)序列的格式
  • YAML能表達(dá)的基本數(shù)據(jù)結(jié)構(gòu):標(biāo)量跛十、數(shù)組、關(guān)聯(lián)數(shù)組

(二)playbook的運(yùn)用:

(1)playbook的核心元素:
  • hosts:主機(jī)
  • tasks:任務(wù)列表
  • variables:變量
  • templates:包含了模板語法的文本文件
  • handlers:由特定條件觸發(fā)的任務(wù)
(2)playbook的基礎(chǔ)組件:
  • hosts:運(yùn)行指定任務(wù)的目標(biāo)主機(jī)

  • remoute_user:在遠(yuǎn)程主機(jī)上執(zhí)行任務(wù)的用戶秕硝,權(quán)限提升時可能要用到sudo_user

  • tasks:任務(wù)列表

    • 格式:
      (1) action: module arguments
      (2) module: arguments
      注意:shell和command模塊后面直接跟命令芥映,而非key=value類的參數(shù)列表;
    • 某任務(wù)的狀態(tài)在運(yùn)行后為changed時远豺,可通過notify通知給相應(yīng)的handlers奈偏;
    • 任務(wù)可以通過tags打標(biāo)簽,而后可在ansible-playbook命令上使用-t指定進(jìn)行調(diào)用躯护;
  • handlers:處理器惊来,在特定條件下觸發(fā)任務(wù)
    接收到其它任務(wù)的通知時被觸發(fā)
    notify: HANDLER TASK NAME

(三)變量:variables

(1)直接調(diào)用
  • 注意:可使用setup模塊直接獲取目標(biāo)主機(jī)的facters
(2)用戶自定義變量:
  • 方法一:ansible-playbook命令行中指定
    -e VARS, --extra-vars=VARS

  • 方法二:在playbook中定義變量
    - var1: value1
    變量引用:{{ variable }},注意變量名前后均有空格

  • 方法三:通過roles傳遞變量

  • 方法四:Host Inventory棺滞,主機(jī)清單

    • 用戶自定義變量

      • 向不同的主機(jī)傳遞不同的變量
        IP/HOSTNAME varaiable=value var2=value2
      • 向組中的主機(jī)傳遞相同的變量
        [groupname:vars]
        variable=value
      • 注意:優(yōu)先級低于playbook中的定義
    • invertory參數(shù)
      用于定義ansible遠(yuǎn)程連接目標(biāo)主機(jī)時使用的參數(shù)裁蚁,而非傳遞給playbook的變量
      IP/HOSTNAME [ ansible_ssh_host | ansible_ssh_port | ansible_ssh_user | ansible_ssh_pass | ansbile_sudo_pass],危險不建議使用

(3)測試playbook:
  • ansible-playbook --check|-C
    只檢測可能會發(fā)生的改變继准,但不真正執(zhí)行操作
  • ansible-playbook --list-hosts
    列出運(yùn)行任務(wù)的主機(jī)
  • ansible-playbook --list-tasks
    列出要運(yùn)行的任務(wù)列表
  • ansible-playbook --syntax-check
    語法檢查

(四)實(shí)驗(yàn)1:playbook實(shí)現(xiàn)基本的遠(yuǎn)程配置

  • 實(shí)驗(yàn)環(huán)境:
    web服務(wù)器:192.168.136.230, 192.168.136.130
    數(shù)據(jù)庫服務(wù)器:192.168.136.131

  • 實(shí)現(xiàn)目標(biāo):
    web服務(wù)器:自動安裝并啟動nginx服務(wù)
    數(shù)據(jù)庫服務(wù)器:自動安裝redis厘擂,統(tǒng)一配置文件內(nèi)容,最后啟動redis服務(wù)

(1)實(shí)現(xiàn)過程:
  • 準(zhǔn)備步驟:在ansible主機(jī)上使用ssh-keygen -t rsa生成公鑰和私鑰锰瘸,使用ssh-copy-id ip_address將公鑰復(fù)制到需要管理的每臺主機(jī)上

  • 步驟1:配置/etc/ansible/hosts文件刽严,將服務(wù)器歸類稱為不同的組,方便管理

[websrvs]     // web服務(wù)器組避凝,命名為websrvs
192.168.136.230
192.168.136.130

[dbsrvs]     // web服務(wù)器組舞萄,命名為dbsrvs
192.168.136.131
  • 步驟2:配置playbook文件
- hosts: websrvs
  remote_user: root
  tasks:
  - name: install nginx package     // 安裝nginx服務(wù)
    yum: name=nginx state=latest
  - name: start nginx service       // 啟動nginx服務(wù)
    service: name=nginx enabled=true state=started

- hosts: dbsrvs
  remote_user: root
  tasks:
  - name: install redis package     // 安裝redis服務(wù)
    yum: name=redis state=latest
  - name: install conf file         // 復(fù)制redis配置文件至遠(yuǎn)程主機(jī)
    copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644     
    // 提前準(zhǔn)備好redis配置文件
  - name: start redis service       // 啟動redis服務(wù)
    service: name=redis state=started
  • 步驟3:測試并運(yùn)行
ansible-playbook --list-hosts nginx.yaml    // 列出playbook中的主機(jī)
ansible-playbook --list-tasks nginx.yaml    // 列出playbook中的任務(wù)
ansible-playbook --syntax-check nginx.yaml  // 檢查YAML文件的語法
ansible-playbook -C nginx.yaml              // 預(yù)測執(zhí)行playbook可能發(fā)生的變化,但實(shí)際不執(zhí)行
ansible-playbook nginx.yaml                 // 執(zhí)行playbook
ansible websrvs -m setup                    // 查看執(zhí)行playbook時收集的信息

列出playbook中的主機(jī)

列出playbook中的任務(wù)

預(yù)測執(zhí)行playbook可能發(fā)生的變化

(2)缺陷分析:
  • 問題1:當(dāng)配置文件修改后管削,執(zhí)行playbook會重復(fù)執(zhí)行所有任務(wù)倒脓,而大部分任務(wù)沒有修改
  • 問題2:雖然配置得到了更新侄刽,但是服務(wù)已經(jīng)開啟逝薪,故服務(wù)不會重啟載入配置
  • 解決:問題1可以通過定義標(biāo)簽盹靴,指定只執(zhí)行標(biāo)簽處的任務(wù);問題2可以通過定義重新啟動服務(wù)的任務(wù)陷谱,并聲明只在配置更改時執(zhí)行:
  • 實(shí)現(xiàn)步驟1:修改playbook文件
vim nginx.yaml
- hosts: websrvs
  remote_user: root
  tasks:
  - name: install nginx package
    yum: name=nginx state=latest
  - name: start nginx service
    service: name=nginx enabled=true state=started

- hosts: dbsrvs
  remote_user: root
  tasks:
  - name: install redis package
    yum: name=redis state=latest
  - name: install conf file
    copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
    tags: instconf                   // 對install conf file任務(wù)打標(biāo)簽
    notify: restart redis service    // 當(dāng)配置文件變更時,才執(zhí)行名為restart redis service的handler
  - name: start redis service
    service: name=redis state=started
  handlers:                          // 定義handler易核,由notify語句在某些情況下被觸發(fā)
  - name: restart redis service
    service: name=redis state=restarted
  • 實(shí)現(xiàn)步驟2:修改/root/redis.conf文件狼电,執(zhí)行playbook并指定只執(zhí)行標(biāo)簽instconf處的任務(wù)
    ansible-playbook -t instconf nginx.yaml

可以看到執(zhí)行結(jié)果中只執(zhí)行了tag處的任務(wù),并且觸發(fā)執(zhí)行名為restart redis service 的handler

  • 實(shí)現(xiàn)步驟3:再次執(zhí)行上一條命令

可以看到只執(zhí)行了標(biāo)簽instconf的任務(wù)盆均,但由于配置沒有改變塞弊,故沒有觸發(fā)執(zhí)行名為restart redis service 的handler

(五)實(shí)驗(yàn)2:playbook中定義變量

  • 編輯instalpkg.yml文件,實(shí)現(xiàn):當(dāng)不指定變量pkgname時泪姨,自動安裝tree游沿;當(dāng)指定pkgname的值時,安裝指定的軟件包
- hosts: websrvs
  remote_user: root
  vars:
  - pkgname: tree
  tasks:
  - name: install package
    yum: name={{ pkgname }} state=latest
  • 可以看到被管理的主機(jī)成功安裝肮砾;變量的引用也可以應(yīng)用到name中诀黍,這樣可以看到當(dāng)前被安裝的軟件名稱,對instalpkg.yml文件做修改后如下:
- hosts: websrvs
  remote_user: root
  vars:
  - pkgname: tree
  tasks:
  - name: install package {{ pkgname }}     // 做修改處
    yum: name={{ pkgname }} state=latest
  • 此時可以看到默認(rèn)安裝tree
  • 指定變量pkgname的值
    ansible-playbook -e "pkgname=memcached" -C instalpkg.yml
    此時可以看到安裝軟件為memcached

四仗处、templates眯勾,模板

(一)template介紹:

  • 定義:基于模板方式生成一個文件復(fù)制到遠(yuǎn)程主機(jī)

  • 實(shí)質(zhì):文本文件,嵌套有腳本(使用模板編程語言編寫)疆柔,類比php嵌入html文件的關(guān)系

(二)template配置:

  • template模塊的使用:類似copy
    src, dest, owner, group, mode

  • 腳本語言:Jinja2咒精,語法如下

    • 字符串:使用單引號或雙引號;
    • 數(shù)字:整數(shù)旷档,浮點(diǎn)數(shù)模叙;
    • 列表:[item1, item2, ...]
    • 元組:(item1, item2, ...)
    • 字典:{key1:value1, key2:value2, ...}
    • 布爾型:true/false
    • 算術(shù)運(yùn)算:+, -, *, /, //, %, **
    • 比較操作:==, !=, >, >=, <, <=
    • 邏輯運(yùn)算:and, or, not

(三)實(shí)驗(yàn)3:實(shí)現(xiàn)自動安裝redis,之后修改配置文件/etc/redis.conf的maxmemory值為主機(jī)總內(nèi)存大小的一半鞋屈,并且自動重啟服務(wù)使配置生效

  • 步驟1:編輯/root/redis_install_and_conf.yml文件范咨,實(shí)現(xiàn)實(shí)驗(yàn)要求
vim /root/redis_install_and_conf.yml
- hosts: dbsrvs
  remote_user: root
  tasks:
// 安裝
  - name: install redis
    yum: name=redis state=latest
// 復(fù)制配置文件模板
  - name: install redis conf
    template: src=/root/redis.conf.j2 dest=/etc/redis.conf owner=redis group=root mode=644
    notify: restart redis service
    tags: install_conf
// 啟動服務(wù)
  - name: start redis service
    service: name=redis state=started
// 條件觸發(fā)任務(wù)
  handlers:
  - name: restart redis service
    service: name=redis state=restarted
  • 步驟2:準(zhǔn)備配置文件
cp /etc/redis.conf /root/redis.conf.j2
vim /root/redis.conf.j2
maxmemory {{ ansible_memtotal_mb /2  }}mb     // 添加此行,自動根據(jù)安裝主機(jī)的內(nèi)存容量設(shè)置
  • 步驟3:測試并執(zhí)行playbook
ansible-playbook -C /root/redis_install_and_conf.yml 
ansible-playbook /root/redis_install_and_conf.yml 

可以看到install redis conf任務(wù)成功執(zhí)行

查看被安裝的主機(jī)上的/etc/redis.conf文件厂庇,maxmemory值根據(jù)主機(jī)內(nèi)存情況動態(tài)設(shè)置

五渠啊、條件測試和循環(huán)迭代:

(一)條件測試:when

  • 適用于根據(jù)被管理主機(jī)參數(shù)的不同采取不同的操作

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

tasks: 
- name: install conf file to centos7
  template: src=/etc/nginx.conf.c7.j2 dest=/etc/nginx.conf owner=root group=root
  when: ansible_distribution_major_version == "7"
- name: install conf file to centos6
  template: src=/etc/nginx.conf.c6.j2 dest=/etc/nginx.conf owner=root group=root
  when: ansible_distribution_major_version == "6"

(二)循環(huán):迭代权旷,需要重復(fù)執(zhí)行的任務(wù)

  • 對迭代項(xiàng)的引用替蛉,固定變量名為"item"

  • 而后,要在task中使用with_items給定要迭代的元素列表

  • 列表方法:字符串拄氯,字典

// 字符串列表方法                                  
- name: install some packages
  yum: name={{ item }} state=present
  with_items:
  - nginx
  - memcached
  - php-fpm
              
- name: add some groups
  group: name={{ item }} state=present
  with_items:
  - group11
  - group12
  - group13

// 字典列表方法
- name: add some users
  user: name={{ item.name }} group={{ item.group }} state=present
  with_items:
  - { name: 'user11', group: 'group11' }
  - { name: 'user12', group: 'group12' }
  - { name: 'user13', group: 'group13' }

六躲查、roles,角色

(一)角色的目錄結(jié)構(gòu)

  • 角色集合:/etc/ansible/roles/目錄下每個角色一個目錄

  • 每個角色以特定的層級目錄結(jié)構(gòu)進(jìn)行組織:

    • files/ :存放由copy或script模塊等調(diào)用的文件
    • templates/:template模塊查找所需要模板文件的目錄
    • tasks/:至少應(yīng)該包含一個名為main.yml的文件译柏;其它的文件需要在此文件中通過include進(jìn)行包含
    • handlers/:至少應(yīng)該包含一個名為main.yml的文件镣煮;其它的文件需要在此文件中通過include進(jìn)行包含
    • vars/:至少應(yīng)該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進(jìn)行包含
    • meta/:至少應(yīng)該包含一個名為main.yml的文件鄙麦,定義當(dāng)前角色的特殊設(shè)定及其依賴關(guān)系典唇;其它的文件需要在此文件中通過include進(jìn)行包含
    • default/:設(shè)定默認(rèn)變量時使用此目錄中的main.yml文件

(二)playbook中角色的調(diào)用

  • 調(diào)用角色的語法:
- hosts: websrvs
  remote_user: root
  roles:
  - mysql
  - nginx
  • 調(diào)用角色同時傳遞變量給角色
- hosts: 
  remote_user: root
  roles:
  - { role: nginx, username: nginx }
  • 基于條件測試實(shí)現(xiàn)角色調(diào)用
- hosts: 
  remote_user: root
  roles:
  - { role: nginx, when: "ansible_distribution_major_version == '7' " }

(三)實(shí)驗(yàn)4:

  • 步驟1:建立目錄結(jié)構(gòu)
mkdir /etc/ansible/roles/nginx/{tasks,handlers,vars,files,templates} -pv
cd /etc/ansible/roles
  • 步驟2:編輯task目錄镊折,定義需要執(zhí)行的任務(wù)
vim nginx/tasks/main.yml
- name: install nginx package          // 安裝nginx
  yum: name=nginx state=latest
- name: install conf file              // 復(fù)制配置模板文件
  template: src=web.conf.j2 dest=/etc/nginx/conf.d/web.conf
  notify: reload nginx service         // 觸發(fā)服務(wù)重載
  tags: instconf
- name: create doc root                // 建立網(wǎng)頁文件根目錄
  file: path={{ ngx_doc_root }} state=directory
  tags: instconf
- name: start nginx service            // 啟動nginx服務(wù)
  service: name=nginx enabled=true state=started
  • 步驟3:編輯模板配置文件
vim nginx/templates/web.conf.j2
server {
        listen {{ ngx_server_port }};
        server_name {{ ngx_server_name }};
        location / {
                root {{ ngx_doc_root }};
        }
}
  • 步驟4:編輯變量配置文件
vim nginx/vars/main.yml
ngx_server_port: 80
ngx_server_name: www.hellopeiyang.com
ngx_doc_root: /app/webdata
  • 步驟5: 配置handlers配置文件
vim nginx/handlers/main.yml
- name: reload nginx service
  service: name=nginx state=reloaded
  • 步驟6: 編輯playbook
vim /root/mywebsrvs.yml
- hosts: websrvs
  remote_user: root
  roles:
  - nginx
  • 步驟7: 測試并執(zhí)行playbook
ansible-playbook -C /root/mywebsrvs.yml
ansible-playbook /root/mywebsrvs.yml
  • 測試過程1:成功執(zhí)行playbook
  • 執(zhí)行后可以看到配置文件中的信息按照定義的變量值配置
  • 在運(yùn)行playbook時指定變量值,優(yōu)先級高于配置文件介衔,同時指定只執(zhí)行標(biāo)簽instconf處的任務(wù)
    ansible-playbook -e "ngx_server_port=1008" -t instconf /root/mywebsrvs.yml
  • 執(zhí)行后可以看到配置文件中相應(yīng)的變化
  • 也可以在playbook中直接傳遞變量給角色
vim /root/mywebsrvs.yml
- hosts: websrvs
  remote_user: root
  roles:
  - { role: nginx, ngx_server_port: 8090 }   // 指定傳入的角色恨胚,變量名:變量值
ansible-playbook -t instconf /root/mywebsrvs.yml
  • 同樣,執(zhí)行后變量定義處的配置信息也發(fā)生了相應(yīng)的變化
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夜牡,一起剝皮案震驚了整個濱河市与纽,隨后出現(xiàn)的幾起案子侣签,更是在濱河造成了極大的恐慌塘装,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件影所,死亡現(xiàn)場離奇詭異蹦肴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)猴娩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門阴幌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卷中,你說我怎么就攤上這事矛双。” “怎么了蟆豫?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵议忽,是天一觀的道長。 經(jīng)常有香客問我十减,道長栈幸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任帮辟,我火速辦了婚禮速址,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘由驹。我一直安慰自己芍锚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布蔓榄。 她就那樣靜靜地躺著并炮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪润樱。 梳的紋絲不亂的頭發(fā)上渣触,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音壹若,去河邊找鬼嗅钻。 笑死皂冰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的养篓。 我是一名探鬼主播秃流,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柳弄!你這毒婦竟也來了舶胀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤碧注,失蹤者是張志新(化名)和其女友劉穎嚣伐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萍丐,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轩端,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了逝变。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片基茵。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖壳影,靈堂內(nèi)的尸體忽然破棺而出拱层,到底是詐尸還是另有隱情,我是刑警寧澤宴咧,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布根灯,位于F島的核電站,受9級特大地震影響悠汽,放射性物質(zhì)發(fā)生泄漏箱吕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一柿冲、第九天 我趴在偏房一處隱蔽的房頂上張望茬高。 院中可真熱鬧,春花似錦假抄、人聲如沸怎栽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熏瞄。三九已至,卻和暖如春谬以,著一層夾襖步出監(jiān)牢的瞬間强饮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工为黎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邮丰,地道東北人行您。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像剪廉,于是被迫代替她去往敵國和親娃循。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

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