Ansible介紹

Ansible介紹

• 不須要安裝客戶端,經過sshd去通訊html

• 基於模塊工做,模塊能夠由任何語言開發python

• 不只支持命令行使用模塊,也支持編寫yaml格式的playbook,易於編寫和閱讀linux

• 安裝十分簡單,centos上可直接yum安裝nginx

• 有提供UI(瀏覽器圖形化)www.ansible.com/tower,收費的git

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

• ansible已經被redhat公司收購,它在github上是一個很是受歡迎的開源軟件,github地址https://github.com/ansible/ansibleshell

• 一本不錯的入門電子書 https://ansible-book.gitbooks.io/ansiblevim

 

Ansible安裝

• 準備兩臺機器,前面咱們作實驗的兩臺機器aming-01,aming-02centos

• 只須要在aming-01上安裝ansible瀏覽器

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

• yum install -y ansible

• aming-01上生成密鑰對 ssh-keygen -t rsa

• 把公鑰放到aming-02上,設置密鑰認證

• vi /etc/ansible/hosts //增長

•[testhost]

•127.0.0.1

•192.168.133.132

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

實例:

[root@localhost ~]#
[root@localhost ~]#
[root@localhost  ~]#
[root@localhost ~]#
[root@localhost  ~]#
[root@localhost  ~]#
[root@localhost  ~]#
[root@localhost  ~]#
[root@localhost  ~]#

 

Ansible遠程執行命令

• ansible  testhost -m command -a 'w' 

• 這樣就能夠批量執行命令了。這裏的testhost 爲主機組名,-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一樣也能夠實現

• ansible  testhost -m shell -a 'w'

 

實例:

[root@localhost ~]#
[root@localhost  ~]#
[root@localhost  ~]#
[root@localhost  ~]#
[root@localhost  ~]#
[root@localhost ~]#
[root@localhost  ~]#
[root@localhost  ~]#
[root@localhost  ~]#

Ansible拷貝文件或者目錄

• ansible aming-02 -m copy -a "src=/etc/ansible  dest=/tmp/ansibletest owner=root group=root mode=0755"

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

• ansible testhost -m copy -a "src=/etc/passwd dest=/tmp/123"

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

 

實例:

[root@localhost  ~]#
[root@localhost  ~]#
[root@localhost  ~]#
[root@localroot ~]#
[root@localhost  ~]#
[root@localhost  ~]#
[root@localhost  ~]#
[root@localhost  ~]#
[root@localhost  ~]#

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模塊,還支持遠程執行命令而且帶管道

• ansible testhost -m shell -a "cat /etc/passwd|wc -l "

 

實例:

[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#

 

Ansible管理任務計劃

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

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

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

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

實例:

[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#

Ansible安裝rpm包/管理服務

• ansible testhost -m yum -a "name=httpd"

• 在name後面還能夠加上state=installed/removed

• ansible testhost -m service -a "name=httpd state=started enabled=yes"

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

• Ansible文檔的使用

• ansible-doc -l   列出全部的模塊

• ansible-doc cron  查看指定模塊的文檔

實例:

[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#

 

Ansible playbook的使用

• 至關於把模塊寫入到配置文件裏面,例:

• vi  /etc/ansible/test.yml //加入以下內容

•---

•- hosts: aming-02

•  remote_user: root

•  tasks:

•    - name: test_playbook

•      shell: touch /tmp/lishiming.txt

• 說明: 第一行須要有三個槓,hosts參數指定了對哪些主機進行參做,若是是多臺機器能夠用逗號做爲分隔,也可使用主機組,在/etc/ansible/hosts裏定義;

• user參數指定了使用什麼用戶登陸遠程主機操做;

• tasks指定了一個任務,其下面的name參數一樣是對任務的描述,在執行過程當中會打印出來,shell是ansible模塊名字

• 執行:ansible-playbook test.yml

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

• vi /etc/ansible/create_user.yml //加入以下內容

•---

•- name: create_user

•  hosts: aming-02

•  user: root

•  gather_facts: false

•  vars:

•    - user: "test"

•  tasks:

•    - name: create user

•      user: name="{{ user }}"

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

實例:

[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#

 

Ansible playbook中的循環

 

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

•---

•- hosts: testhost

•  user: root

•  tasks:

•    - name: change mode for files

•      file: path=/tmp/{{ item }} mode=600

•      with_items:

•        - 1.txt

•        - 2.txt

•        - 3.txt

• 說明: with_items爲循環的對象

• 執行 ansible-playbook while.yml

 

實例:

[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#

Ansible playbook中的條件判斷

• vi /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 == "172.7.15.114「

• 說明:ansible aming-02 -m setup 能夠查看到全部的facter信息

實例:

[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#

 

Ansible playbook中的handlers

• 執行task以後,服務器發生變化以後要執行的一些操做,好比咱們修改了配置文件後,須要重啓一下服務 vi /etc/ansible/handlers.yml//加入以下內容

•---

•- name: handlers test

•  hosts: aming-02

•  user: root

•  tasks:

•    - name: copy file

•      copy: src=/etc/passwd dest=/tmp/aaa.txt

•      notify: test handlers

•  handlers:

•    - name: test handlers

•      shell: echo "111111" >> /tmp/aaa.txt

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

實例:

[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#

 

playbook實戰-nginx安裝1

• 思路:先在一臺機器上編譯安裝好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}

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

實例:

[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#

 

 

playbook實戰-nginx安裝2

• 須要事先準備好安裝用到的文件,具體以下:

• 在一臺機器上事先編譯安裝好nginx,配置好啓動腳本,配置好配置文件

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

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

• cd  /etc/ansible/nginx_install/roles

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

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

•- name: Install initializtion require software

•  yum: name={{ item }} state=installed

•  with_items:

•    - zlib-devel

•    - pcre-devel

實例:

[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#

 

playbook實戰-nginx安裝3

•定義變量

•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

實例:

[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#

 

playbook實戰-nginx安裝4

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

•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

•- 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

實例:

[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#

 

playbook實戰-nginx安裝5

•再建立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: testhost

•  remote_user: root

•  gather_facts: True

•  roles:

•    - common

•    - install

•執行: ansible-playbook /etc/ansible/nginx_install/install.yml

實例:

[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#

 

管理配置文件

• 生產環境中大多時候是須要管理配置文件的,安裝軟件包只是在初始化環境的時候用一下。下面咱們來寫個管理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/

• 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: vhosts, dest: conf/ }

•  notify: restart nginx

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

•---

•- hosts: testhost

•  user: root

•  roles:

•  - new

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

• 而回滾的backup.yml對應的roles爲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: testhost

•  user: root

•  roles:

•  - old

實例:

[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#

 

 

常見問題:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-first-book/

相關文章
相關標籤/搜索