ansible--基礎

馬哥出品 ansible中文文檔:http://www.ansible.com.cn/index.htmlhtml

ansible介紹:python

ansible是個什麼東西呢?官方的title是「Ansible is Simple IT Automation」——簡單的自動化IT運維管理工具。這個工具的目標有這麼幾項:讓咱們自動化部署APP;自動化管理配置項;自動化的持續交付;自動化的(AWS)雲服務管理。基於Python開發,可實現對多臺服務器進行批量配置、程序的部署及指令的運行。大大減小了在運維工程中的工做量。mysql

ansible是基於模塊工做的,自己沒有批量部署的能力。真正具備批量部署的是ansible所運行的模塊,ansible只是提供一種框架。主要包括:sql

(1)、鏈接插件connection plugins:負責和被監控端實現通訊;shell

(2)、host inventory:指定操做的主機,是一個配置文件裏面定義監控的主機;apache

(3)、各類模塊核心模塊、command模塊、自定義模塊;json

(4)、藉助於插件完成記錄日誌郵件等功能;centos

(5)、playbook:劇本執行多個任務時,非必需可讓節點一次性運行多個任務。安全


ansible特色:
服務器

 1.簡單,ansible天然的自動化語言與容許運維人員,開發者,和IT管理人員在很短的時間內完成自動化項目。

 2.無代理,默認使用SSH而不須要客戶端。避免了額外的端口開啓,提升安全性,避免沒必要要的管理,減小CPU的使用

 3.乾的活多,ansible能幹自動完成軟件部署,配置管理,流程化管理,和cloud provisioning。


ansible安裝:

因爲ansible是用python開發的,安裝過程當中依賴衆多python模塊,這裏建議yum安裝ansible,想要更新版本的可下載源碼編譯安裝,

yum install ansible -y

yum安裝ansible的默認配置文件路徑,ansible.cfg是ansible的主配置文件,

ansible]# ls /etc/ansible/

ansible.cfg   hosts  roles

hosts是默認的hostfile路徑,可配置DNS域名,ip。


經過ssh key方式鏈接遠端客戶機,省去密碼環節

ssh-keygen -t rsa -P ''

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.137.130


注意這個地方是有個坑的,因爲ansible執行的時候須要把臨時模塊拷貝到客戶端,而默認的拷貝方式是經過sftp來的方式拷貝的,若是你的客戶端沒有裝sftp,那麼執行ansible會出錯的。  

    

若是沒裝sftp能夠用scp。 下面的這一行原本是註釋起來的,把註釋去掉就OK了  

ansible]# grep "scp_if_ssh" /etc/ansible/ansible.cfg 

scp_if_ssh = True

   


還有個坑,即便裝了sftp也不必定能用,你的ssh要啓用它才OK。  

ansible]# grep "Subsystem"  /etc/ssh/sshd_config 

Subsystem sftp /usr/lib/openssh/sftp-server

   


ansible的基本工做流程:

    1.ansible經過OPENSSH或者python的pramamiko鏈接客戶端

    2.把ansible module推送到客戶端。

        ansible]# grep "remote_tmp" /etc/ansible/ansible.cfg 

        remote_tmp     = $HOME/.ansible/tmp

        ansible]# ansible one  -a "ls  ~/.ansible"

        salt-master | success | rc=0 >>

        tmp

    3.經過ssh執行客戶端上的ansible module

    4.執行完畢

    5.刪除剛剛推送過去的ansible module


ansible基本命令行模塊:

ansible-doc -s 模塊名     ##查看模塊用法幫助

ansible-doc -l            ##查看有哪些可用模塊


1.臨時作小事情或一次性行爲可用命令行,大型或常常重複使用的活用play-book

2.命令行三劍客:command(默認),shell(支持管道,變量,),raw(客戶機不能裝python時使用)

3.官方建議用command,shell和raw須要用到的時候再用


command:命令模塊,默認模塊,用於遠程執行命令

-a 'COMMAND'

ansible]# grep -n "module_name" ansible.cfg

97:#module_name = command

ansible all -a 'date'


user:

-a 'name= state={present|absent} system= uid='

# ansible one -m user -a 'name=mysql uid=306 system=yes group=mysql'

# ansible one -m user -a 'name=mysql shell=/sbin/nologin createhome=no'


group:

-a 'name= gid= state= system='

# ansible one -m group -a 'name=mysql gid=306 system=yes'


cron:修改定時任務

-a 'name="" minute= hour= day= month= weekday= job= user= state='

state狀態

present:增長

absent:刪除,配置name就可移除

# ansible one -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"'


copy:複製文件到遠程主機

-a 'dest= src= mode= owner= group='

src=:定義本地源文件路徑

dest=:定義遠程目標文件路徑

content=:取代src=,表示直接用此處指定的信息生成目標文件內容;

# ansible all -m copy -a 'src=/etc/fstab dest=/tmp/fstab.ansible owner=/root mode=640'

# ansible all -m copy -a 'content="Hello Ansible\nHi MageEdu" dest=/tmp/test.ansible'


file:設定文件屬性

-a 'path= mode= owner= group= state={directory|link|present|absent} src='

path=:指定文件路徑,可使用name或dest來替換

建立文件的符號連接

src=:指明源文件

path=:指明符號連接文件路徑

# ansible all -m file -a 'path=/tmp/fstab.link src=/tmp/fstab.ansible state=link'

# ansible all -m file -a "path=/tmp/resolv.conf state=absent"

# ansible salt-master -m file -a 'dest=/tmp/ansible.log  owner=lixc group=lixc mode=644

   state=touch'   #touch:遠程主機建立文件


force:須要在兩種狀況下強制建立軟連接,

一種是源文件不存在,但以後會創建的狀況下;

