ansible學習基礎知識和模塊(一)

  基礎知識補充:node

經常使用自動化運維工具 Ansible:使用python來開發的,無需設置Agentless(代理),通常管理幾百臺。與ssh的方式也不同,ssh是基於c/s模式(客戶端+服務器)來使用服務端提供的服務,屬於多臺客戶端訪問一臺服務器。而ansible是控制端,使用裝了ansible的主機管理多臺主機。也叫作主控端。Ansible是經過ssh端口來實現無代理配置。 Saltstack:使用python語言開發,通常需部署agent(代理),執行效率更高,通常管理幾千臺。 Puppet:使用ruby語言開發,功能強大,配置複雜,適合大型環境(瞭解便可) 下面這些使用者較少,不作介紹 Fabric:使用python語言開發,agentless(不須要設置代理) Chef: 使用ruby語言開發 Cfengine Func Ansible特性 模塊化:調用特定的模塊,完成特定任務 有Paramiko(基於ssh的開發語言),PyYAML(YAML語言),Jinja2(模板語言)這三個關鍵模塊,並支持自定義模塊 基於Python語言實現 部署簡單,基於python和SSH(默認已安裝),agentless(不須要設置代理) 安全,基於OpenSSH 支持playbook編排任務 冪等性:一個任務執行1遍和執行n遍效果同樣,不因重複執行帶來意外狀況 無需代理不依賴PKI(無需ssl) 可以使用任何編程語言寫模塊 YAML格式,編排任務,支持豐富的數據結構 較強大的多層解決方案

用戶經過ANSIBLE來下達指令,一般是逐條命令執行。能夠經過公有/私有云來實現遠程管理.python

 
 

主機庫存中包含着全部主機的列表,經過主機分組及鏈接插件來實現管理不一樣的主機,給一些主機升級,一些主機建立用戶等目的。linux

 
 

劇本是用在批量,按期作例行性工做的時候,好比按期作備份等等。在複雜一些的狀況會使用角色(Roles),至關於多個劇本的組合。nginx

 
 

Ansible主要組成部shell

 
 

ANSIBLE PLAYBOOKS:任務劇本(任務集),編排定義Ansible任務集的配置文件,由Ansible順序依次執行,一般是JSON格式的YML文件數據庫

 
 

INVENTORY:Ansible管理主機的清單,位於/etc/anaible/hosts文本文件中,內容爲要管理的主機的名稱或IP地址.編程

 
 

MODULES:Ansible執行命令的功能模塊,多數爲內置核心模塊,也可自定義json

 
 

PLUGINS:模塊功能的補充,如鏈接類型插件、循環插件、變量插件、過濾插windows

 
 

件等,該功能不經常使用安全

 
 

API:供第三方程序調用的應用程序編程接口

 
 

ANSIBLE:組合INVENTORY、API、MODULES、PLUGINS的綠框,能夠理解爲是ansible命令工具,其爲核心執行工具

 
 

Ansible命令執行來源:

 
 

1 USER,普通用戶,SYSTEM ADMINISTRATOR(系統管理員)

 
 

2 CMDB(配置管理數據庫) API 調用(須要開發接口)

 
 

3 PUBLIC/PRIVATE CLOUD API調用(須要開發接口)

 
 

USER-> Ansible Playbook -> Ansibile(運維工程師一般用這種方式)

 
 

利用ansible實現管理的方式:

 
 

1 Ad-Hoc 即單條ansible命令,主要用於臨時命令使用場景

 
 

Ansible-playbook 主要用於長期規劃好的,大型項目的場景,須要有前提的規劃

 
 

Ansible-playbook(劇本)執行過程:

 
 

將已有編排好的任務集寫入Ansible-Playbook,經過ansible-playbook命令分拆任務集至逐條ansible命令,按預約規則逐條執行

 
 

Ansible主要操做對象:

 
 

HOSTS主機

 
 

NETWORKING網絡設備

 
 

注意事項

 
 

執行ansible的主機通常稱爲主控端,中控,master或堡壘機

 
 

主控端Python版本須要2.6或以上

 
 

被控端Python版本小於2.4須要安裝python-simplejson

 
 

被控端如開啓SELinux須要安裝libselinux-python

 
 

windows不能作爲主控端

 
 

ansible安裝:配置好倉庫的epel源,直接yum install ansible便可。

 
 

確認版本號: ansible –version

 ansible的配置文件

 
 

/etc/ansible/ansible.cfg 主配置文件,配置ansible工做特性,大部分配置不用修改,默認值便可.

 
 

/etc/ansible/hosts 主機清單,要控制的主機必須存放在這個文件中。

 
 

/etc/ansible/roles/ 存放角色的目錄,角色可理解爲多個劇本的集合

 
 

 ansible的程序

 
 

