自動化運維ansible、playbook

 

任務列表:
24.15 ansible介紹
24.16 ansible安裝
24.17 ansible遠程執行命令
24.18 ansible拷貝文件或目錄
24.19 ansible遠程執行腳本
24.20 ansible管理任務計劃
24.21 ansible安裝包和管理服務
24.22 使用ansible playbook
24.23 playbook裏的變量
24.24 playbook裏的循環
24.25 playbook裏的條件判斷
24.26 playbook中的handlers
24.27/24.28 playbook安裝nginx
24.29/24.30  playbook管理配置文件html

https://www.cnblogs.com/amosli/p/6122908.htmlpython


如下是幾個示例,幫助你鞏固playbook的用法
示例: https://blog.51cto.com/215687833/1888534
示例:https://www.cnblogs.com/xuyingzhong/p/8466976.html
示例:http://www.yfshare.vip/2017/03/16/Ansible-Playbooks%E4%B9%8B%E5%AE%89%E8%A3%85Mysql/linux

 

1、Ansible介紹nginx

不須要安裝客戶端,經過sshd去通訊,經過祕鑰認證
基於模塊工做,模塊能夠由任何語言開發
不只支持命令行使用模塊,也支持編寫yaml格式的playbook,易於編寫和閱讀
安裝十分簡單,centos上可直接yum安裝
有提供UI(瀏覽器圖形化)www.ansible.com/tower,收費的
官方文檔 http://docs.ansible.com/ansible/latest/index.html
ansible已經被redhat公司收購,它在github上是一個很是受歡迎的開源軟件,github地址https://github.com/ansible/ansible
一本不錯的入門電子書 https://ansible-book.gitbooks.io/ansible-first-book/

Ansible文檔的使用
ansible-doc -l   列出全部的模塊
ansible-doc cron  查看指定模塊的文檔
git

2、Ansible安裝github

準備兩臺機器,前面咱們作實驗的兩臺機器001,002
001上安裝ansiblesql

yum list |grep ansible 能夠看到自帶源裏就有2.8版本的ansible

yum install -y ansible ansible-doc

001上生成密鑰對:shell

ssh-keygen -t rsa  -t rsa生成rsa類型
若是 ls /root/.ssh/目錄下存在id_rsa和id_rsa.pub就不用生成了

把公鑰複製到002上vim .ssh/authorized_keys 此文件中,設置密鑰認證vim

127.0.0.1也要作認證,把公鑰複製到001上vim .ssh/authorized_keys 此文件中centos


vim /etc/ansible/hosts //配置主機組,增長內容以下

[testhost]
127.0.0.1
192.168.183.33  #002的地址

說明: testhost爲主機組名字,自定義的。 下面兩個ip爲組內的機器ip。

3、Ansible遠程執行命令

ansible testhost -m command -a 'w'

這樣就能夠批量執行命令了。這裏的testhost 爲主機組名,在這裏/etc/ansible/hosts定義的,-m後邊是模塊名字,-a後面是命令。固然咱們也能夠直接寫一個ip,針對某一臺機器來執行命令。

指定一臺機器:

ansible 127.0.0.1 -m  command -a 'hostname'      指定一臺機器

若是報錯:

錯誤: "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"
解決: yum install -y libselinux-python   安裝此模塊

還有一個模塊就是shell一樣也能夠實現 ,遠程執行shell腳本使用

ansible testhost -m shell -a 'w'

ansible 192.168.183.33 -m shell -a 'w'

添加目標節點的SSH認證信息

ssh-copy-id root@目標節點IP

這裏root是在目標節點上登陸的用戶,@符號後面接目標節點IP便可,以後會提示輸入目標節點root用戶密碼,輸入便可。
添加認證信息後,目標節點主機的~/.ssh/目錄下將會出現一個authorized_keys文件,裏面包含了ansible管理節點的公鑰信息,能夠檢查一下是否存在。

4、Ansible拷貝文件或者目錄

針對目錄操做:

ansible 192.168.183.33 -m copy -a "src=/etc/ansible  dest=/tmp/ansibletest owner=root group=root mode=0755"
owner屬主,group屬組,mode權限


注意:源目錄會放到目標目錄下面去,若是目標指定的目錄不存在,它會自動建立。若是拷貝的是文件,dest指定的名字和源若是不一樣,而且它不是已經存在的目錄,至關於拷貝過去後又重命名。但相反,若是desc是目標機器上已經存在的目錄,則會直接把文件拷貝到該目錄下面。

針對文件操做:

