ansible簡介,簡單實用

Ansible 

ansilbe是實現自動化運維的工具,基於python開發,實現批量系統配置,批量程序部署,批量運行命令等功能。node

ansible是基於模塊工做的,自身是沒有批量部署的能力。真正具備批量部署能力的是ansible的模塊,ansbile只是提供一種框架python

ansbile特色mysql

模塊化:使用特定的模塊,完成特定的工做web

支持自定義模塊redis

基於Python語言開發的sql

不須要再被控端安裝組件,也就是無需客戶端,直接在服務端執行命令。shell

批量任務執行能夠用腳本,也不須要傳遞到遠程就能夠執行。vim

ansible的基本架構:bash

1.連接插件用於鏈接主機,鏈接受控端。架構

2.核心模塊鏈接主機實現操做,依靠模塊作具體的事情。

3.自定義模塊:根據本身的需求編寫模塊

4.插件是對模塊功能的補充。

5.playbook,ansible功能的形象化描述。

6.host inventory 定義ansible須要的操做主機的範圍

Ansible使用

服務端:10.220.5.63

兩個被控端:10.220.5.65

                      10.220.5.66

1、安裝ansible

[root@63 ~]# yum install ansible

查看版本

[root@63 ~]# ansible --version
ansible 2.6.2
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 2015

相關文檔

[root@63~]# rpm -qc ansible
/etc/ansible/ansible.cfg
/etc/ansible/hosts

2、生成密鑰

[root@63 ~]# ssh-keygen -t rsa
[root@63 ~]#  ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.63
[root@63 ~]#  ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.65
[root@63~]#  ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.66
[root@63 ~]#  ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.63 <<<本身也做爲受控端
[root@63 ~]#  ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.65
[root@63~]#  ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.66

在主控端/etc/hosts中添加受控端主機信息

[root@63 ~]# vim /etc/hosts

10.220.5.65 slave1
10.220.5.66 slave2

測試是否能免密碼登陸

[root@63 ~]# ssh slave1
Last login: Sat Nov 17 01:32:37 2018 from 10.220.5.63
[root@slave1 ~]# <<<爲10.220.5.65主機

測試

[root@63 ~]# ssh slave1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether 00:0c:29:d1:a8:6a brd ff:ff:ff:ff:ff:ff
    inet 10.220.5.65/24 brd 10.220.5.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 10.220.5.233/24 scope global secondary ens33:1
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fed1:a86a/64 scope link 
       valid_lft forever preferred_lft forever

3、使用ansible管理其餘節點

格式:ansible <host> [options]
選項:
         -m:指定模塊名稱
         -a:指定模塊的具體參數
          -s:以sudo的方式運行操做
          -i:指定被管理節點的主機列表
          -f:一次鏈接幾個主機進行操做(默認是5個主機)

查看ansible所支持的模塊的信息

[root@63 ~]# ansible-doc -l
默認用command模塊

查看一個模塊的使用幫助

例:

