這是我好久前寫的一篇博文Learning Ansible with Vagrant,但願對你們學習Ansible和Vagrant能有所幫助html
Vagrant是一款構建虛擬開發環境的工具,Vagrant的使用依賴於VirtualBox,VMware等一些虛擬機,經過Vagrant能更加方便的管理虛擬機,同時還可以經過Vagrant打包出一個開發環境,將它分發給團隊成員就可以保證團隊成員的開發環境一致。node
Ansible是一款基於Python的自動化運維工具,集合了衆多運維工具(puppet、chef)的優勢,實現了批量系統配置、批量程序部署、批量運行命令等功能。git
Ansible在管理節點將命令經過SSH協議(或者 Kerberos、LDAP)推送到被管理節點上並執行命令。經過這種方式就可以在管理節點上控制一臺或多臺被管理節點執行安裝軟件,重啓服務等命令。github
首先咱們須要經過Vagrant經過建立多臺虛擬機,一個充當管理節點,其餘充當被管理節點,同時在管理節點上須要安裝上ansible。Vagrantfile文件的配置以下圖所示web
Vagrant.config(2) do |config| #common config config.vm.box = "ubuntu/trusty64" config.vm.provider "virtualbox" do |vb| vb.memory = "256" end # create some web server (1..2).each do |i| config.vm.define "web#{i}" do |web_config| web_config.vm.hostname = "web#{i}" web_config.vm.network "private_network", ip: "192.168.33.2#{i}" web_config.vm.network "forwarded_port", guest: 80, host: "808#{i}" end end # create mgmt node config.vm.define "mgmt" do |mgmt_config| mgmt_config.vm.hostname = "mgmt" mgmt_config.vm.network "private_network", ip: "192.168.33.11" mgmt_config.vm.provision "shell", path: "bootstrap-mgmt.sh" end end
在Vagrantfile中咱們聲明瞭須要建立三臺虛擬機,mgmt爲管理節點,hostname是mgmt,ip地址爲192.168.33.11
,同時安裝好後會執行一段shell腳本(bootstrap-mgmt.sh)。web1,web2做爲被管理節點。shell
bootstrap-mgmt.sh內容以下所示bootstrap
#!/usr/bin/env bash #install ansible sudo apt-get install software-properties-common sudo apt-add-repository ppa:ansible/ansible sudo apt-get update sudo apt-get install -y ansible #configure hosts file cat >> /etc/hosts <<EOL #vagrant env node 192.168.33.11 mgmt 192.168.33.21 web1 192.168.33.22 web2 EOL
在shell腳本中,咱們作了兩件事ubuntu
1)安裝ansible,這裏由於咱們用的是Ubuntu操做系統,因此使用的是apt來進行安裝,其餘的安裝方式能夠在http://docs.ansible.com/ansible/intro_installation.html中查看
2)將每臺虛擬機的ip地址和hostname寫入到管理節點的hosts文件中,至於爲何要這麼作,這個後面再講vim
接下來咱們只須要在Vagrantfile所在目錄的命令行中敲入vagrant up
啓動虛擬機便可,前提是你已經安裝了vagrant了windows
當虛擬機啓動完成後,若是你是Linux或者OS X操做系統,在命令行中執行vagrant ssh mgmt就能夠鏈接到mgmt管理節點了,若是你是windows用戶,能夠經過Xshell,SecureCRT等SSH客戶端鏈接到mgmt管理節點,帳號和密碼默認都爲vagrant。
當成功鏈接到mgmt管理節點後,敲入ansible --version
,若是ansible安裝成功,顯示以下
安裝完ansible後咱們須要對ansible進行一些配置。接下來咱們能夠到/etc/ansible
目錄去copy一些配置文件到當前用戶(也就是vagrant)的家目錄下cp -r /etc/ansible/* ~
,接下來咱們到用戶的家目錄中打ansible.cfg
,也就是Ansible的配置文件
在ansible.cfg
的開頭咱們可能看到這麼一段註釋,以下所示
這段註釋表達的意思是,若是當前用戶的家目錄下存在ansible.cfg
,則會優先加載,若是沒有才去加載/etc/ansible/ansible.cfg
。若是這時候咱們在家目錄下敲入ansible --version
,就會發現配置文件的路徑指向的是/home/vagrant/ansible.cfg
編輯ansible.cfg
,將inventory
指向家目錄下的hosts
文件
以後修改家目錄下的hosts文件,修改成以下所示
[web]
表示一個組,組名爲web
,組成員爲web1
、web2
。
爲何組成員是web1
、web2
呢?
還記得以前咱們在bootstrap-mgmt.sh
中寫的shell腳本嗎?咱們在shell腳本中將主機ip和主機hostname都寫入到了管理節點的hosts文件中
#configure hosts file cat >> /etc/hosts <<EOL #vagrant env node 192.168.33.11 mgmt 192.168.33.21 web1 192.168.33.22 web2 EOL
固然也能夠將ansible的hosts配置成以下所示,這樣就不用配置主機的hosts文件
Ansible是經過SSH管理節點的,經過配置免密碼驗證能夠減小Ansible每次執行操做的時候都須要進行SSH驗證
在管理節點依次敲入以下命令
ssh-kengen ssh-copy-id -i ~/.ssh/id_rsa.pub vagrant@web1 ssh-copy-id -i ~/.ssh/id_rsa.pub vagrant@web2
接下來經過輸入命令ansible -m ping all
來驗證是否配置成功,若是出現以下所示,則表示成功
Ansible默認支持不少模塊,若是想知道Ansible支持哪些模塊,能夠經過命令ansible-doc -l
進行查看
若是想知道某一模塊的具體介紹和用法,能夠經過命令ansible-doc -s module_name
查看
在命令行中敲入ansible web1 -m command -a "ls /"
,就能夠查看遠程主機web1的根目錄的文件狀況
-m
表示指定使用command模塊,若是不指定,默認使用command模塊
-a
表示模塊須要的參數
Ansible的一些經常使用模塊能夠到http://blog.csdn.net/iloveyin/article/details/46982023這篇博文中查看
咱們能夠將Playbook理解爲經過必定的語法格式,在YAML文件中使用Ansible模塊,而後用ansible-play命令調用YAML文件實現管理遠程主機。
在家目錄下新建一個文件,vim demo.yml
,在文件中寫入
- hosts: web1 tasks: # task名字 - name: do somethings # 使用shell模塊 shell: 'echo 123 > /home/vagrant/demo.txt'
接下來,在命令行中敲入ansible-playbook demo.yml
,這樣就至關於執行了ansible web1 -m shell -a 'echo 123 > /home/vagrant/demo.txt'
,接着在命令行中執行ansible web1 -m shell -a 'cat /home/vagrant/demo.txt'
,能夠看到確實是將123寫入到了demo.txt中
Playbook的詳細使用方法能夠到官方文檔中查看http://docs.ansible.com/ansible/playbooks.html。若是英文不太好,能夠到國人翻譯的中文文檔中查看http://www.ansible.com.cn/。固然你也能夠結合文檔和官方提供的例子https://github.com/ansible/ansible-examples學習ansible