Ansible入門之Playbook

上一篇咱們介紹了經常使用的ansilbe模塊,若是熟練掌握了這些模塊,你覺得這就精通了ansible,那就大錯特錯了,anislbe的精華還沒開始呢,固然熟練掌握模塊是基礎,接下來咱們就要學習playbook,什麼是playbook呢,能夠說以前咱們學習的那些模塊都是ansible系統的基礎組件,而playbook經過靈活的組裝這些組件,能夠實現更爲複雜的業務操做場景,因此呢,playbook就是ansilble的另外一種運行模式,除了直接命令行調模塊,真正在線上展現威力的還得依靠playbook,那麼這篇咱們就來經過例子來介紹如何使用,開始前咱們先假設一個場景:php

最近不知道領導的腦殼裏那兩個腦觸忽然碰到了一塊兒,忽然今天跟部門開會說,咱們部門要搭建一個技術博客,把我們的技術都沉澱下來,環境呢我看也別太複雜,就選擇wordpress就行,哪一個同事給搭建下,這時你發現你們的目光都彙集到了你這裏,別想了,就是你了,全桌就你一個幹運維的,這活鐵定你幹,接下來開始準備服務器(也可能就是臺式機什麼的),服務器安裝好系統後,你ssh進入系統(固然若是你裝了windows,這篇文章到這你就不用看了,省下的時間重裝完系統再回來看也不遲,反正我也不會刪),開始下載所需的軟件nginx,mysql,workdress,php-fpm,而後開始編譯安裝,過程不在贅述,通過幾個小時,你終於搞定了,領導來審查,拍着你肩膀說,小四五呀,作的不錯,這麼快就搞定了,就在你心底一樂,腰板剛要挺直,感受本身光芒萬射的時候,領導忽然說,我們客戶那邊還有2000臺機器要安裝wordpress環境,你去幫你一塊兒安裝下吧,小夥子能幹,明天下班前能夠把? 這時你的cpu粗算了下,搭一個環境預計二小時,2000臺就是4000個小時,4000個小時就是166天,臥槽,半年過去了,還沒算本身吃飯睡覺,XX的時間,這時你弱弱的跟領導說,2年行不? 領導沉穩的反問了你一句:你小子打算去財務交工牌麼?。故事到此結束,這個故事只是瞭解下背景,固然寫的有點誇張,因此喜歡較勁的朋友在後臺留言的時候千萬別問我,」爲何不寫腳本完成這個需求?「,那樣的話我只能默默的關閉你的留言了,順便問一句,咱還能好好一塊兒坐友誼的小船麼?python

背景有點長了,咱們進入技術階段,那咱們用ansible如何完成上面的需求呢,咱們就來看如何組裝咱們的模塊吧,由於ansible用的是yaml語言,若是有不瞭解的本身補補,在這就很少說了,在開始前咱們先來了解幾個概念:mysql

var:ansible裏變量的概念是重用某些定義值,主要是模板會用到。linux

tasks:任務就是按配置文件的定義的去執行的操做。nginx

handlers:當被操做的主機配置發生改變時要進行的操做,這裏須要通知它,而後handlers定義的動做會被執行。sql

瞭解了這三個,咱們再瞭解一個概念role,role在ansible能夠將任務等模塊化了,使他們複用性更強,概念介紹到這裏,若是以上沒徹底理解也不要緊,咱們一會看實際的例子就明白了,瞭解了以上概念,就能夠給出出總體的配置文件目錄結構了,這樣你們先有一個大體的框架,接下來咱們咱們再一一講解。flask

|-- group_varswindows

|   `-- allapi

|-- hosts服務器

|-- LICENSE.md

|-- README.md

|-- roles

|   |-- common

|   |   |-- files

|   |   |   |-- epel.repo

|   |   |   |-- iptables-save

|   |   |   `-- RPM-GPG-KEY-EPEL-6

|   |   |-- handlers

|   |   |   `-- main.yml

|   |   `-- tasks

|   |       `-- main.yml

|   |-- mysql

|   |   |-- handlers

|   |   |   `-- main.yml

|   |   |-- tasks

|   |   |   `-- main.yml

|   |   `-- templates