[root@63 ~]# ansible-doc -s command
- name: Executes a command on a remote node
  command:
      argv:                  # Allows the user to provide the command as a list vs. a string.  Only the string
                               or the list form can be provided, not both.  One
                               or the other must be provided.
      chdir:                 # Change into this directory before running the command.
      creates:               # A filename or (since 2.0) glob pattern, when it already exists, this step will
                               *not* be run.
      free_form:             # (required) The command module takes a free form command to run.  There is no
                               parameter actually named 'free form'. See the
                               examples!
      removes:               # A filename or (since 2.0) glob pattern, when it does not exist, this step will
                               *not* be run.
      stdin:                 # Set the stdin of the command directly to the specified value.
      warn:                  # If command_warnings are on in ansible.cfg, do not warn about this particular
                               line if set to `no'.

 

模塊

1. command

默認模塊
做用:在各個遠程主機上執行命令,可是不能傳遞參數和變量,不支持特殊字符

格式:ansible 目標 -m command -a "命令"
說明:
目標:目標能夠是一個主機組,也能夠是hosts文件中的一個或者多個主機,也但是all
-m command:表示此次ansible操做是基於command模塊實現
-a "命令":表示是在管理節點上要執行的命令

例子:獲取受控節點主機名

[root@63~]# ansible webserver -m command -a "hostname"
10.220.5.65 | SUCCESS | rc=0 >>
slave1

10.220.5.66 | SUCCESS | rc=0 >>
slave2

也能夠單獨對一個受控端執行命令

[root@63 ~]# ansible 10.220.5.65 -m command -a "hostname"
10.220.5.65 | SUCCESS | rc=0 >>
slave1

2.shell模塊

也是在各個遠程主機上執行命令,但shell模塊能夠支持特殊字符,command不支持

chdir:指定一個目錄,在執行對應的命令以前,會先進入到 chdir 參數指定的目錄中。

creates:數指定一個文件,當指定的文件存在時,就不執行對應命令

removes:指定一個文件,當指定的文件不存在時,就不執行對應命令

executable:默認狀況下,shell 模塊會調用遠程主機中的 /bin/sh 去執行對應的命令,一般狀況下,遠程主機中的默認 shell 都是 bash。若是你想要使用其餘類型的 shell 執行命令,則可使用此參數指定某種類型的 shell 去執行對應的命令。指定 shell 文件時,須要使用絕對路徑。

例子:獲取65主機/tmp全部文件

[root@63 ~]# ansible 10.220.5.65 -m shell -a "ls /tmp/*"
10.220.5.65 | SUCCESS | rc=0 >>
/tmp/mysql3306.sock
/tmp/mysql3306.sock.lock

 3.script

               做用:在遠程主機執行主控端存的shell腳本(至關於scp+shell)

[root@63 ~]# ansible all -m script -a "/root/shell.sh"
10.220.5.66 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 10.220.5.66 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to 10.220.5.66 closed."
    ], 
    "stdout": "", 
    "stdout_lines": []
}
10.220.5.65 | SUCCESS => {

4. cron

做用:在指定的時間運行指定命令(計劃任務)

  cron:
      backup:       計劃名稱        
      cron_file:    替換客戶端用戶的計劃任務的文件         
      day:          日      
      hour:         小時 
name: 設置計劃任務的名稱
disabled:當計劃任務有名稱時,咱們能夠根據名稱使對應的任務」失效」(註釋掉對應的任務)。
除了須要指定任務的名稱,還須要同時指定任務的job 以及任務的時間設定,並且任務的時間設定必須和對應任務徹底相同,
不然在註釋任務的同時,任務的時間設定會被修改,除非你肯定這樣作。
      special_time  後面可加: reboot(重啓後)、yearly(每一年)、annually(每一年,與yearly相同)、monthly(每個月)、weekly(每週)、daily(天天)、hourly(每時)。             
      user:          設置當前計劃任務屬於哪一個用戶,若是不指定,默認爲管理員用戶       
      backup:        在修改或者刪除計劃任務時,會先對計劃任務作備份,而後在進行修改或者刪除            
      job:               用於指定計劃任務中須要實際執行的命令或者腳本   
state: 當計劃任務有名字時,能夠根據名稱修改或者刪除對應的任務,若是須要刪除計劃任務時,須要將state的值設置爲absent

例子1:每隔2分鐘再tmp下的log.txt中追加一個信息

[root@63 ~]# ansible all -m cron -a 'minute="*/2" job="echo 123>>/tmp/log.txt" name="job1" state="present"'
10.220.5.66 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "job1"
    ]
}
10.220.5.65 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "job1"
    ]

例子2.在65主機上建立計劃任務,任務名稱爲crontab day test ,任務每五天執行一次,任務內容輸出爲test

[root@63 ~]# ansible all -m cron -a " name='crontab day test' minute=1 day=*/3 job='echo test'"
10.220.5.65 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "job1", 
        "crontab day test"
    ]
}
10.220.5.66 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "job1", 
        "crontab day test"
    ]
}

 例子:.在 65主機上建立計劃任務,任務名稱爲」special time test」,任務將在重啓時執行,任務內容爲輸出 test 字符。

[root@63 ~]# ansible 10.220.5.65 -m cron -a " name='special time test' special_time=reboot job='echo test'"
10.220.5.65 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "job1", 
        "crontab day test", 
        "special time test"

例子:任務」special time test」已經存在於65主機中。,要刪除這個計劃任務,刪除任務的同時能夠進行備份。

[root@63~]# ansible 10.220.5.65 -m cron -a " name='special time test' state=absent backup=yes "
10.220.5.65 | SUCCESS => {
    "backup_file": "/tmp/crontabNaCVq8", 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "job1", 
        "crontab day test"

 檢查一下在65主機上建立的計劃任務

[root@63~]# ansible 10.220.5.65 -a "crontab -l"
10.220.5.65 | SUCCESS | rc=0 >>
#Ansible: job1
*/2 * * * * echo 123>>/tmp/log.txt
#Ansible: crontab day test
1 * */3 * * echo test

5.copy

做用:文件的複製
子命令:
src:原文件路徑
dest:目標文件路徑
mode:指定權限
backup:有目標文件存在,先對原始文件作備份,而後進行覆蓋
force:強制執行覆蓋
owner:指定複製後的文件的屬主
content:替代src

 others:全部的file模塊裏的選項均可以在這裏使用

 例子1:將主控端/etc/passwd 文件,複製到65主機/tmp/目錄下,並該名爲psswd1

[root@63 ~]# ansible 10.220.5.65 -m copy -a 'src="/etc/passwd" dest=/tmp/passwd1'
10.220.5.65 | SUCCESS => {
    "changed": false, 
    "checksum": "be868aa216508a02c3e0c64186e77f191f27eeca", 
    "dest": "/tmp/passwd1", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "path": "/tmp/passwd1", 
    "size": 1565, 
    "state": "file", 
    "uid": 0

6.user,group

home:指定用戶的家目錄,須要與createhome配合使用。
groups:指定用戶的屬組。
 uid:指定用的uid。
 password:指定用戶的密碼。
注意:指定password參數時,不能使用明文密碼,由於後面這一串密碼會被直接傳送到被管理主機的/etc/shadow文件中,因此須要先將密碼字符串進行加密處理。而後將獲得的字符串放到password中便可。
name:指定用戶名。
createhome:是否建立家目錄 yes|no。
system:是否爲系統用戶。
 remove:當state=absent時,remove=yes則表示連同家目錄一塊兒刪除,等價於userdel -r。
 state:是建立仍是刪除。(present,absent)
shell:指定用戶的shell環境。
 generate_ssh_key:是否爲相關用戶生成SSH密鑰。 這不會覆蓋現有的SSH密鑰。
ssh_key_bits:可選擇指定要建立的SSH密鑰中的位數。
 ssh_key_passphrase:設置SSH密鑰的密碼。 若是沒有提供密碼,SSH密鑰將默認沒有密碼。
ssh_key_file:指定SSH密鑰文件名(可選)。 若是這是一個相對的文件名,那麼它將是相對於用戶的主目錄。
 ssh_key_type:指定要生成的SSH密鑰的類型(可選)。 可用的SSH密鑰類型將取決於目標主機上的實現。
例子:在65主機上建立用戶名爲qq,家目錄爲/home/,屬組爲redis,uid爲1010

[root@63 ~]# ansible 10.220.5.65 -m user -a "name=qq home=/home/qq createhome=yes groups=redis uid=1010"
10.220.5.65 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "create_home": true, 
    "group": 1010, 
    "groups": "redis", 
    "home": "/home/qq", 
    "name": "qq", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1010

例子:在65主機上建立用戶組httpd

[root@66 ~]# ansible 10.220.5.65 -m group -a "name=httpd state=present"
10.220.5.65 | SUCCESS => {
    "changed": true, 
    "gid": 1012, 
    "name": "httpd", 
    "state": "present", 
    "system": fals

7.yum

RedHat / CentOS包管理工具
config_file:yum的配置文件 
disable_gpg_check:關閉gpg_check 
 disablerepo:不啓用某個源 
enablerepo:啓用某個源
 name:要進行操做的軟件包的名字,默認最新的程序包,指明要安裝的程序包,能夠帶上版本號,也能夠傳遞一個url或者一個本地的rpm包的路徑
state:狀態(present,absent,latest),表示是安裝還卸載
   present:默認的,表示爲安裝
   lastest: 安裝爲最新的版本
   absent:表示刪除
例子:在65主機安裝httpd

[root@63~]# ansible 10.220.5.65 -m yum -a "name=httpd state=present"
10.220.5.65 | SUCCESS => {
    "changed": true, 
    "msg": "", 
    "rc": 0, 
    
  ...................................
}

8.file模塊

做用:實現文件的各類管理操做
force:須要在兩種狀況下強制建立軟連接,一種是源文件不存在但以後會創建的狀況下;另外一種是目標軟連接已存在,須要先取消以前的軟鏈,而後建立新的軟鏈,有兩個選項:yes|no
 group:屬組
mode:權限
owner:屬主
 path:路徑
recurse:遞歸的設置文件的屬性,只對目錄有效
src:要被連接的源文件的路徑,只應用於state=link的狀況
 dest:被連接到的路徑,只應用於state=link的狀況
 state:
   directory:若是目錄不存在,建立目錄
   file:即便文件不存在,也不會被建立
   link:建立軟連接
   hard:建立硬連接
   touch:若是文件不存在,則會建立一個新的文件,若是文件或目錄已存在,則更新其最後修改時間
   absent:刪除目錄、文件或者取消連接文件
例子:在65主機上建立文件abc.sh

[root@63 ~]# ansible 10.220.5.65 -m file -a 'state=touch path=/tmp/abc.sh'
10.220.5.65 | SUCCESS => {
    "changed": true, 
    "dest": "/tmp/abc.sh", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "size": 0, 
    "state": "file", 
    "uid": 0

將65主機/tmp/abc.sh 連接爲/tmp/abc

[root@63 ~]# ansible 10.220.5.65 -m file -a 'state=link src=/tmp/abc.sh path=/tmp/abc'
10.220.5.65 | SUCCESS => {
    "changed": true, 
    "dest": "/tmp/abc", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "size": 11, 
    "src": "/tmp/abc.sh", 
    "state": "link", 
    "uid": 0
}

9. service

做用:管理服務

子命名;
name:指定服務的名稱
enabled:指定服務是否開機自啓動
state:指定服務最後的狀態 started stopped reloaded restarted
runlevel:指定運行級別

 例子:在65主機上重啓網卡

[root@66  ~]# ansible 10.220.5.65 -m service -a "name=network state=restarted"
10.220.5.65 | SUCCESS => {
    "changed": true, 
    "name": "network", 
    "state": "started", 

10.ping

做用:作ping測試

例子:對64主機作ping測試

[root@66  ~]# ansible 10.220.5.64 -m ping
10.220.5.64 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

11.mount模塊

配置掛載點
選項: 

dumpfstype:必選項,掛載文件的類型  

 name:必選項,掛載點 

opts:傳遞給mount命令的參數

src:必選項,要掛載的文件 

state:必選項 

present:只處理fstab中的配置

 absent:刪除掛載點 

mounted:自動建立掛載點並掛載之 

umounted:卸載

 例子:在64主機上掛載光盤到/mnt

[root@66  ~]# ansible 10.220.5.64 -m mount -a "name=/mnt src=/dev/sr0 fstype=iso9660 state=mounted"
10.220.5.64 | SUCCESS => {
    "changed": true, 
    "dump": "0", 
    "fstab": "/etc/fstab", 
    "fstype": "iso9660", 
    "name": "/mnt", 
相關文章
相關標籤/搜索