ansible使用1

 

經常使用軟件安裝及使用目錄   ansible軟件2css

 

### ansible軟件部署安裝需求####html

01. 須要有epelpython

    系統yum源(base epel--pip gemlinux

    sshpass---epelweb

02. ssh+key免密碼環境必須部署完成shell

 

 

### ansible經常使用模塊總結vim

01. ping---ansible測試模塊服務器

    ansible 172.16.1.41 -m ping網絡

    172.16.1.41 | SUCCESS => {less

    "changed": false,

    "ping": "pong"

    }

    說明:ansible鏈接測試成功結果

    ansible 172.16.1.31 -m ping

    172.16.1.31 | UNREACHABLE! => {

    "changed": false,

    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,password).\r\n",

    "unreachable": true

    }

    說明:ansible鏈接測試不成功結果

    

02. command-ansible遠程執行命令模塊

    a 命令模塊中的多個參數設置用空格進行分割

    b 命令模塊中不能出現 "<", ">", "|", ";" and "&"

    ## chdir    在執行命令以前,經過cd命令進入到指定目錄中

    ansible oldboy -m command -a "chdir=/tmp pwd"

    172.16.1.31 | SUCCESS | rc=0 >>

    /tmp

    

    ## creates   定義一個文件是否存在,若是不存在運行相應命令;若是存在跳過此步驟

    ansible oldboy -m command -a "pwd creats=/tmp/oldboy_file"

    172.16.1.31 | SUCCESS | rc=0 >>

    skipped, since /tmp/oldboy_file exists

 

    172.16.1.8 | SUCCESS | rc=0 >>

    /root

    

    ## removes   定義一個文件是否存在,若是存在運行相應命令;若是不存在跳過此步驟

    

    

03. shell-ansible遠程節點執行命令(萬能模塊)

    ansible oldboy -m shell -a "pwd;ifconfig eth0"

    說明:shell模塊在遠程執行腳本時,遠程主機上必定要有相應的腳本

    

    ansible oldboy -m shell -a "/server/scripts/hostname.sh"

    172.16.1.8 | SUCCESS | rc=0 >>

    web01

 

04. script-在本地執行腳本時,將腳本中的內容傳輸到遠程節點上運行

    ansible oldboy -m script -a "/server/scripts/free.sh"

    172.16.1.8 | SUCCESS => {

    "changed": true,

    "rc": 0,

    "stderr": "Shared connection to 172.16.1.8 closed.\r\n",

    "stdout": "             total       used       free     shared    buffers     cached\r\nMem:          980M       362M       617M       556K        32M       222M\r\n-/+ buffers/cache:       107M       873M\r\nSwap:         767M         0B       767M\r\n",

    "stdout_lines": [

        "             total       used       free     shared    buffers     cached",

        "Mem:          980M       362M       617M       556K        32M       222M",

        "-/+ buffers/cache:       107M       873M",

        "Swap:         767M         0B       767M"

    ]

    }  

    說明:不用講腳本傳輸到遠程節點上,腳本自己不用進行受權,便可利用script模塊批量執行腳本

    

 

05. copy---將本地數據傳輸到遠端,或者將遠程節點上數據進行移動

    src           --- 指定本地要傳輸複製的數據信息

    remote_src    --- 若是這個值設置爲True,將到遠程/目標主機的機器上搜索

    dest          --- 將數據複製到目標路徑信息(遠程主機)

    owner         --- 設置複製傳輸後的數據屬主信息

    group         --- 設置複製傳輸後的數據屬組信息

    mode          --- 設置文件數據權限信息

    backup        --- 對文件進行覆蓋前備份

    content       --- 替代src,定義文件中的內容

    force         --- 默認爲yes,當遠程文件內容和源文件內容不一樣時,將覆蓋目標文件

                      若是爲no,文件將只被傳輸,在目標主機不存在此文件時;以避免原文件被覆蓋

                      別名:thirsty

      

    管理主機數據---遠程主機

    ansible oldboy -m copy -a "src=/server/scripts/hostname.sh dest=/server/scripts mode=ugo+x"

172.16.1.31 | SUCCESS => {

    "changed": true,

    "checksum": "4c668aeb503bd26f5cb1f2d8dae6685c8d3f6a92",

    "dest": "/server/scripts/hostname.sh",

    "gid": 0,

    "group": "root",

    "mode": "0755",

    "owner": "root",

    "path": "/server/scripts/hostname.sh",

    "size": 308,

    "state": "file",

    "uid": 0

}

    遠程主機數據進行移動

# ansible oldboy -m copy -a "remote_src=true src=/server/scripts/hostname.sh dest=/tmp"

172.16.1.41 | SUCCESS => {

    "changed": true,

    "checksum": "4c668aeb503bd26f5cb1f2d8dae6685c8d3f6a92",

    "dest": "/tmp/hostname.sh",

    "gid": 0,

    "group": "root",

    "md5sum": "d5e56e25b2140657cbc5279325873494",

    "mode": "0644",

    "owner": "root",

    "size": 308,

    "src": "/server/scripts/hostname.sh",

    "state": "file",

    "uid": 0

}

 

    定義建立的文件內容