|   |       `-- my.cnf.j2

|   |-- nginx

|   |   |-- handlers

|   |   |   `-- main.yml

|   |   |-- tasks

|   |   |   `-- main.yml

|   |   `-- templates

|   |       `-- default.conf

|   |-- php-fpm

|   |   |-- handlers

|   |   |   `-- main.yml

|   |   |-- tasks

|   |   |   `-- main.yml

|   |   `-- templates

|   |       `-- wordpress.conf

|   `-- wordpress

|       |-- tasks

|       |   `-- main.yml

|       `-- templates

|           `-- wp-config.php

`-- site.yml

以上就是總體的目錄結構,還有2個文件沒介紹,hosts是要操做的主機組或ip,site.yml是playbook的入口文件,定義了主機,角色等,內容以下:

hosts: wordpress-server

  remote_user: root

  roles:

    - common

    - mysql

    - nginx

    - php-fpm

    - wordpress


這裏看到了咱們定義的4個角色,每一個角色會對應完成本身的功能,咱們一會再說,先從頭看起。

group_vars,目錄下的all定義了全部的變量,內容以下:

wp_version: 4.2.4

wp_sha256sum: 42ca594afc709cbef8528a6096f5a1efe96dcf3164e7ce321e87d57ae015cc82

 

wp_db_name: wordpress

wp_db_user: wordpress

wp_db_password: mypassword

mysql_port: 3306

server_hostname: www.mindg.cn

auto_up_disable: false

core_update_level: true


這些定義的值都是給模板傳值用的,一會就會看到。

咱們看來每一個role的定義,common是通用的role,就是表示其餘角色均可能用到的能夠放這裏,common有點特殊,它有個file目錄,主要是存儲一些服務器須要的系統配置文件,要拷貝到目標服務器上,而後tasks,handlers就比較熟悉了,咱們先看tasks目錄,這個目錄下只有一個文件,定義了要完成的任務,內容以下:

---

- name: Install libselinux-python

  yum: name=libselinux-python state=present

 

- name: Copy the EPEL repository definition

  copy: src=epel.repo dest=/etc/yum.repos.d/epel.repo

 

- name: Create the GPG key for EPEL

  copy: src=RPM-GPG-KEY-EPEL-6 dest=/etc/pki/rpm-gpg

 

- name: Set up iptables rules

  copy: src=iptables-save dest=/etc/sysconfig/iptables

  notify: restart iptables


注意看最後一句notify,這條語句表示iptables配置文件變動後,通知restart iptables ,這個定義在而後看handler的main.yml,下:

---

- name: restart iptables

  service: name=iptables state=restarted


若是理解了common,那如下幾個模式基本都同樣了,咱們來看看mysql目錄的內容,

tasks目錄下的main.yml文件:

---

- name: Install Mysql package

  yum: name={{ item }} state=present

  with_items:

   - mysql-server

   - MySQL-python

   - libselinux-python

   - libsemanage-python

 

- name: Configure SELinux to start mysql on any port

  seboolean: name=mysql_connect_any state=true persistent=yes

  when: ansible_selinux.status == "enabled"

 

- name: Create Mysql configuration file

  template: src=my.cnf.j2 dest=/etc/my.cnf

  notify:

  - restart mysql

 

- name: Start Mysql Service

  service: name=mysqld state=started enabled=yes


handlers/main.yml:

---

- name: restart mysql

  service: name=mysqld state=restarted

templates/my.cnf.j2:

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

port={{ mysql_port }}

 

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid


這裏咱們說2個內容,一個是with_items,這是經常使用的循環方法,這個語句下的內容會依次傳入{{ item}}來替換item,第二個說下模板,my.cnf.j2裏的內凡是{{ }}的內容都在group_var/all裏作了定義,順便說下,ansible模板文件用的jinja2的模板,若是有了解flask的確定會理解,jinja2是flask框架默認的模板,想深刻了解的,本身能夠補補。

php-fpm內容,php-fpm/tasks/main.yml:

---

- name: Install php-fpm and deps 

  yum: name={{ item }} state=present

  with_items:

    - php

    - php-fpm

    - php-enchant

    - php-IDNA_Convert

    - php-mbstring

    - php-mysql

    - php-PHPMailer

    - php-process

    - php-simplepie

    - php-xml


