ansible安裝配置及最佳實踐roles

ansible是什麼?

ansible是一款輕量級配置管理工具,用於遠程批量部署、安裝、配置。相似的還有puppet、saltstack,各有所長,任君自選。html

官方文檔:http://docs.ansible.com/ansible/latest/index.htmlpython

中文文檔:http://www.ansible.com.cn/index.htmlnginx

安裝ansible

Linux系統上最簡單的可使用yum安裝,但因爲ansible故不須要後臺進程,不須要root權限,不依賴其餘軟件,只要有ssh和python環境便可運行,這裏採用run from source安裝方式。git

#python版本2.5以上,低於2.5須要額外安裝模塊python-simplejson
#安裝pip yum install epel-release -y ; yum install python-pip -y
#開始安裝
python --version
    Python 2.7.5
mkdir /app && cd /app
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible/
source ./hacking/env-setup   #一般每次登陸都要執行一次來配置環境,咱們能夠將其添加到~/.bash_profile文件中,保證每次登陸都會自動執行
echo "source /app/ansible/hacking/env-setup" >> ~/.bash_profile
pip install paramiko PyYAML Jinja2 httplib2 six

//此外還能夠經過pip install ansible的方式來安裝,更加方便

 配置ssh密鑰認證

ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.10

 配置inventory文件並測試

inventory文件是ansible的客戶機清單,默認的位置是/etc/ansible/hosts,固然咱們可使用 -i 參數另行指定。github

cd /app
mkdir ansible-playbook
cd ansible-playbook/
echo "172.16.1.10" > hosts
ansible all -i /app/ansible-playbook/hosts -m ping

 最佳實踐:playbook+roles方式

"ansible all -i /app/ansible-playbook/hosts -m ping」 這種執行方式被稱爲ad-hoc模式,即命令行或交互模式,但任何配置管理工具的官方文檔都會告訴你要用編排的方式進行復雜的部署,例如saltstack裏的.sls文件,ansible裏的playbook。除此以外,ansible提供了一種目錄樹結構的編排方式,頂層目錄對應roles,裏面包含子目錄,好比defaults、files、tasks、templates等,不一樣的子目錄對應不一樣的功能,這種方式使得管理和重複調用變得極爲方便。shell

用ansible編譯安裝nginx

注意:json

1.roles下子目錄裏必需要有main.yml文件,ansible會自動查詢並執行。bash

2.roles目錄和nginx.yml放在同一級目錄中,或者在ansible.cfg中配置roles的查詢路徑。app

