Ansible基礎入門1

常用自動化運維工具:

Ansible:python,Agentless,中小型應用環境

Saltstack:python,一般需要部署agent,執行效率高

Puppent:ruby,功能強大,配置複雜,適合大型環境

Fabric:python,agentlees

Ansible特性:

  • 模塊化:調用特定的模塊,完成特定任務
  • 有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模塊
  • 支持自定義模塊
  • 基於Python語言實現
  • 部署簡單,基於python和ssh,agentless
  • 安全,基於openssh
  • 支持playbook編排任務
  • 冪等性:一個任務執行1遍和執行n遍效果一樣,不會因爲重複執行而帶來意外情況
  • 無須代理不依賴PKI(無須SSL)
  • 可使用任何編程語言寫模塊
  • YAML格式,編排任務,支持豐富的數據結構
  • 較強大的多層解決方案

    Ansible架構:

    Ansible基礎入門1

    User通過主控端ansible控制host,ansbile裏有一個host lnventory 主機清單記錄着哪些主機是要被控制的,模塊用於單一的命令,如果要執行多條任務就要用到playbook批量執行。
    要連接被控制主機就要用到Connection plugins連接插件基於SSH協議來執行。不僅可以使user用戶來管理,也可以利用私有云或公有云開發接口來進行管理。

    Ansible工作過程:

    1、加載自己的配置文件/etc/ansbile/ansbile.cfg
    2、加載自己對應的模塊文件,如command
    3、通過ansbile模塊或命令生成對用的臨時py文件,並將該文件傳輸至遠程服務器的對應用戶$HOME/.ansbile/tmp/ansible-tmp-數字/xxx.py文件
    4、給文件+x執行
    5、執行並返回結果
    6、刪除臨時py文件,sleep 0退出
    Ansible基礎入門1

    執行狀態:

  • 綠色:執行成功並且不需要做改變的操作
  • yellow色:執行成功並且對目標主機做變更
  • 紅色:執行失敗

    Ansbile主要組成部分:

  • Ansbile playbooks:任務劇本(任務集),編排定義ansible任務集的配置文件,由ansbile順序依次執行,通常是JSON格式的文件。
  • Inventory:ansible管理主機的清單/etc/ansbile/hosts
  • Modules:ansbile執行命令的功能模塊,多數爲內置核心模塊,也可自定義
  • Plugins:模塊功能的補充,如連接類型插件、循環插件、變量插件、過濾插件等,該功能不常用
  • Api:供第三方程序條用的應用程序編程接口
  • Ansbile:組合inventory、api、modules、plugins的綠框,可以理解爲是ansbile命令工具,其爲核心執行工具

    注意事項:

  • 執行ansible的主機一般稱爲主控端、中控、master或堡壘機
  • 主控端python版本需要2.6或以上
  • 被控端python版本小於2.4需要安裝python-simplejson
  • 被控端如開啓SElinux需要安裝libselinux-python
  • Windows不能作爲主控端

    Ansible的安裝

    rpm包安裝:EPEL源
    yum install ansible
    Git方式:
    Git clone git://github.com/ansible/ansbile.git --recursive
    cd ./ansbile
    source ./hacking/env-setup
    還有編譯安裝、pip安裝這裏就不寫了。

    本次安裝採用yum安裝epel源

  • 主控端:ansible 192.168.32.104
  • 被控端:node-1 192.168.32.105
  • node-2 192.168.32.106

    在主控端ansible節點安裝ansbile

    [root@ansible ~]# yum install -y ansible
    看下ansbile詳細信息
    [root@ansible ~]# yum info ansible
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
    * base: mirrors.aliyun.com
    * extras: mirrors.aliyun.com
    * updates: mirrors.aliyun.com
    Installed Packages
    Name        : ansible
    Arch        : noarch
    Version     : 2.4.2.0 //本次安裝的是2.4版本
    Release     : 2.el7
    Size        : 38 M
    Repo        : installed
    From repo   : extras
    Summary     : SSH-based configuration management, deployment, and task execution system
    URL         : http://ansible.com
    License     : GPLv3+
    Description : 
            : Ansible is a radically simple model-driven configuration management,
            : multi-node deployment, and remote task execution system. Ansible works
            : over SSH and does not require any software or daemons to be installed
            : on remote nodes. Extension modules can be written in any language and
            : are transferred to managed machines automatically.

    Ansbile相關文件:

    配置文件:

  • /etc/ansible/ansible.cfg 主配置文件,配置ansbile工作特性
  • /etc/ansbile/hosts 主機清單
  • /etc/ansbile/roles 存放角色的目錄
  • 程序:
  • /usr/bin/ansbile 主程序,臨時命令執行工具
  • /usr/bin/ansbile-doc 查看配置文檔,模塊功能查看工具
  • /usr/bin/ansbile-galaxy 下載/上傳代碼或role模塊的官網平臺
  • /usr/bin/ansbile-playbook 定製自動化任務,編排劇本工具/usr/bin/ansbile-pull遠程執行命令的工具
  • /usr/bin/ansbile-vault 文件加密工具
  • /usr/bin/ansbile-console 基於Console界面與用戶交互的執行工具

    主機清單inventory:

    inventory主機清單:

  • ansbile的主要功能用在於批量主機操作,爲了便攜地使用其中的部分主機,可以在inventory file中將其分組命名。
  • 默認的inventory file爲/etc/ansbile/hosts
  • Inventory file也可以有多個,且也可以通過dynamic inventory來動態生成

    演示被控端主機是否存活:

    要使用ansbile中的ping模塊,這裏的ping不是windows中的ping命令,只是同名而已,如果被控主機存活則回覆pong。
    Ansible基礎入門1

    警報信息:主機清單列表是空的,只有本機可用
    本機可用那就用本機測試一下看看

    Ansible基礎入門1

    還是有警報信息:忽略本機
    所以要去配置主機清單文件
    [root@ansible ~]# vim /etc/ansible/hosts
    光標跳到最下面添加要加入主機清單的主機
    192.168.32.105
    192.168.32.106
    保存退出,然後在執行一次ping模塊命令看看行不行

    Ansible基礎入門1

    看到這個就可以確定連接插件走的是SSH協議

    Ansible基礎入門1

    報錯:不可到達目標主機,因爲沒有基於Key的驗證,所以不能隨便連接其他主機
    如果不做基於Key的驗證就要在命令後面加上-k(輸入對應的用戶名指令)

    Ansible基礎入門1

    這裏的口令是被控端主機的口令

    Ansible基礎入門1

    輸入正確口令後,被控主機存活就會回覆一個pong
    默認情況下ssh登錄比較慢,如果有需要可以修改ssh配置文件
    [root@ansible ~]# vim /etc/ssh/sshd_config
    將UseDNS yes
    改成no
    GSSAPIAuthentication yes
    也改成no
    這裏是給一個主機測試存活,如果是多個主機那麼該輸入誰的口令(口令不一樣)?

    Ansible基礎入門1

    在這裏輸入的是node-1主機的口令,所以只能測試node-1主機不能去測試node-2主機
    而且發送的順序也不一樣,命令中是105在前106在後,而回覆信息中是先發送的106最後是105。所以輸口令這種方式只能適合所有主機一樣的口令,那麼主機口令不一樣就要基於Key的驗證來實現。
    接着上面的繼續做,如果把node-2主機的口令修改成和node-1的口令一樣,那麼會成功嗎?

    Ansible基礎入門1

    可以看到node-2還是錯的,口令明明都一樣了爲什麼還是錯的呢?
    這是因爲known_hosts文件只記住了第一次成功的主機口令

    Ansible基礎入門1

    可以看到這裏沒有node-2的口令
    那用ssh直接連接node-2呢?會不會成功?

    Ansible基礎入門1

    可以連,然後在用ping模塊試一下呢?

    Ansible基礎入門1

    這回成功了。爲什麼呢?
    因爲上次失敗了就記住了這臺主機是不可信的,所以在此用ansbile連接的時候還是報錯不會再讓你連接。所以只能手工ssh協議連接node-2讓known_hosts文件記住node-2的正確口令

    Ansible基礎入門1

    所以最好的解決辦法就是做基於key的驗證,到後面在做這一步。
    如果想把所有的主機都控制,可以把主機IP地址改成all,all代表主機清單中的所有主機

    Ansible基礎入門1

    主機清單inventory:

  • /etc/ansbile/hosts文件格式
  • Inventory文件遵循INI文件風格,中括號中的字符爲組名。可以將同一個主機同時歸併到多個不同的組中;此外,當如若目標主機使用非默認的SSH端口,還可以在主機名稱之後使用冒號加端口號來證明
  • [websrvs] //分組的名稱 websrvs代表node-1這臺主機
  • 192.168.32.105
  • [dbsrvs] //dbsrvs代表node-2這臺主機
  • 192.168.32.106
  • [appsrvs]
  • 192.168.32.10[5:6] //這種就是代表105到106 多臺同組主機可以這樣使用
  • 這樣就可以實現分組控制
    Ansible基礎入門1

    ansible配置文件:

    Ansible配置文件/etc/ansible/ansible.cfg(一般保持默認)
    [defaults]