/usr/bin/ansible 主程序,臨時命令執行工具

 
 

/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具(不少模塊的幫助信息都在這裏,至關於man)

 
 

/usr/bin/ansible-galaxy 下載/上傳優秀代碼或Roles模塊的官網平臺

 
 

/usr/bin/ansible-playbook 定製自動化任務,編排劇本工具/usr/bin/ansible-pull 遠程執行命令的工具(pull,拉取的意思。有時候把別人的文件拉取到我這來,有時候把個人東西推送到別人那)

 
 

/usr/bin/ansible-vault 文件加密工具

 
 

/usr/bin/ansible-console 基於Console界面與用戶交互的執行工具

 

ansible模塊介紹:

執行哪些模塊,就使用-m參數來指定。對其執行哪些動做則使用-a參數指定。

下面的演示都是一箇中控機,而後2個node。

1)group模塊

group模塊:管理用戶組模塊     相關選項:       name:組名稱       gid:指定GID       state:present/absent
        present:表示建立。absent:表示刪除       system:yes
/no
        yes/no:是否爲系統用戶。

  1.1)案例演示:

[root@ELK-chaofeng01 ~]#ansible all -m group -a "gid=3000 name=chaofeng state=present system=no" 172.16.0.53 | CHANGED => { "changed": true, "gid": 3000, "name": "chaofeng", "state": "present", "system": false } 172.16.0.52 | CHANGED => { "changed": true, "gid": 3000, "name": "chaofeng", "state": "present", "system": false }

2)user模塊

因爲user模塊的選項衆多,這裏只介紹一些經常使用的選項:       name:用戶名       password:爲用戶設置登錄密碼,此密碼是明文密碼加密後的密碼       update_password:always/on_create         always:只有當密碼不相同時纔會更新密碼(默認)         on_create:只爲新用戶設置密碼       shell:用戶的shell設定       groups:用戶附加組設定       home:指定用戶的家目錄       append:yes/no         yes:增量添加group         no:全量變動group,只設置groups指定的group組(默認)       remove:配合state=absent使用,刪除用戶的家目錄->remove=yes

案例演示:

  2.1)添加一個用戶

[root@ELK-chaofeng01 ~]#ansible all -m user -a "uid=5000 name=testuser state=present groups=root shell=/bin/tcsh" 172.16.0.52 | CHANGED => { "changed": true, "comment": "", "create_home": true, "group": 5000, "groups": "root", "home": "/home/testuser", "name": "testuser", "shell": "/bin/tcsh", "state": "present", "system": false, "uid": 5000 } 172.16.0.53 | CHANGED => { "changed": true, "comment": "", "create_home": true, "group": 5000, "groups": "root", "home": "/home/testuser", "name": "testuser", "shell": "/bin/tcsh", "state": "present", "system": false, "uid": 5000 }

 注意:要添加的附加組也是須要在node節點的主機上事先存在的,不然會報錯:好比  

    

3)copy模塊

copy模塊:複製本地文件至遠程主機上         相關選項:       backup:在覆蓋以前,將源文件備份,備份文件包含時間信息。有兩個選項:yes|no       content:用於替代「src」,能夠直接設定指定文件的值       dest:必選項。要將源文件複製到的遠程主機的絕對路徑,若是源文件是一個目錄,那麼該路徑也必須是個目錄       directory_mode:遞歸設定目錄的權限,默認爲系統默認權限       force:若是目標主機包含該文件,但內容不一樣,若是設置爲yes,則強制覆蓋,若是爲no,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes       others:全部的file模塊裏的選項均可以在這裏使用       src:被複制到遠程主機的本地文件(也就是中控機上的文件),能夠是絕對路徑,也能夠是相對路徑。若是路徑是一個目錄,它將遞歸複製。在這種狀況下,若是路徑使用「/」來結尾,則只複製目錄裏的內容,若是沒有使用「/」來結尾,則包含目錄在內的整個內容所有複製,相似於rsync。       owner,group,mode...
      mode:設定複製的文件的權限屬性,數字表示法來設定。

案例:

  3.1)將中控機上/etc/fstab文件複製到遠程節點上:

[root@ELK-chaofeng01 ~]#ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=600" 172.16.0.52 | CHANGED => { "changed": true, "checksum": "150ff5f6b99363314d375b73a5708e2a9911e52a", "dest": "/tmp/fstab.ansible", "gid": 0, "group": "root", "md5sum": "5fe64bfebc65805a98e7e9d47e9f379f", "mode": "0600", "owner": "root", "size": 501, "src": "/root/.ansible/tmp/ansible-tmp-1553574326.56-222928675924643/source", "state": "file", "uid": 0 } 172.16.0.53 | CHANGED => { "changed": true, "checksum": "150ff5f6b99363314d375b73a5708e2a9911e52a", "dest": "/tmp/fstab.ansible", "gid": 0, "group": "root", "md5sum": "5fe64bfebc65805a98e7e9d47e9f379f", "mode": "0600", "owner": "root", "size": 501, "src": "/root/.ansible/tmp/ansible-tmp-1553574326.57-180187752562484/source", "state": "file", "uid": 0 }

 咱們能夠在node節點上看看權限信息