- name: Disable default pool

  command: mv /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.disabled creates=/etc/php-fpm.d/www.disabled

  notify: restart php-fpm

 

- name: Copy php-fpm configuration

  template: src=wordpress.conf dest=/etc/php-fpm.d/

  notify: restart php-fpm

handlers/main.yml:

---

- name: restart php-fpm

  service: name=php-fpm state=restarted

templates/wordpress.conf :

[wordpress]

listen = /var/run/php-fpm/wordpress.sock

listen.owner = nginx

listen.group = nginx

listen.mode = 0660

user = wordpress

group = wordpress

pm = dynamic

pm.max_children = 10

pm.start_servers = 1

pm.min_spare_servers = 1

pm.max_spare_servers = 3

pm.max_requests = 500

chdir = /srv/wordpress/

php_admin_value[open_basedir] = /srv/wordpress/:/tmp


這部分沒特殊的,很少說了,你們看看配置文件瞭解下便可。

最後一個workpress/tasks/main.yml;

---

- name: Download WordPress

  get_url: url=http://wordpress.org/wordpress-{{ wp_version }}.tar.gz dest=/srv/wordpress-{{ wp_version }}.tar.gz

           sha256sum="{{ wp_sha256sum }}"


- name: Extract archive

  command: chdir=/srv/ /bin/tar xvf wordpress-{{ wp_version }}.tar.gz creates=/srv/wordpress


- name: Add group "wordpress"

  group: name=wordpress


- name: Add user "wordpress"

  user: name=wordpress group=wordpress home=/srv/wordpress/


- name: Fetch random salts for WordPress config

  local_action: command curl https://api.wordpress.org/secret-key/1.1/salt/

  register: "wp_salt"

  sudo: no


- name: Create WordPress database

  mysql_db: name={{ wp_db_name }} state=present


- name: Create WordPress database user

  mysql_user: name={{ wp_db_user }} password={{ wp_db_password }} priv={{ wp_db_name }}.*:ALL host='localhost' state=present


- name: Copy WordPress config file

  template: src=wp-config.php dest=/srv/wordpress/


- name: Change ownership of WordPress installation

  file: path=/srv/wordpress/ owner=wordpress group=wordpress state=directory recurse=yes


- name: Start php-fpm Service

  service: name=php-fpm state=started enabled=yes

templates/wp-config.php:


<?php

/** The name of the database for WordPress */

define('DB_NAME', '{{ wp_db_name }}');


/** MySQL database username */

define('DB_USER', '{{ wp_db_user }}');


/** MySQL database password */

define('DB_PASSWORD', '{{ wp_db_password }}');


/** MySQL hostname */

define('DB_HOST', 'localhost');


/** Database Charset to use in creating database tables. */

define('DB_CHARSET', 'utf8');


/** The Database Collate type. Don't change this if in doubt. */

define('DB_COLLATE', '');


{{ wp_salt.stdout }}


$table_prefix  = 'wp_';


define('WPLANG', '');


define('WP_DEBUG', false);


/** Disable Automatic Updates Completely */

define( 'AUTOMATIC_UPDATER_DISABLED', {{auto_up_disable}} );


/** Define AUTOMATIC Updates for Components. */

define( 'WP_AUTO_UPDATE_CORE', {{core_update_level}} );


/* That's all, stop editing! Happy blogging. */


/** Absolute path to the WordPress directory. */

if ( !defined('ABSPATH') )

        define('ABSPATH', dirname(__FILE__) . '/');


/** Sets up WordPress vars and included files. */

require_once(ABSPATH . 'wp-settings.php');


wordpress模板基本都是wordpress的配置,沒什麼特殊要講的,到這裏,篇幅已經很長了,若是有什麼沒說明白的地方能夠給我留言,最後一個問題,配置這麼一大堆,到底怎麼運行呀,運行命令是這樣地:

#ansible-playbook -i hosts site.yml

就能夠運行了,若是機器多就併發去作,ansible均可以支持,這篇文章就到這裏,這是系列2,還剩最後的開發篇,咱們下篇見。

相關文章
相關標籤/搜索