ansible oldboy -m copy -a "content=oldboyedu.com dest=/tmp/oldboy666.txt"

172.16.1.41 | SUCCESS => {

    "changed": true,

    "checksum": "291694840cd9f9c464263ea9b13421d8e74b7d00",

    "dest": "/tmp/oldboy666.txt",

    "gid": 0,

    "group": "root",

    "md5sum": "0a6bb40847793839366d0ac014616d69",

    "mode": "0644",

    "owner": "root",

    "size": 13,

    "src": "/root/.ansible/tmp/ansible-tmp-1508465581.84-1077420994316/source",

    "state": "file",

    "uid": 0

}

 

    copy命令建立多級目錄

    ansible oldboy -m copy -a "src=/etc/hosts dest=/tmp/a/b/c/d/"

 

 

06. file---設置文件屬性

    owner         --- 設置複製傳輸後的數據屬主信息

    group         --- 設置複製傳輸後的數據屬組信息

    mode          --- 設置文件數據權限信息

    dest          --- 要建立的文件或目錄命令,以及路徑信息

    state         --- 若是指定參數爲directory 建立目錄;全部不存在的子目錄將會被建立,而且從1.7開始支持設置目錄權限

                      若是指定參數爲file      建立文件;若是文件不存在將不能被建立,若是想建立能夠參考copytemplate模塊

                      若是指定參數爲link      建立軟連接; 符號連接將被建立或更改。

                      若是指定參數爲hard      便會建立出硬連接

                      若是指定參數爲absent    目錄將被遞歸刪除以及文件,而連接將被取消連接。

                                              請注意,定義文件不存在不會失敗,只是輸出沒有發生任何改變的結果

                      若是指定參數爲touch     若是路徑不存在將建立一個空文件,若是文件或目錄存在將接收更新的文件訪問和修改時間

                                             (相似於touch」從命令行工做的方式)

    src           --- 指定要建立軟連接的文件信息

 

    建立目錄:

    ansible oldboy -m file -a "dest=/tmp/oldboy_dir state=directory"

172.16.1.8 | SUCCESS => {

    "changed": true,

    "gid": 0,

    "group": "root",

    "mode": "0755",

    "owner": "root",

    "path": "/tmp/oldboy_dir",

    "size": 4096,

    "state": "directory",

    "uid": 0

}

 

    建立多級目錄:

# ansible oldboy -m file -a "dest=/tmp/oldboy_dir/01/02/03 state=directory"

172.16.1.8 | SUCCESS => {

    "changed": true,

    "gid": 0,

    "group": "root",

    "mode": "0755",

    "owner": "root",

    "path": "/tmp/oldboy_dir/01/02/03",

    "size": 4096,

    "state": "directory",

    "uid": 0

}

 

    建立文件:

    ansible oldboy -m file -a "dest=/tmp/oldboy_file state=touch"

172.16.1.8 | SUCCESS => {

    "changed": true,

    "dest": "/tmp/oldboy_file",

    "gid": 0,

    "group": "root",

    "mode": "0644",

    "owner": "root",

    "size": 0,

    "state": "file",

    "uid": 0

}

 

    建立軟連接;

    ansible oldboy -m file -a "src=/tmp/oldboy_file dest=/tmp/oldboy_file_link state=link"

172.16.1.8 | SUCCESS => {

    "changed": true,

    "dest": "/tmp/oldboy_file_link",

    "gid": 0,

    "group": "root",

    "mode": "0777",

    "owner": "root",

    "size": 16,

    "src": "/tmp/oldboy_file",

    "state": "link",

    "uid": 0

}

 

    刪除目錄 文件信息

    [root@m01 scripts]# ansible oldboy -m file -a "dest=/tmp/oldboy_dir state=absent"

172.16.1.8 | SUCCESS => {

    "changed": true,

    "path": "/tmp/oldboy_dir",

    "state": "absent"

}

 

}

    [root@m01 scripts]# ansible oldboy -m file -a "dest=/tmp/oldboy_file state=absent"

172.16.1.31 | SUCCESS => {

    "changed": true,

    "path": "/tmp/oldboy_file",

    "state": "absent"

}

 

07  fetch---將遠程主機上的文件,拉取到本地主機

    dest     --- 將遠程主機拉取過來的文件保存在本地的路徑信息

    src      --- 指定從遠程主機要拉取的文件信息

    flat     --- 默認設置爲no,若是設置爲yes,將不顯示172.16.1.8/etc/信息

    

 

    從遠程主機拉取文件

    ansible oldboy -m fetch -a "dest=/tmp  src=/etc/hosts"