some basic default values...

#inventory = /etc/ansible/hosts #主機清單配置文件
#library = /usr/share/my_modules/ #庫文件存放目錄
#remote_tmp = ~/.ansible/tmp #臨時py命令文件存放在遠程主機目錄
#local_tmp = ~/.ansible/tmp #本機的臨時命令執行目錄
#forks = 5 #默認併發數
#sudo_user = root #默認sudo用戶
#ask_sudo_pass = True #每次執行ansbile命令是否詢問ssh密碼
#ask_pass = True
#remote_port = 22 #遠程主機端口號
#host_key_checking = False #檢查對應服務器的host_key,建議取消註釋
#log_path = /var/log/ansible.log #日誌文件

Ansbile修改配置文件不需要重啓服務生效。

Ansbile系列命令:

ansbile ansbile-doc ansbile-playbook ansbile-vault ansbile-console ansbile-galaxy ansbile-pull
ansbile-doc:顯示模塊幫助
ansbile-doc [options] [module]
-a          顯示所有模塊的文檔
-l,--list       列出可用模塊
-s,--snippet    顯示指定模塊playbook片段

示例:

ansbile-doc -l 列出所有模塊
ansbile-doc ping 查看指定模塊的幫助方法
ansbile-doc -s ping   查看指定模塊的幫助方法
可以看下ansbile現在一共有多少個模塊
[root@ansible ~]# ansible-doc -l | wc -l
1378
目前所用的版本一共有1378個模塊,如果使用最新版本的話還會更多。