ansible 192.168.183.33 -m copy -a "src=/etc/passwd dest=/tmp"    放到tmp目錄下,名字不變
ansible 192.168.183.33 -m copy -a "src=/etc/passwd dest=/tmp/ansibletest/p.txt"    放到/tmp/ansibletest目錄下名字叫p.txt,內容與passwd一致

這裏的/tmp/123和源機器上的/etc/passwd是一致的,但若是目標機器上已經有/tmp/ansibletest目錄,則會再/tmp/ansibletest目錄下面創建passwd文件

5、Ansible遠程執行腳本

首先建立一個shell腳本
vim  /tmp/test.sh  //加入內容

#!/bin/bash
echo `date` > /tmp/ansible_test.txt  #把系統時間寫入到該文件

而後把該腳本分發到各個機器上

ansible testhost -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh mode=0755"

最後是批量執行該shell腳本,腳本須要由執行權限

ansible testhost -m shell -a "/tmp/test.sh"

shell模塊,還支持遠程執行命令而且帶管道,command不支持管道符
ansible testhost -m shell -a "cat /etc/passwd|wc -l"

6、Ansible管理任務計劃

ansible testhost -m cron -a "name='test cron' job='/bin/touch /tmp/1212.txt'  weekday=6"

name指定任務計劃的名字,job指定執行命令,最後是分時日月

其餘的時間表示:分鐘 minute 小時 hour 日期 day 月份 month
 

在002上會有name爲test cron的標記

若要刪除該cron 只須要加一個字段 state=absent 

ansible testhost -m cron -a "name='test cron' state=absent"

7、Ansible安裝rpm包和管理服務

ansible 192.168.183.33 -m yum -a "name=httpd state=removed"    卸載

在name後面還能夠加上state=installed/removed  安裝或移除

ansible 192.168.183.33 -m yum -a "name=httpd"     安裝

第一次卸載後和第二次安裝後

ansible 192.168.183.33 -m service -a "name=httpd state=started enabled=no"  啓動服務,並開機不啓動

這裏的name是centos系統裏的服務名,能夠經過chkconfig --list查到

002上的服務啓動,而且開機啓動項也沒有httpd

8、使用ansible playbook

至關於把模塊和全部的配置文件寫入到配置文件裏面,例:

vim /etc/ansible/test.yml //加入以下內容,注意格式
---
- hosts: 192.168.183.33 或主機名
  remote_user: root
  tasks:
    - name: test_playbook
      shell: touch /tmp/tobe.txt        shell模塊

執行:ansible-playbook test.yml

 說明: 第一行須要有三個槓,hosts參數指定了對哪些主機進行參做,若是是多臺機器能夠用逗號做爲分隔,也可使用主機組,在/etc/ansible/hosts裏定義;
 user參數指定了使用什麼用戶登陸遠程主機操做;
 tasks指定了一個任務,其下面的name參數一樣是對任務的描述,在執行過程當中會打印出來,shell是ansible模塊名字

9、playbook裏的變量

再來一個建立用戶的例子:

vim /etc/ansible/create_user.yml //加入以下內容
---
- name: create_user1
  hosts: 192.168.183.33
  user: root
  gather_facts: false
  vars:
    - user: "test"
  tasks:
    - name: create user
      user: name="{{ user }}"
      
執行:    ansible-playbook create_user.yml

說明:name參數對該playbook實現的功能作一個概述,後面執行過程當中,會打印 name變量的值 ,能夠省略;gather_facts參數指定了在如下任務部分執行前,是否先執行setup模塊獲取主機相關信息,這在後面的task會使用到setup獲取的信息時用到;vars參數,指定了變量,這裏指定一個user變量,其值爲test ,須要注意的是,變量值必定要用引號引住;user指定了調用user模塊,name是user模塊裏的一個參數,而增長的用戶名字調用了上面user變量的值。

此時Gathering Facts沒有收集,由於 gather_facts: false

10、Ansible playbook中的循環

 vim /etc/ansible/while.yml //加入以下內容

---
- hosts: 192.168.183.33
  user: root
  tasks:
    - name: change mode for files
      file: path=/tmp/{{ item }} state=touch mode=600        #變量
      with_items:                #循環
        - 1.txt    
        - 2.txt
        - 3.txt

執行 ansible-playbook while.yml

說明: 

把/tmp/目錄下的1.txt,2.txt,3.txt的權限改成600,state=touch若是文件不存在,會建立該文件
item能夠理解成變量,即1.txt,2.txt,3.txt
with_items爲循環的對象
file模塊:針對路徑

11、Ansible playbook中的條件判斷

 vim /etc/ansible/when.yml //加入以下內容