172.16.1.8 | SUCCESS => {

    "changed": true,

    "checksum": "bd9a0f82db17051a305f6a5974fa1fd95ead73d5",

    "dest": "/tmp/172.16.1.8/etc/hosts",

    "md5sum": "27b1ddf7c360698b439627b057f77d51",

    "remote_checksum": "bd9a0f82db17051a305f6a5974fa1fd95ead73d5",

    "remote_md5sum": null

}

 

    flat參數實踐

    ansible oldboy -m fetch -a "dest=/tmp/  src=/etc/hosts flat=yes"

172.16.1.41 | SUCCESS => {

    "changed": true,

    "checksum": "bcb7c85bad6008ede9e73d18ae0bb78f2b11f612",

    "dest": "/tmp/hosts",

    "md5sum": "211bd00bf9ba8a735db1c7953d7cebc4",

    "remote_checksum": "bcb7c85bad6008ede9e73d18ae0bb78f2b11f612",

    "remote_md5sum": null

}

 

 

08. mount---控制激活和配置掛載點模塊

    fstype    --- 指定掛載文件類型;-t nfs == fstype=nfs

    opts      --- 設定掛載的參數選項信息; -o ro == opts=ro

    path      --- 指定掛載點   path=/mnt

    src       --- 要被掛載的目錄設備信息   src=172.16.1.31:/data/w

    state     --- # 若是爲mountd

                  fstab文件中的設備將被激活掛載和適當配置

                  # 若是爲unmounted

                  設備將被卸載並不會改變fstab文件信息

                  absentpresent只處理fstab,但不影響目前的掛載

    

    進行掛載

    mount -t nfs -o ro  172.16.1.31:/data /mnt

 

    ansible oldboy -m mount -a 「fstype=nfs opts=ro src=172.16.1.31:/data path=/mnt state=mounted」

172.16.1.41 | SUCCESS => {

    "changed": true,

    "dump": "0",

    "fstab": "/etc/fstab",

    "fstype": "nfs",

    "name": "/mnt",

    "opts": "ro",

    "passno": "0",

    "src": "172.16.1.31:/data/w"

}

 

    卸載操做

    ansible oldboy -m mount -a 「fstype=nfs opts=ro src=172.16.1.31:/data path=/mnt state=unmounted」

    [root@m01 tmp]# ansible oldboy -m mount -a "fstype=nfs opts=ro src=172.16.1.31:/data path=/mnt state=unmounted"

    172.16.1.8 | SUCCESS => {

    "changed": false,

    "dump": "0",

    "fstab": "/etc/fstab",

    "fstype": "nfs",

    "name": "/mnt",

    "opts": "ro",

    "passno": "0",

    "src": "172.16.1.31:/data"

}

    mounted

    01. 將掛載信息添加到/etc/fstab

    02. 加載/etc/fstab實現掛載

    unmounted

    01. 加載/etc/fstab實現卸載

    absent

    01. fstab文件中刪除掛載配置

    present

    01. fstab文件中添加掛載配置

    

09. cron--定時任務模塊(Manage cron.d and crontab entries.)

    crontab -e

    0 0 * * *  /bin/sh /server/scripts/hostname.sh &>/dev/null

 

    minute                 # Minute when the job should run ( 0-59, *, */2, etc )

    hour                   # Hour when the job should run ( 0-23, *, */2, etc )

    day                    # Day of the month the job should run ( 1-31, *, */2, etc )

    month                  # Month of the year the job should run ( 1-12, *, */2, etc )

    weekday                # Day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )

    name                   # 定義定時任務的描述信息

    disabled               # 註釋定時任務

    state                  # absent刪除定時任務;present建立定時任務(默認爲present

    

    建立定時任務

    ansible oldboy -m  cron -a  "minute=0 hour=0 job='/bin/sh /server/scripts/hostname.sh &>/dev/null'"

172.16.1.41 | SUCCESS => {

    "changed": true,

    "envs": [],

    "jobs": [

        "None"

    ]

}

 

    ansible oldboy -m  cron -a  "name=oldboycron01 minute=0 hour=0 job='/bin/sh /server/scripts/hostname.sh &>/dev/null'"

    172.16.1.31 | SUCCESS => {

    "changed": true,

    "envs": [],

    "jobs": [

        "oldboycron01",

        "oldboycron02"

    ]

}

    

    刪除定時任務

    ansible oldboy -m  cron -a  "name=oldboycron01 minute=0 hour=0 job='/bin/sh /server/scripts/hostname.sh &>/dev/null' state=absent"

    ansible oldboy -m  cron -a  "name=oldboycron01 state=absent"

 

    註釋定時任務

    # ansible oldboy -m  cron -a  "name=oldboycron02 job='/bin/sh /server/scripts/hostname.sh &>/dev/null' disabled=yes"

172.16.1.31 | SUCCESS => {

    "changed": true,

    "envs": [],

    "jobs": [

        "oldboycron02"

    ]

}

    # ansible oldboy -m  cron -a  "name=oldboycron02 job='/bin/sh /server/scripts/hostname.sh &>/dev/null' disabled=no"

 

 

10  yum---安裝軟件模塊

    ansible oldboy -m yum -a "name=nmap state=installed"

    