Ansbile命令參數詳解:

Ansbile <host-parttern>主機清單 [-m module_name]模塊名字 [-a args]模塊參數
--version 顯示版本
-m module 指定模塊,默認爲command一般不寫
-v 詳細過程-vv -vvv更詳細
--list-hosts 顯示主機列表,可簡寫-list
-k,--ask-pass 提示輸入ssh連接密碼,默認key驗證
-K,--ask-become-pass 提示輸入sudo時的口令
-C,--check 檢查,並不執行
-T,--timeout=TIMEOUT 執行命令的超時時間,默認10s
-u,--user=REMOTE_USER 執行遠程執行的用戶
-b,--become 代替舊版的sudo切換

實例:列出全部的主機列表、websrcs和dbsrcs組的主機列表

Ansible基礎入門1

[root@ansible ~]# ansible websrvs -m ping -u test -k
以test用戶進行遠程連接
以test用戶遠程連接去查看/root目錄,因爲test沒有權限所以報錯了,那就要用到sudo

Ansible基礎入門1

[root@ansible ~]# ansible websrvs -a 'ls /root' -u test -k -b -K
這裏要輸入test的口令和sudo root的口令
![](https://s1.51cto.com/images/blog/201909/19/71f00e6afbe996a0eac92eb4d2a12a43.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
報錯:因爲在105主機上沒有做過sudo授權
下面進行sudo授權
[root@node-1 ~]# visudo 
#%wheel  ALL=(ALL)       ALL
將註釋去掉
[root@node-1 ~]# usermod -aG wheel test
將test加到組
做完授權之後再試一次
![](https://s1.51cto.com/images/blog/201909/19/90ac6a685e62143eb21d9dac6577f705.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
成功執行。
如果sudo時不想輸入口令
#%wheel  ALL=(ALL)       ALL
%wheel ALL=(ALL)       NOPASSWD: ALL
上面的加上註釋,下面的去掉註釋
![](https://s1.51cto.com/images/blog/201909/19/2a38cf4c1232c7f93d071e6107bea045.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
這時候把-K去掉就可以不用輸入sudo口令也可以成功執行
開始做基於Key的驗證
![](https://s1.51cto.com/images/blog/201909/19/08ce26b384cc53717a68533aa4d9b368.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
![](https://s1.51cto.com/images/blog/201909/19/2cf8312fbf3d13c9bcaa0c25a1c80b96.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
這樣就做完了,下面再用ansbile命令就不用再加-k了
![](https://s1.51cto.com/images/blog/201909/19/f9f50a2e172d1fe236a212f827fe1cfb.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

Ansbile的Host-pattern:

匹配主機的列表:

All:表示所有主機清單中的所有主機
ansbile all -m ping
*:通配符
ansible “*” -m ping
ansbile 192.168.32.* -m ping
ansbile “*srvs” -m ping
或關係:
ansible “websrvs:appsrvs” -m ping
ansbile “192.168.32.105:192.168.32.106” -m ping
邏輯與:
ansbile “websrvs:&dbsrvs” -m ping
在websrvs組並且在dbsrvs組中的主機
邏輯非:
ansbile ‘websrvs:!dbsrvs’ -m ping
在websrvs組,但不在dbsrvs組中的主機
注意:此處爲單引號
綜合邏輯:
ansbile ‘websrvs:dbsrvs:&appsrvs:!ftpsvs’ -m ping
正則表達式:
ansbile “websrvs:&dbsrvs” -m ping
ansbile “~(web|db)srv” -m ping  

Ansbile常用模塊:

* Command:在遠程主機執行命令,默認模塊
* 此命令不支持$VARNAME < > | ; & 等,用shell模塊實現
* Shell:和command相似,commadn可以用的shell可以用,command不可以用shell也可以用
* Scrpit:運行腳本
* Ansbile websrvs -m script -a f1.sh
* Copy:從服務器複製文件到客戶端
* ansible all -m copy -a ‘content=’test contenet\n’ dest=/tmp/f1.txt’ 利用內容,直接生成目標文件
* ansbile all -m copy -a ‘src=/root/f1.sh dest=/tmp/f2.sh owner=test mode=500 backup=yes’
* 如果目標存在,默認覆蓋,此處指定先備份backup=yes
* Fetch:從客戶端讀取文件到服務器端,與copy相反,因爲只能讀取單個文件,如果是多個文件或目錄的話,需要先tar打包一下在讀取到服務器端。
* File:設置文件屬性
* ansible all -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’
* ansible all -m file -a “path=/root/a.sh owner-test mode=755”

實例:修改selinux狀態:

Ansible基礎入門1

這裏要修改node-1節點的selinux狀態
先在ansbile節點修改selinux配置文件
SELINUX=disable
[root@ansible ~]# cp /etc/selinux/config .
將配置文件copy到 根目錄
然後用ansbile的copy模塊將config配置文件copy到被控主機
![](https://s1.51cto.com/images/blog/201909/19/606f9463dcd18b86fdb9c26fb7869655.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
因爲106節點上我已經配置過selinux爲disable了所有這裏顯示爲綠色,而105節點沒有修改過config所有這次是yellow色代表修改了配置文件。
然後查看一下有沒有修改成功
![](https://s1.51cto.com/images/blog/201909/19/d36f381f84841922fe420b9fc876d25a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
ansible all -m shell -a ‘reboot’ 重啓主機
在執行重啓命令後是紅色的信息,但其實主機已經在重啓了,所有這個算是ansbile的一個bug吧。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章