不須要安裝客戶端,經過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/html
準備兩臺機器,前面咱們作實驗的兩臺機器lvlinux-1,lvlinux-2
只須要在lvlinux-1上安裝ansible
yum list |grep ansible 能夠看到自帶源裏就有2.4版本的ansibleyum install -y ansible ansible-doc
lvlinux-1上生成密鑰對 ssh-keygen -t rsa
把公鑰放到lvinux-2上,設置密鑰認證,在本機上也配置一下。能夠再模擬一臺。本機上能夠直接執行
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
增長ansible主機組
vi /etc/ansible/hosts //增長python
[testhost] 127.0.0.1 192.168.226.130
說明: testhost爲主機組名字,自定義的。 下面兩個ip爲組內的機器ip,其中127.0.0.1指的是本機.咱們能夠定義不一樣的主機組,從而將機器分類,好比web組,db組。咱們已經作過hosts,所以第二個ip能夠換爲域名lvlinux-2linux
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一樣也能夠實現 ,shell模塊後面的命令支持管道, command不支持ansible testhost -m shell -a 'w'
ansible拷貝文件或目錄ansible lvlinux-2 -m copy -a "src=/etc/ansible dest=/tmp/ansibletest owner=root group=root mode=0755"
注意:源目錄會放到目標目錄下面去,若是目標指定的目錄不存在,它會自動建立。若是拷貝的是文件,dest指定的名字和源若是不一樣,而且它不是已經存在的目錄,至關於拷貝過去後又重命名。但相反,若是dest是目標機器上已經存在的目錄,則會直接把文件拷貝到該目錄下面。ansible testhost -m copy -a "src=/etc/passwd dest=/tmp/123"
這裏的/tmp/123和源機器上的/etc/passwd是一致的,但若是目標機器上已經有/tmp/123目錄,則會再/tmp/123目錄下面創建passwd文件nginx
首先建立一個shell腳本vim /tmp/test.sh
//加入內容git
#!/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 "
github
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 月份 monthweb
ansible testhost -m yum -a "name=httpd"
在name後面還能夠加上state=installed/removedansible testhost -m service -a "name=httpd state=started enabled=yes"
這裏的name是centos系統裏的服務名,能夠經過chkconfig --list查到。
Ansible文檔的使用ansible-doc -l
列出全部的模塊ansible-doc cron
查看指定模塊的文檔shell
至關於把模塊寫入到配置文件裏面,
舉例1:
vi /etc/ansible/test.yml //加入以下內容vim
--- - hosts: lvlinux-2 remote_user: root tasks: - name: test_playbook shell: touch /tmp/lvlinux.txt
說明: 第一行須要有三個槓,hosts參數指定了對哪些主機進行參做,若是是多臺機器能夠用逗號做爲分隔,也可使用主機組,在/etc/ansible/hosts裏定義;
user參數指定了使用什麼用戶登陸遠程主機操做;
tasks指定了一個任務,其下面的name參數一樣是對任務的描述,在執行過程當中會打印出來,shell是ansible模塊名字
執行:ansible-playbook test.yml
舉例2:
再來一個建立用戶的例子:
vi /etc/ansible/create_user.yml //加入以下內容centos
--- - name: create_user hosts: lvlinux-2 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 ,須要注意的是,變量值必定要用引號引住;task裏面的user指定了調用user模塊,name是user模塊裏的一個參數,而增長的用戶名字調用了上面user變量的值。
執行:ansible-playbook create_user.yml
id test
查看建立用戶
舉例3:
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
說明: 雙花括號裏面的item表示循環變量,with_items爲循環的對象
分別在lvinux-1和lvlinux-2上建立測試文件1.txt 2.txt 3.txt
執行 ansible-playbook while.yml
並查看文件權限
舉例4:
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 == "192.168.226.129「
說明:ansible lvlinux-2 -m setup
能夠查看到全部的facter信息.這裏判斷的條件是ens33網卡的ipv4 地址,因此寫lvlinux-1機器的ip,就會被匹配到,所以會跳過lvlinux-2機器,僅在lvlinux-1機器上建立文件。
執行 ansible-playbook when.yml
在lvlinux-1上查看when.txt文件
舉例5:
Ansible playbook中的handlers
執行task以後,服務器發生變化以後要執行的一些操做,好比咱們修改了配置文件後,須要重啓一下服務 vi /etc/ansible/handlers.yml//加入以下內容
--- - name: handlers test hosts: lvlinux-2 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相關的操做。也就是說若是copy的源文件不存在,copy沒有執行成功,就不會去執行handlers裏面的shell相關命令。 這種比較適合配置文件發生更改後,重啓服務的操做。至關於&&
舉例6:
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}
說明:roles目錄下有兩個角色,common爲一些準備操做,install爲安裝nginx的操做。每一個角色下面又有幾個目錄,handlers下面是當發生改變時要執行的操做,一般用在配置文件發生改變,重啓服務。files爲安裝時用到的一些文件,meta爲說明信息,說明角色依賴等信息,tasks裏面是核心的配置文件,templates一般存一些配置文件,啓動腳本等模板文件,vars下爲定義的變量
第二步
須要事先準備好安裝用到的文件,具體以下:
在一臺機器上事先編譯安裝好nginx,配置好啓動腳本,配置好配置文件
安裝好後,咱們須要把nginx目錄打包,並放到/etc/ansible/nginx_install/roles/install/files/下面,名字爲nginx.tar.gz
cd /usr/local
tar -zcvf nginx.tar.gz --exclude "nginx.conf" --exclude "vhost" nginx/ 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
在配置文件目錄common,子任務目錄task 下編寫安裝應用依賴包的playbook
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
第三步
在安裝目錄install,子變量目錄下vars,定義應用的相關變量。
vim /etc/ansible/nginx_install/roles/install/vars/main.yml //內容以下
nginx_user: www nginx_port: 80 nginx_basedir: /usr/local/nginx
在安裝目錄install,子任務目錄task下,編寫copy.yml ,依次實現,拷貝應用軟件包,並解壓。拷貝啓動腳本,拷貝主配置文件。
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 - 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
第五步
再建立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
備註:咱們以前用shell腳本開發了一個監控系統,也定義了好多目錄,這裏咱們用playbook 安裝nginx 的整個邏輯跟它相似,也就是腳本的調用。簡單來講 nginx_install下面的入口腳本instll.yml
調用common 和install ,咱們能夠將其看作兩個模塊,common執行的是安裝依賴包,install 又調用了兩個功能腳本,一個是拷貝是軟件包,另外一個是安裝。shell監控系統能夠訪問
http://www.javashuo.com/article/p-txyhchha-ez.html
舉例7
管理配置文件
生產環境中大多時候是須要管理配置文件的,安裝軟件包只是在初始化環境的時候用一下。下面咱們來寫個管理nginx配置文件的playbookmkdir -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/
vars 目錄下定義變量
vim /etc/ansible/nginx_config/roles/new/vars/main.yml //定義變量nginx_basedir: /usr/local/nginx
handlers目錄下定義從新加載服務,在配置文件拷貝完成後執行
vim /etc/ansible/nginx_config/roles/new/handlers/main.yml //定義從新加載nginx服務
- name: restart nginx shell: /etc/init.d/nginx reload
task 目錄下定義配置文件及其餘相關文件的拷貝,是核心任務
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
定義ansible要執行的總入口playbook
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
備註,回滾的意思就是從新加載更改前的配置文件,其它操做都沒有變化。再強調一次,更改配置以前,先備份。即便沒有在ansible 這裏備份,也應該對配置文件單獨備份。修改比較重要的文件件之間,先cp filename filename.bak是一個須要培養的習慣。playbook文件的執行過程,咱們要先從總入口文件開始分析。