11  service---服務啓動關閉管理模塊

    ansible oldboy -m service -a "name= state=stopped enabled=yes"

    說明:設置服務狀態信息爲過去時;service管理的服務必須存在在/etc/init.d/下面有的服務腳本

    

   

### ansible在沒有祕鑰的時候如何批量管理 ####

01. 編寫hosts文件

    不基於ssh+key方式使用ansible

    ### ansible測試受控端連通性方法 ######

    [root@m01 ansible]# ansible 172.16.1.7 -m ping

    2.16.1.7 | UNREACHABLE! => {

    "changed": false,

    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,password).\r\n",

    "unreachable": true

    }

    

    # vim /etc/ansible/hosts

    172.16.1.7 ansible_ssh_user=root ansible_ssh_pass=123456

    [root@m01 ansible]# ansible 172.16.1.7 -m ping

    172.16.1.7 | SUCCESS => {

    "changed": false,

    "ping": "pong"

    }

    

    # 不在hosts文件寫入密碼實現ansible遠程管理

    [root@m01 ansible]# ansible -k 172.16.1.7 -m ping

    SSH password:

    172.16.1.7 | SUCCESS => {

    "changed": false,

    "ping": "pong"

    }

    

 

02. 未分發公鑰如何實現遠程管理主機

    vim /etc/ansible/hosts

    [oldboy]

    172.16.1.31 ansible_ssh_user=root ansible_ssh_pass=123456                                                         

    172.16.1.41:52113

    172.16.1.8

 

    

###### shell模塊說明

[root@m01 ssh]# ansible 172.16.1.31 -m command -a "free -m >/tmp/free.txt"

172.16.1.31 | SUCCESS | rc=0 >>

             total       used       free     shared    buffers     cached

Mem:          1990        348       1642          0         30        180

-/+ buffers/cache:        138       1852

Swap:          767          0        767

 

[root@m01 ssh]# ansible 172.16.1.31 -m command -a "cat /tmp/free.txt"

172.16.1.31 | FAILED | rc=1 >>

cat: /tmp/free.txt: No such file or directory

 

[root@m01 ssh]# ansible 172.16.1.31 -m shell -a "free -m >/tmp/free.txt"

172.16.1.31 | SUCCESS | rc=0 >>

 

 

[root@m01 ssh]# ansible 172.16.1.31 -m command -a "cat /tmp/free.txt"

172.16.1.31 | SUCCESS | rc=0 >>

             total       used       free     shared    buffers     cached

Mem:          1990        348       1642          0         30        180

-/+ buffers/cache:        138       1852

Swap:          767          0        767

 

########shell模塊和command模塊功能相似,可是shell模塊能夠識別一些特殊符號信息 > >> | * ^    

    

 

########經過yum模塊安裝nmap軟件:#############

ansible oldboy -m yum -a "name=nmap state=installed"

 

########經過service模塊管理軟件服務:

ansible oldboy -m service -a "name=crond state=stop enabled=no"

 

########經過file模塊設置文件屬性信息:

ansible oldboy -m file -a "src=/etc/hosts dest=/tmp/hosts state=link own=oldboy mode=0600"

說明:表示批量建立軟件

 

##### expect軟件介紹 ###

ssh 鏈接時

在文件中定義好:

yes/no yes

password 123456

 

 

04: ansible基礎知識部分補充

    1ansible軟件特色:

    · 能夠實現批量管理

· 能夠實現批量部署

· ad-hoc(批量執行命令)---針對臨時性的操做

  ansible oldboy -m command -a "hostname"   <- 批量執行命令舉例