[root@ELK-chaofeng02 ~]#ls /tmp/fstab.ansible  -l -rw------- 1 root root 501 Mar 26 12:25 /tmp/fstab.ansible

   3.2)複製一個目錄

[root@ELK-chaofeng01 ~]#ansible 172.16.0.52 -m copy -a "src=/etc/yum.repos.d/ dest=/tmp/yum.repos_ansible owner=root" 172.16.0.52 | CHANGED => { "changed": true, "dest": "/tmp/yum.repos_ansible/", "src": "/etc/yum.repos.d/" }

    注意:上面的src路徑中,是咱們定義的要複製的源目錄,源目錄後必須帶上根路徑」/「標識符。不然不帶的話,複製的是目錄自己,並不是目錄下的全部文件。

  在node節點上查看一下:

    

補充:fetch的做用:將遠程主機上的文件複製到本地來。用法格式:ansible-doc -s fetch

4)shell模塊:讓遠程主機在shell進程下執行命令,從而支持shell的特性,如管道等。

若是說咱們的目標主機須要執行一些命令類操做,所以咱們就須要使用shell模塊

[root@ELK-chaofeng01 ~]#ansible all -m shell -a "ip addr" 172.16.0.53 | CHANGED | rc=0 >>
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:e5:63:80 brd ff:ff:ff:ff:ff:ff inet 172.16.0.53/16 brd 172.16.255.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::1924:db50:da5d:2e13/64 scope link valid_lft forever preferred_lft forever 172.16.0.52 | CHANGED | rc=0 >>
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:5b:be:3f brd ff:ff:ff:ff:ff:ff inet 172.16.0.52/16 brd 172.16.255.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::f427:6471:2b8a:40f8/64 scope link valid_lft forever preferred_lft forever

5)file模塊:多設置文件屬性

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

案例:

  5.1)建立一個目錄

     

  5.2)建立一個符號連接

    

6)cron模塊

minute=/hour=/day=/month=/weekday= 某個值不寫,默認就是*       name:必選項,任務描述信息       job:執行的任務,要加引號       state:present(建立)/absent(刪除)

案例:

  6.1)定時在目標主機上執行任務

[root@ELK-chaofeng01 ~]#ansible all -m cron -a "minute=*/3 job='/usr/sbin/echo haha &>/dev/null' name=None state=present" 172.16.0.52 | CHANGED => { "changed": true, "envs": [], "jobs": [ "None" ] } 172.16.0.53 | CHANGED => { "changed": true, "envs": [], "jobs": [ "None" ] }

  而後咱們去目標主機看一下:

  

  在cron計劃任務裏面確實有這個任務。

  取消計劃任務:

[root@ELK-chaofeng01 ~]#ansible all -m cron -a "minute=*/3 job='/usr/sbin/echo haha &>/dev/null' name=None state=absent"

7)yum模塊:管理安裝rpm程序包

相關選項:       name:程序包名稱,可帶版本號       state:present、installed、latest(安裝)/absent、removed(刪除)

案例:

  一、安裝一個包apr-devel

  

8)service模塊:管理服務

      name:服務名稱       state:started/stopped/restarted/reloaded       enabled:true/false 是否要開機自啓。       runlevel:運行級別

案例:

  8.1)將全部節點啓動nginx服務。

  

  8.2)將全部節點的nginx服務關閉了

  

9)自定義script腳本:自動上傳到全部的節點並執行此腳本。

   命令語法:

案例演示:

  9.1)上傳一個腳本到節點並執行

    先在中控機編寫一個腳本:

    

    而後在中控機上傳到各個節點並執行

[root@ELK-chaofeng01 ~]#ansible all -m script -a "/tmp/echo.sh" 172.16.0.52 | CHANGED => { "changed": true, "rc": 0, "stderr": "Shared connection to 172.16.0.52 closed.\r\n", "stderr_lines": [ "Shared connection to 172.16.0.52 closed." ], "stdout": "", "stdout_lines": [] } 172.16.0.53 | CHANGED => { "changed": true, "rc": 0, "stderr": "Shared connection to 172.16.0.53 closed.\r\n", "stderr_lines": [ "Shared connection to 172.16.0.53 closed." ], "stdout": "", "stdout_lines": [] }

    而後到其中一個節點查看一下:

    

    執行成功了。

相關文章
相關標籤/搜索