另外一種是目標軟連接已存在,須要先取消以前的軟鏈,而後建立新的軟鏈,有兩個選項:yes|no

group:定義文件/目錄的屬組

mode:定義文件/目錄的權限

owner:定義文件/目錄的屬主

path:必選項,定義文件/目錄的路徑

recurse:遞歸設置文件的屬性,只對目錄有效

src:被連接的源文件路徑,只應用於state=link的狀況

dest:被連接到的路徑,只應用於state=link的狀況

state:

    directory:建立遞歸文件,若是目錄不存在,就建立目錄,

    file:即便文件不存在,也不會被建立

    link:建立軟連接

    hard:建立硬連接

    touch:若是文件不存在,則建立一個新的文件,若是文件或目錄已存在,則更新其最後修改時間

    absent:刪除目錄、文件或者取消連接文件


ping:測試指定主機可否鏈接


yum:安裝程序包

-a 'name= state={present|latest|absent}'

name:指明要安裝的程序包,能夠帶上版本號

state=:present,latest表示安裝,absent表示卸載

# ansible one -m yum -a 'name=mysql-server state=latest|installed'


還有一個後臺執行的功能。

-B 30是設置後臺執行時間爲30秒,

-P2是沒兩秒鐘報告一次狀態,這個當你的任務要執行很長時間的時候能夠用。

# ansible one -m yum -a 'name=apache2 state=installed'  -B 30 -P2 >>/dev/null


service:指定運行狀態

-a 'name= state={started|stopped|restarted} enabled='

name=:服務名稱

state=:狀態,取值有started,stopped,restarted

enabled=:是否開機自動啓動,取值爲true或者false


shell: ##可支持管道,變量,command模塊不支持,

例:echo "centos" |passwd --stdin centos

# ansible storm_cluster -m shell -a "/tmp/rocketzhang_test.sh"


script:  ##將本地腳本複製到遠程主機並運行之;要使用相對路徑指定腳本

-a '/path/to/script'


setup:  ##收集遠程主機的facts

每一個被管理節點在接收並運行管理命令以前,會將本身主機相關信息,如操做系統版本,ip地址等報告給遠程的ansible主機


Inventory的默認路徑是在/etc/ansible/hosts,分爲靜態和動態兩種

靜態:須要手工的把你要管理的主機寫進去。

動態:事先有一個資源管理系統,裏面有全部主機信息,用腳本程序把資源管理系統裏的信息給拉過來,以json格式呈現

配置靜態Inventory:

ansible]# cat -n /etc/ansible/hosts 

     1 [alltest:children]

     2 salt

     3 leihuo

     4

     5 [salt]

     6 salt-master  ansible_ssh_user=lixc ansible_ssh_pass=123456

     7 10.240.162.112  ansible_connection=paramiko

     8

     9 [leihuo]

    10  lixc ansible_ssh_host=192.168.131.203 ansible_ssh_port=21100 

    11  10.240.162.11[1:9]:22


第1行,alltest這個組包含倆子組分別是下面的salt,和leihuo

第6行能夠設置主機的默認鏈接用戶,及密碼

第7行能夠設置ssh的鏈接方式,默認是openssh,我這裏用paramiko,不用官網推薦用openssh,由於openssh查詢key的時候,很耗時,效率不高。

第10行,能夠給主機隨便取個別名,這裏的「lixc」就是一個別名,若是ssh默認端口不是22,這裏能夠

指定特定的端口,

指定ssh端口也能夠像第11行,這麼指定。

不過以上兩種指定ssh端口方法,只針對咱們有少部分的主機是特殊端口,若是咱們全部主機都是指定的端口,配置文件裏有個選項,改爲咱們須要的端口就OK了,修改後對全局有效


  

ansible]# grep "remote_port" /etc/ansible/ansible.cfg 

remote_port    = 22

   


第7行和11行,是倆相同的主機,說明同一主機能夠在不一樣的組中。在現實當中就像我一臺服務器便可以裝mysql也能夠裝apache是一個道理。


變量:

ansible的變量主要給後面的playbook使用,分爲主機變量和組變量

ansible]# cat -n /etc/ansible/hosts 

     1 [alltest:children]

     2 salt

     3 leihuo

     4

     5 [salt]

     6 salt-master  salt-port=4505 mysql-port=3306

     7 10.240.162.112  salt-path=/usr/bin/salt-call

     8

     9 [leihuo]

    10  lixc ansible_ssh_host=192.168.131.203 ansible_ssh_port=21100 

    11  10.240.162.11[1:9]:22

    12  [alltest:vars]

    13  ls-path=/bin/ls

    14  liss=lisisi


6,7行設置主機變量

12-14行,設置的爲alltest這個組的變量。組變量就是,我這個組的成員均可以用

固然咱們也能夠不在/etc/ansible/hosts裏面定義變量,也能夠把變量寫進單獨的文件裏,不過變量定義的形式就不是誰=誰,這麼個形式了。而是遵循yaml語法的key: value的形式。

把變量寫進文件:

ansible]# for dir in {host_vars,group_vars};do ls /etc/ansible/${dir};done

10.240.162.112  salt-master

alltest

文件定義格式:

ansible]# cat /etc/ansible/host_vars/salt-master 

---

salt-port: 4505

mysql-port: 3306


ansible目標主機匹配patterns:

匹配全部主機

*或者all

匹配多個組

salt:leihuo

在salt這個組裏,但不能在leihuo這個組裏的主機

salt:!leihuo

取兩個組的交集

salt:&leihuo

排除某一主機

ansible-playbook site.yaml --limit salt-msater

固然也能夠用正則,在/etc/ansible/hosts裏面去定義。如

~salt(master|minion)\.li*\.com

相關文章
相關標籤/搜索