· 編寫劇本-腳本(playbook)---針對重複性的操做

    2ansible核心功能:

        · pyYAML-----用於ansible編寫劇本所使用的語言格式(saltstack---python

        · paramiko---遠程鏈接與數據傳輸

· Jinja2-----用於編寫ansible的模板信息

    ======================================================================================

擴展說明:jinja2模板做用:

   for循環語句jinja模板】

    爲遠程主機生成服務器列表,加入該列表info192.168.13.201 web01.test.com 192.168.13.211 web11.test.com 結束,

若是手動添加就很不科學了,這裏須要使用jinja2語法的for循環經過模板批量生成對應的配置文件,以下:

 

    ansible目錄結構:

    #cd /etc/ansible/roles/test_hosts

    .

    ├── meta

    │   └── main.yml

    ├── tasks

    │   ├── file1.yml

    │   └── main.yml

    ├── templates

    │   └── test1.j2

    └── vars

        └── main.yml

 

    各個目錄下yml文件內容:

    # cat tasks/main.yml

    - include: file1.yml

 

    # cat tasks/file1.yml

    - name: ansible jinja2 template for hosts config

      template: src=test1.j2 dest=/etc/httpd/conf/httpd.conf.test

 

    # cat templates/test1.j2

      {% for id in range(201,211) %}

      192.168.13.{{ id }} web{{ "%02d" |format(id-200) }}.test.com

      {% endfor %}

      解釋:

      {{ id }} 提取for循環中對應的變量id

      "%02d"   調用的是python內置的字符串格式化輸出(%d格式化整數)由於是01,02這種格式,因此是保留2位,故用02

      而後將結果經過管道符|」 傳遞給format 函數作二次處理。

 

      執行結果:

      #cat httpd.conf.test

      192.168.13.201 web01.test.com

      192.168.13.202 web02.test.com

      192.168.13.203 web03.test.com

      192.168.13.204 web04.test.com

      192.168.13.205 web05.test.com

      192.168.13.206 web06.test.com

      192.168.13.207 web07.test.com

      192.168.13.208 web08.test.com

      192.168.13.209 web09.test.com

      192.168.13.210 web10.test.com

      192.168.13.211 web11.test.com

 

參考資料:http://linuxg.blog.51cto.com/4410110/1788574

    ======================================================================================

  說明:不少ansible的報錯都是和python有關,由於ansible的底層開發是利用python編寫的

 

05: ansible擴展模塊功能介紹

    ①. ansible實現檢查被管理服務器端網絡鏈接是否通暢(檢查道路是否通暢)

        # ansible oldboy -m command -a "hostname"    <-- 最開始檢查道路是否通暢方法

        # ansible oldboy -m ping          <-- 專業檢查道路是否通暢方法

        172.16.1.31 | SUCCESS => {

        "changed": false,

        "ping": "pong"

        }

        172.16.1.7 | SUCCESS => {

            "changed": false,

            "ping": "pong"

        }

        172.16.1.41 | SUCCESS => {

            "changed": false,

            "ping": "pong"

        }

以上信息不清楚,能夠經過利用ansible查看幫助信息方法獲取新模塊功能說明

# ansible-doc -s ping

        - name: Try to connect to host, verify a usable python and return `pong' on success.

        action: ping

說明:嘗試鏈接到主機,驗證網絡鏈接是否通暢,若是通暢返回pong信息表示成功

      激活驗證功能,利用ping模塊

  

    ②. ansible實現定時任務功能執行相應的操做(定時任務)

        回顧傳統的定時任務爲:

        # crontab -l

        #time sync by oldboy at 2010-2-1

        */5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1

說明:日期格式爲 分鐘:minute,小時:hour,日期:day,月:month,周:weekday  

      日期格式後面接須要執行的命令或腳本文件

    獲取ansible定時任務模塊說明信息:

# ansible-doc -s cron

        - name: Manage cron.d and crontab entries.

        cron模塊主要管理cron.dcrontab條目信息;即實現配置定時任務

          action: cron    激活定時任務功能,利用cron模塊

              backup                 # If set, create a backup of the crontab before it is modified. The location of the backup is returned in the `backup_file' variable by this module.

              cron_file              # If specified, uses this file instead of an individual user's crontab. If this is a relative path, it is interpreted with respect to /etc/cron.d. (If it is absolute, it will

                                       typically be /etc/crontab). To use the `cron_file' parameter you must specify the `user' as well.

              day                    # Day of the month the job should run ( 1-31, *, */2, etc )

                           運行job任務的日期時間信息(編寫方式1-31*, */2, )

              disabled               # If the job should be disabled (commented out) in the crontab. Only has effect if state=present

                           若是job應該關閉(被註釋掉)。只能影響狀態是開啓狀態的定時任務條目

              env                    # If set, manages a crontab's environment variable. New variables are added on top of crontab. "name" and "value" parameters are the name and the value of environment variable.

                                       若是設置,管理crontab的環境變量信息。新的環境變量信息會被增長到定時任務表頂部。描述或數值會被環境變得的名稱或數值所定義

  hour                   # Hour when the job should run ( 0-23, *, */2, etc )

                           運行job任務的小時時間信息(編寫方式0-23*, */2, )

              insertafter            # Used with `state=present' and `env'. If specified, the environment variable will be inserted after the declaration of specified environment variable.

              insertbefore           # Used with `state=present' and `env'. If specified, the environment variable will be inserted before the declaration of specified environment variable.

              job                    # The command to execute or, if env is set, the value of environment variable. Required if state=present.

                           執行相應的命令,若是env被設置,將做爲環境變量的值,但前提是state=present

              minute                 # Minute when the job should run ( 0-59, *, */2, etc )

                           運行job任務的分鐘時間信息(編寫方式0-59**/2,等等)

              month                  # Month of the year the job should run ( 1-12, *, */2, etc )

                           運行job任務的月份時間信息(編寫方式1-12*, */2, )

              name                   # Description of a crontab entry or, if env is set, the name of environment variable. Required if state=absent. Note that if name is not set and state=present, then a new crontab

                                       entry will always be created, regardless of existing ones.

   定時任務條目的描述信息;若是env被設定了,描述信息將爲環境變量信息。前提是定時任務狀態爲關閉狀態

   注意:若是名稱沒有被指定而且定時任務狀態爲開啓,那麼新的定時任務將總被建立,無論這個定時任務是否存在

              reboot                 # If the job should be run at reboot. This option is deprecated. Users should use special_time.

              special_time           # Special time specification nickname.

                           指定時間規格綽號

              state                  # Whether to ensure the job or environment variable is present or absent.

                           確認job或環境變量是開啓或是關閉

              user                   # The specific user whose crontab should be modified.

                           指定修改與編寫定時任務的用戶信息

              weekday                # Day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )

                           job任務應該在一週的哪天進行運行(編寫方式0-6表示週日到週六,以及用*符號等)

         

        # ansible 172.16.1.7 -a "crontab -l"                  <- 查看當前被管理服務器定時任務文件信息

          172.16.1.7 | SUCCESS | rc=0 >>

          #crond-id-001:time sync by hq

          */5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1

        

