ansible學習(二)
什麽是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學習(二)