---
- hosts: testhost  指定全部機器
  user: root
  gather_facts: True  收集信息,默認收集,此處須要收集
  tasks:
    - name: use when
      shell: touch /tmp/when.txt
      when: ansible_ens33.ipv4.address == "192.168.183.33"  表示ansible_ens33的下一級ipv4的下一級address地址爲192.168.183.33時,分級顯示的,下兩圖所示
      
 說明:ansible 192.168.183.33 -m setup 能夠查看到全部的facter收集到的信息,即分級的數據
 
執行   ansible-playbook when.yml

skipping: [127.0.0.1] 表示條件不成立

12、playbook中的handlers

 執行task以後,服務器發生變化以後要執行的一些操做,好比咱們修改了配置文件後,須要重啓一下服務 


vim /etc/ansible/handlers.yml        //加入以下內容

---
- name: handlers test
  hosts: 192.168.183.33
  user: root
  tasks:
    - name: copy file
      copy: src=/etc/passwd dest=/tmp/aaab.txt 此命令執行成功後,在執行下面的notify
      notify: test handlers        對應下面handlers,能夠定義多個
  handlers:            前面的命令執行成功後,纔會執行這條命令
    - name: test handlers
      shell: echo "111111" >> /tmp/aaab.txt

執行:    ansible-playbook handlers.yml

 說明,只有copy模塊真正執行後,纔會去調用下面的handlers相關的操做。也就是說若是1.txt和2.txt內容是同樣的,並不會去執行handlers裏面的shell相關命令。 這種比較適合配置文件發生更改後,重啓服務的操做。

十3、playbook安裝nginx

思路:先在一臺機器上編譯安裝好nginx、打包,而後再用ansible去下發

cd /etc/ansible   進入ansible配置文件目錄
mkdir  nginx_install   建立一個nginx_install的目錄,方便管理
cd nginx_install
mkdir -p roles/{common,install}/{handlers,files,meta,tasks,templates,vars}

把已經存在的編譯好nginx搞過去

說明:roles目錄下有兩個角色,common爲一些準備操做,install爲安裝nginx的操做。每一個角色下面又有幾個目錄,handlers下面是當發生改變時要執行的操做,一般用在配置文件發生改變,重啓服務。files爲安裝時用到的一些文件,meta爲說明信息,說明角色依賴等信息,tasks裏面是核心的配置文件,templates一般存一些配置文件,啓動腳本等模板文件,vars下爲定義的變量,能夠自動到目錄查找

nginx的安裝路徑、啓動腳本路徑、配置文件路徑

須要事先準備好安裝用到的文件,具體以下:
在一臺機器上事先編譯安裝好nginx,配置好啓動腳本,配置好配置文件

打包:    tar czvf nginx.tar.gz --exclude "nginx.conf" --exclude "vhost" nginx/        --exclude 過濾掉nginx.conf,vhost

安裝好nginx,或有以前的包,咱們須要把nginx目錄打包,並放到/etc/ansible/nginx_install/roles/install/files/下面,名字爲nginx.tar.gz

mv nginx.tar.gz /etc/ansible/nginx_install/roles/install/files/

啓動腳本、配置文件都要放到/etc/ansible/nginx_install/roles/install/templates下面

cp nginx/conf/nginx.conf /etc/ansible/nginx_install/roles/install/templates/

cp /etc/init.d/nginx /etc/ansible/nginx_install/roles/install/templates/

cd  /etc/ansible/nginx_install/roles/common/tasks

定義common的tasks,nginx是須要一些依賴包的

vim  /tasks/main.yml //內容以下

- name: Install initializtion require software
  yum: name={{ item }} state=installed
  with_items:
    - zlib-devel
    - pcre-devel

定義變量

vim /etc/ansible/nginx_install/roles/install/vars/main.yml //主配置文件,內容以下

nginx_user: www
nginx_port: 80
nginx_basedir: /usr/local/nginx

首先要把全部用到的文檔拷貝到目標機器
vim /etc/ansible/nginx_install/roles/install/tasks/copy.yml //子配置文件,內容以下

- name: Copy Nginx Software
  copy: src=nginx.tar.gz dest=/tmp/nginx.tar.gz owner=root group=root
- name: Uncompression Nginx Software
  shell: tar zxf /tmp/nginx.tar.gz -C /usr/local/
- name: Copy Nginx Start Script
  template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755
- name: Copy Nginx Config
  template: src=nginx.conf dest={{ nginx_basedir }}/conf/ owner=root group=root mode=0644

接下來會創建用戶,啓動服務,刪除壓縮包

vim /etc/ansible/nginx_install/roles/install/tasks/install.yml     //內容以下

- name: Create Nginx User
  user: name={{ nginx_user }} state=present createhome=no shell=/sbin/nologin           nginx_user是vars目錄中的main.yml定義的 , createhome是否建立用戶家目錄