參考下面編寫的定時任務條目,進行編寫ansible定時任務命令

# restart network

00 00 * * * /etc/init.d/network restart >/dev/null 2>&1

# ansible 172.16.1.7 -m cron -a "minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'"

          172.16.1.7 | SUCCESS => {

              "changed": true,

              "envs": [],

              "jobs": [

                  "None"

              ]

          }

        # ansible 172.16.1.7 -a "crontab -l"

          172.16.1.7 | SUCCESS | rc=0 >>

          #Ansible: None

          00 00 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1

 

若是沒有定義定時任務描述信息,每次執行ansible建立定時任務,都會被反覆建立

# ansible 172.16.1.7 -m cron -a "name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'"

          172.16.1.7 | SUCCESS => {

              "changed": true,

              "envs": [],

              "jobs": [

                  "None",

                  "restart network"

              ]

          }

        # ansible 172.16.1.7 -a "crontab -l"

          172.16.1.7 | SUCCESS | rc=0 >>

          #Ansible: None

          00 00 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1

          #Ansible: restart network

          00 00 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1

  

利用ansible的模擬檢查參數-C,實現模擬檢查ansible命令語法格式是否正確,但命令並不會執行產生效果   

# ansible 172.16.1.7 -C -m cron -a "name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'"

          172.16.1.7 | SUCCESS => {

              "changed": false,

              "envs": [],

              "jobs": [

                  "None",

                  "restart network"

              ]

          }

 

刪除無用的定時任務信息

        # ansible 172.16.1.7 -C -m cron -a "name='None' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' state=absent"  <- 先進行測試,測試成功後再進行刪除

    # ansible 172.16.1.7  -m cron -a "name='None' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' state=absent"

          172.16.1.7 | SUCCESS => {

              "changed": true,

              "envs": [],

              "jobs": [

                  "restart network"

              ]

          }

        # ansible 172.16.1.7  -m cron -a "name='None' state=absent"   <- 指定當前任務名稱,便可進行刪除操做

 

臨時關閉與開啓指定定時任務效果,但不刪除定時任務條目

        # ansible 172.16.1.7 -m cron -a "name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' disabled=yes"

          172.16.1.7 | SUCCESS => {

              "changed": true,

              "envs": [],

              "jobs": [

                  "restart network"

              ]

          }

          [root@m01 ~]# ansible 172.16.1.7 -a "crontab -l"

          172.16.1.7 | SUCCESS | rc=0 >>

          #Ansible: restart network

          #00 00 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1

          

# ansible 172.16.1.7 -m cron -a "name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' disabled=no"

          172.16.1.7 | SUCCESS => {

              "changed": true,

              "envs": [],

              "jobs": [

                  "restart network"

              ]

          }

          [root@m01 ~]# ansible 172.16.1.7 -a "crontab -l"

          172.16.1.7 | SUCCESS | rc=0 >>

          #Ansible: restart network

          00 00 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1

          

          

          cron模塊總結:

          01:對定時任務的狀態進行註釋時,-a後面信息,必定要包含定時任務的name信息以及job信息

          02:若是沒有定義定時任務描述信息,每次執行ansible建立定時任務,都會被反覆建立

          03:利用ansible的模擬檢查參數-C,實現模擬檢查ansible命令語法格式是否正確,但命令並不會執行產生效果

          04:指定當前任務名稱,便可進行刪除操做

          

 

06: ansible重要模塊功能總結

    command (重要模塊) 執行命令模塊,ansible命令執行默認模塊

    shell (重要模塊) 執行shell腳本模塊

    script (重要模塊) 把腳本發到客戶端,而後執行;執行腳本命令在遠端服務器上

    copy (重要模塊) 把本地文件發送到遠端

 

    

 

    

ansible學精通:--- saltstack

01. 模塊

02. 劇本

03. 開發python(自定義編寫模塊)

 

模塊==命令 ansible執行命令

劇本==腳本

 

 

04: ansible基礎知識部分補充

    1ansible軟件特色:

    · 能夠實現批量管理

· 能夠實現批量部署

· ad-hoc(批量執行命令)---針對臨時性的操做

  ansible oldboy -m command -a "hostname"   <- 批量執行命令舉例

