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連接到各個主機的,但是它還支持其他的連接方法,所以需要有連接插件,尤其是要完成併發連接
3、ansible特性
模塊化設計,調用特定的模塊來完成特定任務,本身是核心組件,短小精悍; 基於Python語言實現,由Paramiko(python的一個可併發連接ssh主機功能庫), PyYAML和Jinja2(模板化)三個關鍵模塊實現; 不需要在被管理節點上安裝客戶端,只要有sshd即可,部署非常簡單 支持自定義模塊,使用任意編程語言; 強大的playbook機制; 冪等性;
ansible的安裝和使用
ansible無服務器端,使用時直接運行命令即可,同時不需要在被管控主機上安裝任何客戶端,因此ansible是一個十分輕量級的工具,可以在epel源進行安裝,ansible已經被紅帽收購,相信不久會被收入base源配置好epel源後直接yum安裝ansible
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模塊參數
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
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
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
注意:多個任務可以使用同一個tags,也可以一次任務指多個tags,執行命令時多個tags用,號隔開;如下圖 [root@localhost ~]# ansible-playbook -t instconf,instpkg web.yaml
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 注意:命令行變量的優先於劇本中定義的值
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