3.若是yml中冒號後引用jinja模板以{{開頭,則整行語句須要加上" ",防止yml認爲這是個字典。less

[root@localhost app]# tree ansible-playbook
ansible-playbook
├── nginx.yml
└── roles
    └── nginx                   #這就是在nginx.yml主文件中指定的role
        ├── defaults
        │   └── main.yml
        ├── files
        │   ├── compile.sh.j2
        │   └── nginx-1.6.3.tar.gz
        ├── handlers
        │   └── main.yml
        ├── tasks
        │   ├── install.yml
        │   └── main.yml
        └── templates
            └── nginx.conf.j2

1.defaults中存放默認的變量,能夠經過jinja模板調用
2.files中存放文件、軟件包、腳本等內容,能夠被copy、unarchive、script等模塊調用
3.handlers中存放依賴任務,能夠被notify關鍵字調用
4.tasks中存放主任務,ansible會首先進行調用
5.templates中存放模板文件,模板中可使用jinja模板調用defaults中定義的變量,被templates模塊調用

tasks 

nginx的安裝過程包括建立用戶、建立目錄、下載安裝包、下載依賴包、編譯安裝、建立軟連接、修改配置文件、測試、啓動這些環節。

[root@localhost nginx]# tree tasks/
tasks/
├── install.yml
└── main.yml

[root@localhost nginx]# less tasks/main.yml 

---
- import_tasks: install.yml

#ansible的playbook以---開頭,而後使用yml語法編寫
#tasks/main.yml中加載install.yml,include方式不久會被淘汰,這裏採用import_tasks關鍵字

[root@localhost nginx]# less tasks/install.yml 

---
- name: groupadd nginx   #建立組,存在則忽略,group模塊   - name:說明
  group:                          
    name: "{{ group }}"
    gid: 888

- name: useradd nginx   #建立用戶,存在則忽略,user模塊
  user:
    name: "{{ user }}"
    group: "{{ group }}"
    uid: 888
    createhome: no
    shell: /sbin/nologin

- name: install pcre-devel  #安裝依賴,package模塊
  package:
    name: pcre-devel
    state: latest

- name: install openssl-devel  #安裝依賴,package模塊
  package:
    name: openssl-devel
    state: latest

- name: create /tools    #建立目錄,file模塊
  file: 
    path: /tools
    state: directory  

- name: copy and extract nginx tarball  #解壓壓縮包,unarchive模塊
  unarchive: 
    src: "{{ tarball_name }}"
    dest: /tools

- name: ./configure         #檢查環境,command模塊
  command: ./configure --user={{ user }} --group={{ group }} --prefix=/app/{{ nginx_dir }} --with-http_stub_s
tatus_module --with-http_ssl_module
  args:
    chdir: /tools/{{ nginx_dir }}

- name: make    #編譯,command模塊
  command: make
  args:
    chdir: /tools/{{ nginx_dir }}

- name: make install    #安裝,command模塊
  command: make install
  args:
    chdir: /tools/{{ nginx_dir }}

- name: modify nginx configuration   #修改配置文件,template模塊
  template:
    src: "{{ nginx_configuration }}"
    dest: /app/{{ nginx_dir }}/conf/nginx.conf

- name: make link     #建立軟鏈接,file模塊
  file:
    src: /app/{{ nginx_dir }}
    dest: /app/nginx
    state: link

- name: test nginx   #測試nginx配置,command模塊
  command: /app/nginx/sbin/nginx -t
  notify:              #調用handlers目錄下的main.yml
    - start nginx

 handlers

[root@localhost nginx]# tree handlers/
handlers/
└── main.yml

[root@localhost nginx]# less handlers/main.yml 

---
- name: start nginx     #notify下面指定的內容在name這裏定義
  command: /app/nginx/sbin/nginx

#這裏只是演示,實際批量部署不須要nginx -t 這一步

 files

[root@localhost nginx]# tree files/
files/
└── nginx-1.6.3.tar.gz

#ansible中unarchive、copy等模塊會自動來這裏找文件,從而咱們沒必要寫絕對路徑,只需寫文件名

 templates

[root@localhost nginx]# tree templates/
templates/
└── nginx.conf.j2

#通常來講,模板文件中都會使用jinja2模板,因此一般咱們在模板文件後加上.j2後綴,但不是必須的

[root@localhost nginx]# less templates/nginx.conf.j2 

    server {
        listen       {{ nginx_port }};    #這裏使用jinja模板引用變量
        server_name  localhost;


#template模塊會將模板文件中的變量替換爲實際值,而後覆蓋到客戶機指定路徑上

 defaults

[root@localhost nginx]# tree defaults
defaults
└── main.yml

[root@localhost nginx]# less defaults/main.yml 

user: nginx
group: nginx
tarball_name: nginx-1.6.3.tar.gz
nginx_configuration: nginx.conf.j2
nginx_dir: nginx-1.6.3
nginx_port: 2223             #這是咱們剛纔在模板文件中使用的變量

#defaults中的變量優先級最低,一般咱們能夠臨時指定變量來進行覆蓋

 執行playbook

到了激動人心的時刻,ansible的好處在於什麼都不用配,直接就能用,因此這裏咱們將inventory、nginx.yml、roles目錄放在同一級目錄ansible-playbook下,便於管理

#首先看看nginx.yml主文件

[root@localhost ansible-playbook]# less nginx.yml 

---
- name: deploy nginx
  hosts: all
  remote_user: root
  roles:
    - nginx


#hosts表示選擇哪些主機進行部署
#remote_user表示選擇哪一個用戶進行部署
#roles表示選擇部署什麼內容

#固然,這裏還能夠經過字典的方式指定不一樣的變量
---
- name: deploy nginx
  hosts: all
  remote_user: root
  roles:
    - { role: nginx, nginx_port: 8080 }

咱們進入ansible-playbook目錄下,執行 ansible-playbook -i hosts nginx.yml 便可開始部署

[root@localhost ansible-playbook]# ansible-playbook -i hosts nginx.yml 

TASK [Gathering Facts]   **************************************************************************************
ok: [172.16.1.10]

TASK [nginx : groupadd nginx]  *******************************************************************************
ok: [172.16.1.10]

TASK [nginx : useradd nginx] ********************************************************************************
ok: [172.16.1.10]

。。。。。

# TASK[]裏的內容就是定義在首行name中的提示內容
# -i 表示自行指定inventory文件

 總結

到這裏,ansible的基本用法就展現完畢了,能夠看出ansible自己很簡單,重點在於對模塊的掌握狀況,建議要常常練習,常常去官方文檔的Module Index部分查看各模塊的用法。

相關文章
相關標籤/搜索