· 編寫劇本-腳本(playbook)---針對重複性的操做

        

        幫助方法:

        ansible-doc -l

        ansible-doc -s 模塊名稱

        

    2ansible核心功能:

        · pyYAML-----用於ansible編寫劇本所使用的語言格式(saltstack---python)  rsync-ini語法  sersync-xml ansible-pyYAML

        · paramiko---遠程鏈接與數據傳輸

· Jinja2-----用於編寫ansible的模板信息  

        

        172.16.1.1--100=IP

        PATH        

       

07: ansible劇本編寫規則說明

    pyYAML語法規則:

規則一:縮進

    yaml使用一個固定的縮進風格表示數據層結構關係,Saltstack須要每一個縮進級別由兩個空格組成。必定不能使用tab

    注意:編寫yaml文件,就忘記鍵盤有tab

        

    規則二:冒號

    CMD="echo"

    yaml:

    mykey:

    每一個冒號後面必定要有一個空格(以冒號結尾不須要空格,表示文件路徑的模版能夠不須要空格)

    

    規則三:短橫線

    想要表示列表項,使用一個短橫槓加一個空格。多個項使用一樣的縮進級別做爲同一個列表的一部分

    核心規則:有效的利用空格進行劇本的編寫,劇本編寫是不支持tab

 

    ---

    ### 劇本的開頭,能夠不寫

    - hosts: all         <- 處理全部服務器,找到全部服務器;  -(空格)hosts:(空格)all

      tasks:             <- 劇本所要乾的事情;                (空格)(空格)task:

        - command: echo hello oldboy linux.                  (空格)(空格)空格)(空格)-(空格)模塊名稱:(空格)模塊中對應的功能

      

      ansible all -m command -a "echo hello oldboy linux"      

        

        

    劇本編寫內容擴展:劇本任務定義名稱

- hosts: 172.16.1.7  <- 處理指定服務器                   -(空格)hosts:(空格)all

  task:                <- 劇本所要乾的事情;                (空格)(空格)task:

    - name:

          command: echo hello oldboy linux.                  (空格)(空格)空格)(空格)-(空格)模塊名稱:(空格)模塊中對應的功能

 

    劇本編寫內容擴展:劇本任務編寫定時任務

# ansible all -m cron -a "name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'"

- hosts: all

      tasks:

        - name: restart-network

          cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'

    # ansible-playbook -C /etc/ansible/network-restart.yml  -vvvx

說明:測試劇本命令後面能夠跟多個-v進行調試檢查

    

    

    劇本編寫後檢查方法:

    01ansible-playbook --syntax-check 01.yml   --- 進行劇本配置信息語法檢查

    02ansible-playbook -C 01.yml               --- 模擬劇本執行(彩排)

    

劇本編寫內容擴展:劇本任務編寫多個任務

- hosts: all

      tasks:

        - name: restart-network

          cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'

        - name: sync time

          cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"

 

 

劇本編寫內容擴展:劇本任務編寫多個主機

- hosts: 172.16.1.7

      tasks:

        - name: restart-network

          cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'

        - name: sync time

          cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"

- hosts: 172.16.1.31

      tasks:

        - name: show ip addr to file

          shell: echo $(hostname -i) >> /tmp/ip.txt

    **************************************************************************************

擴展知識說明:vim編輯器使用說明

01:複製當前行到最後一行的內容,而後粘貼到最後一行的後面

    :/172.16.1.31/,$copy$

:.,$copy$

**************************************************************************************

 

    劇本編寫方式

    01 多主機單任務編寫方式

    02 多主機多任務編寫方式

    03 不一樣主機多任務編寫方式

        

08: ansible劇本編寫總結說明

    找什麼服務器,讓服務器幹寫什麼

多使用檢查命令-C

 

利用ansible安裝rsync服務器

01. 從新克隆兩臺主機,一臺做爲rsync服務端 -臺做爲rsync客戶端

02. 利用ansible管理主機(編寫劇本),部署rsync服務端,與rsync客戶端

03. rsync客戶端主機不需分發公鑰文件,實現ansible管理

 

09:課後做業:

    ①. 請總結一下mount模塊是否存在,mount模塊如何使用

    ②. 利用ansible安裝rsync服務器

    ③. 利用ansible安裝nfs服務器

. 利用ansible配置sersync數據同步

 

 

附錄01pssh命令使用擴展

=========================================

原文:http://liang3391.blog.51cto.com/178205/732100

參考:http://www.ibm.com/developerworks/cn/aix/library/au-spunix_remoteserver/index.html

 

01pssh命令使用場景說明

    假如同時給上千臺服務器執行一個命令,拷貝一個文件,殺一個進程等,有什麼簡化運維管理的工具呢?

在小型企業中一般使用for循環,可是數量巨大時:

· 一方面不肯定操做是否成功一方面不肯定操做是否成功

· 一方面for循環語句性能很差估計且是否是同步並行執行。

所以須要使用批量並行執行的命令,這類工具好比 pdshmusshcsshdsh等還有下面說明提到的pssh

 