- name: Start Nginx Service
  shell: /etc/init.d/nginx start
- name: Add Boot Start Nginx Service        添加到開機啓動
  shell: chkconfig --level 345 nginx on
- name: Delete Nginx compression files        刪除文件
  shell: rm -rf /tmp/nginx.tar.gz

再到tasks目錄下建立總的main.yml而且把copy和install調用


vim /etc/ansible/nginx_install/roles/install/tasks/main.yml //內容以下

- include: copy.yml
- include: install.yml

到此兩個roles:common和install就定義完成了,接下來要定義一個入口配置文件

vim /etc/ansible/nginx_install/install.yml  //總入口文件,內容以下

---
- hosts: 192.168.183.33
  remote_user: root
  gather_facts: True
  roles:
    - common
    - install

執行: ansible-playbook /etc/ansible/nginx_install/install.yml           執行前須要把系統自帶的nginx卸載掉:    yum remove nginx   卸載掉自帶的Nginx

啓動nginx服務失敗,根據提示到002機器上查看

systemctl status nginx   經排查httpd佔用80端口致使

systemctl stop httpd.service   停掉httpd

再次執行ansible-playbook /etc/ansible/nginx_install/install.yml

此時執行成功

002上查看,此時服務已經啓動

總結:

roles即對應的角色,即子目錄,子的playbook腳本,roles對應目錄common和install
到common目錄中找tasks目錄下的main.yml,安裝擴展包
common/tasks/main.yml執行完成後執行install
install/tasks/main.yml,調用同一個目錄下的copy.yml和install.yml

十4、playbook管理配置文件

 生產環境中大多時候是須要管理配置文件的,安裝軟件包只是在初始化環境的時候用一下。下面咱們來寫個管理nginx配置文件的playbook

mkdir -p /etc/ansible/nginx_config/roles/{new,old}/{files,handlers,vars,tasks}  建立目錄

其中new爲更新時用到的,old爲回滾時用到的,files下面爲nginx.conf和vhosts目錄,handlers爲重啓nginx服務的命令
關於回滾,須要在執行playbook以前先備份一下舊的配置,因此對於老配置文件的管理必定要嚴格,千萬不能隨便去修改線上機器的配置,而且要保證new/files下面的配置和線上的配置一致。
 先把nginx.conf和vhosts目錄放到files目錄下面:

cd /usr/local/nginx/conf/
 cp -r nginx.conf vhost  /etc/ansible/nginx_config/roles/new/files/  把nginx.conf和vhost拷貝到roles/new/files目錄中

定義變量:

vim /etc/ansible/nginx_config/roles/new/vars/main.yml   內容以下:

nginx_basedir: /usr/local/nginx

vim /etc/ansible/nginx_config/roles/new/handlers/main.yml      //定義從新加載nginx服務

- name: restart nginx
  shell: /etc/init.d/nginx reload     從新加載配置文件

vim /etc/ansible/nginx_config/roles/new/tasks/main.yml     //這是核心的任務

- name: copy conf file
  copy: src={{ item.src }} dest={{ nginx_basedir }}/{{ item.dest }} backup=yes owner=root group=root mode=0644    
  with_items:
    - { src: nginx.conf, dest: conf/nginx.conf }  循環對象中有兩個子對象用逗號作分隔符
    - { src: vhost, dest: conf/ }
  notify: restart nginx

vim /etc/ansible/nginx_config/update.yml // 最後是定義總入口配置

---
- hosts: 192.168.183.33
  user: root
  roles:
  - new

 執行: ansible-playbook /etc/ansible/nginx_config/update.yml

針對001上的nginx.conf文件作修改,而後在執行ansible-playbook /etc/ansible/nginx_config/update.yml

回到002上查看,002上的nginx.conf配置文件也更改了

 而回滾的backup.yml對應的roles爲old,把new下的全部文件拷貝到old下

rsync -av /etc/ansible/nginx_config/roles/new/ /etc/ansible/nginx_config/roles/old/

 回滾操做就是把舊的配置覆蓋,而後從新加載nginx服務, 每次改動nginx配置文件以前先備份到old裏,對應目錄爲/etc/ansible/nginx_config/roles/old/files 


 vim /etc/ansible/nginx_config/rollback.yml // 最後是定義總入口配置

---
- hosts: 192.168.183.33
  user: root
  roles:
  - old 
執行:  ansible-playbook /etc/ansible/nginx_config/rollback.yml

在002機器上修改nginx.conf文件,執行ansible-playbook /etc/ansible/nginx_config/rollback.yml完成後,002上的配置文件會把001機器上roles/old/files目錄下的備份文件恢復

相關文章
相關標籤/搜索