02pssh軟件安裝部署方式

    ①. 經過yum安裝pssh軟件

    yum install -y pssh    <- pssh軟件下載須要依靠epel

說明:pssh是一個軟件大禮包,裏面有不少軟件命令

# rpm -ql pssh

        /usr/bin/pnuke

        /usr/bin/prsync

        /usr/bin/pscp.pssh

        /usr/bin/pslurp

        /usr/bin/pssh

....省略部分信息....

    ①. 經過編譯方式安裝pssh軟件

        wget http://peak.telecommunity.com/dist/ez_setup.py

        python ez_setup.py

        wget http://parallel-ssh.googlecode.com/files/pssh-2.2.2.tar.gz

        tar zxvf pssh-2.2.2.tar.gz

        cd pssh-2.2.2

        python setup.py install

 

03pssh軟件使用操做說明(ssh key認證密鑰配置完畢)

    pssh工具包主要有5個程序:

    ①. pssh  多主機並行運行命令

    [root@server pssh-2.2.2]# vim hosts_info.txt

        172.16.1.31:22

        172.16.1.41:22

        172.16.1.7:22             //注意個人端口號不只是默認的22        

 

        [root@m01 tmp]# pssh -P -h /tmp/hosts_info.txt uptime

        172.16.1.31:  00:05:58 up 3 days, 18:34,  2 users,  load average: 0.00, 0.01, 0.05

        [1] 00:05:58 [SUCCESS] 172.16.1.31:22

        172.16.1.41:  00:05:58 up 9 days, 22:39,  2 users,  load average: 0.00, 0.01, 0.05

        [2] 00:05:58 [SUCCESS] 172.16.1.41:22

        172.16.1.7:  00:05:58 up 9 days, 22:39,  2 users,  load average: 0.00, 0.01, 0.05

        [3] 00:05:58 [SUCCESS] 172.16.1.41:22        

        說明:若是想將執行命令的批量輸出信息重定向到一個文件 -o 目錄 選項

              -h HOST_FILE,  --hosts=HOST_FILE       hosts file (each line "[user@]host[:port]")

  -o OUTDIR,     --outdir=OUTDIR         output directory for stdout files (OPTIONAL)

  -P,            --print                 print output as we get it

 

    ②. pscp  把文件並行地複製到多個主機上

        注意 是從服務器端給客戶端傳送文件:

        [root@server pssh-2.2.2]# pscp -h test.txt /etc/sysconfig/network /tmp/network   

//標示將本地的/etc/sysconfig/network傳到目標服務器的/tmp/network

 

    ③. prsync 使用rsync協議從本地計算機同步到遠程主機

        [root@server ~]# pssh -h test.txt -P mkdir /tmp/etc

        [root@server ~]# prsync -h test.txt -l dongwm -a -r /etc/sysconfig /tmp/etc

//標示將本地的/etc/sysconfig目錄遞歸同步到目標服務器的 /tmp/etc目錄下,並保持原來的時間戳,使用用戶 dongwm

 

    ④. pslurp 將文件從遠程主機複製到本地,pscp方向相反:

        [root@server ~]# pslurp -h test.txt   -L /tmp/test -l root /tmp/network test  

//標示將目標服務器的/tmp/network文件複製到本地的/tmp/test目錄下,並改名爲test

        [1] 14:53:54 [SUCCESS] 192.168.9.102 9922

        [2] 14:53:54 [SUCCESS] 192.168.9.104 9922

        [root@server ~]# ll /tmp/test/192.168.9.10

        192.168.9.102/ 192.168.9.104/

        [root@server ~]# ll /tmp/test/192.168.9.102/

        總計 4.0K

        -rw-r--r-- 1 root root 60 2011-04-22 14:53 test

        [root@server ~]# ll /tmp/test/192.168.9.104/

        總計 4.0K

        -rw-r--r-- 1 root root 60 2011-04-22 14:53 test

 

    ⑤. pnuke 並行在遠程主機殺進程:

        [root@server ~]# pnuke -h test.txt  syslog

//殺死目標服務器的syslog進程,只要ps進程中出現相關詞語 都能殺死

        [1] 15:05:14 [SUCCESS] 192.168.9.102 9922

        [2] 15:05:14 [SUCCESS] 192.168.9.104 9922

=========================================

 

 

 

常見問題一:

[root@m01 ~]# ansible  -k 172.16.1.51 -m ping  

SSH password:

[WARNING]: No hosts matched, nothing to do

緣由分析:

ansiblehosts文件中,沒有配置相應主機地址信息

        

常見問題二:        

# ansible -k 172.16.1.51 -m ping

SSH password:

172.16.1.51|FAILED! => {

"failed": true,

"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host."

}

緣由分析:

由於沒有受控端的指紋信息,在known_hosts文件中

 

 

command   --- 執行命令

shell     --- 執行腳本 執行命令(萬能模塊 支持正則或特殊符號信息)

script    --- 執行腳本

相關文章
相關標籤/搜索