Ansible入門基礎

常用自動化運維工具
Ansible:python,Agentless,中小型應用環境 基於Python開發出來工具
Saltstack:python,一般需部署agent,執行效率更高
Puppet:ruby, 功能強大,配置複雜,重型,適合大型環境
Fabric:python,agentless
Chef: ruby,國內應用少
Cfengine
func

Ansible發展史
Ansible
創始人,Michael DeHaan( Cobbler 與 Func 的作者)
2012-03-09,發佈0.0.1版,紅帽收購
2015-10-17,Red Hat宣佈收購
同類自動化工具GitHub關注程度(2016-07-10)

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

Ansible主要組成部分
ANSIBLE PLAYBOOKS:任務劇本(任務集),編排定義Ansible任務集的配置文件,由Ansible順序依次執行,通常是JSON格式的YML文件
INVENTORY:Ansible管理主機的清單/etc/anaible/hosts
MODULES:Ansible執行命令的功能模塊,多數爲內置核心模塊,也可自定義
PLUGINS:模塊功能的補充,如連接類型插件、循環插件、變量插件、過濾插件等,該功能不常用
API:供第三方程序調用的應用程序編程接口
ANSIBLE:組合INVENTORY、API、MODULES、PLUGINS的綠框,可以理解爲是ansible命令工具,其爲核心執行工具
Ansible命令執行來源:
USER,普通用戶,即SYSTEM ADMINISTRATOR
CMDB(配置管理數據庫) API 調用
PUBLIC/PRIVATE CLOUD API調用
USER-> Ansible Playbook -> Ansibile
利用ansible實現管理的方式:
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不能做爲主控端

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

/etc/ansible/hosts文件格式
inventory文件遵循INI文件風格,中括號中的字符爲組名。可以將同一個主機同時歸併到多個不同的組中;此外,當如若目標主機使用了非默認的SSH端口,還可以在主機名稱之後使用冒號加端口號來標明
    ntp.magedu.com
    [webservers]
    www1.magedu.com:2222
    www2.magedu.com
    [dbservers]
    db1.magedu.com
    db2.magedu.com
    db3.magedu.com   

安裝:
ansible官方網站:www.ansible.com 已被紅帽收購

rpm包安裝:EPLE源
    yum install ansible
編譯安裝:
    yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
    tar xf ansible-1.5.4.tar.gz
    cd ansible-1.5.4
    python setup.py build
    python setup.py install
    mkdir /etc/ansible
    cp -r examples/* /etc/ansible
Git方式:
    git clone git://github.com/ansible/ansible.git --recursive
    cd ./ansible
    source ./hacking/env-setup
pip安裝: pip是安裝Python包的管理器,類似yum
    yum install python-pip python-devel
    yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
    pip install --upgrade pip
    pip install ansible --upgrade
確認安裝: ansible --version

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

如果主機名稱遵循相似的命名模式,還可以使用列表的方式標識各主機
示例:
    [websrvs]
    www[01:100].example.com

    [dbsrvs]
    db-[a:f].example.com

ansible 配置文件
Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默認)
[defaults]
#inventory = /etc/ansible/hosts # 主機列表配置文件
#library = /usr/share/my_modules/ # 庫文件存放目錄
#remote_tmp = $HOME/.ansible/tmp #臨時py命令文件存放在遠程主機目錄
#local_tmp = $HOME/.ansible/tmp # 本機的臨時命令執行目錄
#forks = 5 # 默認併發數
#sudo_user = root # 默認sudo 用戶
#ask_sudo_pass = True #每次執行ansible命令是否詢問ssh密碼
#ask_pass = True
#remote_port = 22
#host_key_checking = False # 檢查對應服務器的host_key,建議取消註釋
#log_path=/var/log/ansible.log #日誌文件

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

實例:五臺主機:一臺主機安裝ansible控制其他四臺主機:
一主機:安裝ansible:
yum -y install ansible

安裝完之後添加清單控制其他四臺機器:
    vim /etc/ansible/hosts
        172.20.102.70
        172.20.102.71
        172.20.113.166
        172.20.113.167
    添加其他主機的IP地址

可以將其分組控制:
    vim /etc/ansible/hosts
        [Webservers]
        172.20.102.70
        172.20.102.71

        [mariaservers]
        172.20.113.166
        172.20.113.167

        [ddservers]
        172.20.102.7[0:1]   是172.20.102.70和172.20.102.71兩臺機器
        172.20.113.167
注意:以爲ansible是基於ssh:22端口服務用來控制其他主機的,如果端口改變可直接在主機ip地址後面跟上端口號即可 如:192.168.1.1:2222

測試ping一下主機:
    ansible all -m ping -k  是ping一下所有主機
        all:是ping添加到清單中的所有主機
        -m ping:是基於ssh協議22端口測試一下主機
        -k 訪問時添加密碼
測試ddservers組中的主機    
    ansible ddservers -m ping -k
        SSH password: 
        172.20.113.167 | SUCCESS => {
            "changed": false, 
            "ping": "pong"
        }
        172.20.102.70 | SUCCESS => {
            "changed": false, 
            "ping": "pong"
        }
        172.20.102.71 | SUCCESS => {
            "changed": false, 
            "ping": "pong"
        }
注意:有事會出現錯誤無法ping通無法連接到指定的主機時和不小心輸錯密碼時一下用ansible連接時會報錯解決方法如下:
    1、查看cat .ssh/known_hosts 是否有想要連接的主機,有將其rm -rf
    2、cat .ssh/known_hosts之後仍然無法使用時 用在安裝主機控制其他主機的機器用ssh服務登錄此機器之後exit退出後可訪問
    3、可直接改配置文件將:默認是不啓用的 將#去掉即可:
        vim /etc/ansible/ansible.cfg
            host_key_checking = False 

        rm -rf .ssh/known_hosts 刪除

啓用日誌功能:
    vim /etc/ansible/ansible.conf
        log_path = /var/log/ansible.log

問題:ansible的是怎麼控制其他的機器:
    首先在執行命令時它會轉化成一個Python腳本放蕩當前目錄的/ansible/tmp目錄下。無需自己創建它會自動生成是.ansible隱藏目錄下,會複製到被控制機器的.ansible隱藏目錄下,它會自動刪除的,是臨時創建的

幫助:
    ansible-dos -l

示例:
    ansible-doc –l 列出所有模塊
    ansible-doc ping 查看指定模塊幫助用法
    ansible-doc –s ping 查看指定模塊幫助用法

ansible選項:
ansible通過ssh實現配置管理、應用部署、任務執行等功能,建議配置ansible端能基於密鑰認證的方式聯繫各被管理節點
ansible <host-pattern> [-m module_name] [-a args]
-a:指定的參數 跟命令
--version 顯示版本
-m module 指定模塊,默認爲command
-v 詳細過程 –vv -vvv更詳細
--list-hosts 顯示主機列表,可簡寫—list 查看所控制的機器
-k, --ask-pass 提示輸入ssh連接密碼,控制機器的root密碼
-K, --ask-become-pass 提示輸入sudo時的口令
-C, --check 檢查,並不執行
-T, --timeout=TIMEOUT 執行命令的超時時間,默認10s
-u, --user=REMOTE_USER 執行遠程執行的用戶
-b, --become 代替舊版的sudo 切換

ansible的Host-pattern
ansible的Host-pattern
匹配主機的列表
All :表示所有Inventory中的所有主機
ansible all –m ping

  • :通配符
    ansible “” -m ping
    ansible 192.168.1.
    -m ping
    ansible “srvs” -m ping
    或關係
    ansible “websrvs:appsrvs” -m ping
    ansible “192.168.1.10:192.168.1.20” -m ping
    邏輯與
    ansible “websrvs:&dbsrvs” –m ping
    在websrvs組並且在dbsrvs組中的主機
    邏輯非
    ansible ‘websrvs:!dbsrvs’ –m ping
    在websrvs組,但不在dbsrvs組中的主機
    注意:此處爲單引號
    綜合邏輯
    ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping
    正則表達式
    ansible “websrvs:&dbsrvs” –m ping
    ansible “~(web|db).
    .magedu.com” –m ping

ansible命令執行過程
ansible命令執行過程

  1. 加載自己的配置文件 默認/etc/ansible/ansible.cfg
  2. 加載自己對應的模塊文件,如command
  3. 通過ansible將模塊或命令生成對應的臨時py文件,並將該 文件傳輸至遠程服務器的對應執行用戶$HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY文件
  4. 給文件+x執行
  5. 執行並返回結果
  6. 刪除臨時py文件,sleep 0退出
    執行狀態:
    綠色:執行成功並且不需要做改變的操作
    ×××:執行成功並且對目標主機做變更
    紅色:執行失敗

問題:用ansible如何查看webservers組中機器的/etc/fstab文件如實現:
ansible webservers -u root -k -m command -a 'cat /etc/fstab'

ansible實現無需密碼登錄的方式管理機器:
    ssh-keyge   建議加一個祕鑰
    ssh-copy-id 172.20.xxx.xxx  跟上ip地址後輸入密碼之後 可實現無需密碼登錄
ansible all -m ping 即可

ansible使用示例

以wang用戶執行ping存活檢測
    ansible all -m ping -u wang -k
以wang sudo至root執行ping存活檢測
    ansible all -m ping -u wang –b -k
以wang sudo至mage用戶執行ping存活檢測
    ansible all -m ping -u wang –b -k --become-user mage
以wang sudo至root用戶執行ls
    ansible all -m command -u wang --become-user=root -a 'ls /root' -b –k -K

ansible常用模塊
Command:在遠程主機執行命令,默認模塊,可忽略-m選項
ansible srvs -m command -a ‘service vsftpd start’
ansible srvs -m command -a ‘echo magedu |passwd --stdin wang’ 不成功
此命令不支持 $VARNAME < > | ; & 等,用shell模塊實現

Shell:和command相似,用shell執行命令
ansible srv -m shell -a ‘echo magedu |passwd –stdin wang’
調用bash執行命令 類似 cat /tmp/stanley.md | awk -F‘|’ ‘{print $1,$2}’ &> /tmp/example.txt 這些複雜命令,即使使用shell也可能會失敗,解決辦法:寫到腳本時,copy到遠程,執行,再把需要的結果拉回執行命令的機器

測試在控制的所有主機中創建/data/ff文件:
ansible all -m shell -a 'mkdir /data/ff'
也可以查看文件等:
ansible all -a 'cat /etc/passwd'
也可以刪除文件等:
ansible all -m shell -a 'rm -rf /data/*' 可使用file模塊

Script:運行腳本
    -a "/PATH/TO/SCRIPT_FILE“
    snsible websrvs -m script -a f1.sh

測試:在所有主機執行/data/haha.sh這個腳本???
vim /data/haha.sh
echo "Hello word"

chmod +x /data/haha.sh

ansible all -m script -a '/data/haha.sh'

Copy:從服務器複製文件到客戶端,
    ansible srv -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes”
    如目標存在,默認覆蓋,此處指定先備份
    ansible srv -m copy -a “content=‘test content\n’ dest=/tmp/f1.txt” 利用內容,直接生成目標文件

問題:將所有主機selinux全部關閉:
vim /etc/sysconfig/selinux
SELINUX=disabled

cp /etc/sysconfig/selinux /data 
ansible all -a 'getenforce'    先查看seliunux是否啓動
ansible all -m copy -a 'src=/data/selinux dest=/etc/selinux/config backup=yes'
    src:傳送的起始的文件當前所在地
    dest:傳送的文件目標
    backup=yes:是否備份

ansibel all -a 'reboot' 重啓生效

ansible all -a 'getenforce'     查看是否更改
    172.20.102.70 | SUCCESS | rc=0 >>
    Disabled
    172.20.113.166 | SUCCESS | rc=0 >>
    Disabled
    172.20.113.167 | SUCCESS | rc=0 >>
    Disabled
    172.20.102.71 | SUCCESS | rc=0 >>
    Disabled

問題:將所有主機/etc/shadow複製到/data文件下將屬性改成000 所有者改成chen:
ansible all -m copy -a 'src=/etc/shadow dest=/data mode=000 owner=chen'
mode=000:修改權限
owner=chen:修改屬主

ansible all -a 'ls -l /data'

Fetch:從客戶端取文件至服務器端,copy相反,目錄可先tar
    ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts’

問題:如何將所有主機的日誌文件抓過來到/data下:
ansible all -m fetch -a 'scr=/var/log/messages dest=/data'

File:設置文件屬性
    ansible srv -m file -a "path=/root/a.sh owner=wang mode=755“
    ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link

問題:在/data/下創建新的文件:
ansible all -m file -a 'name=/data/gg state=touch'
或者比較的簡單的方式:
ansible all -a 'mkdir /data/gg'

創建一個軟連接/etc/fstab到/data目錄下:
ansible all -m file -a 'src=/etc/fstab dest=/data/fstab.link stest=link'

那麼如何刪除軟連接:
ansible all -m file -a 'dest=/data/fstab.link state=absent'

Hostname:管理主機名
    ansible node1 -m hostname -a “name=websrv”

問題:將172.20.113.168的機器名字改成note1:
ansible 172.20.113.168 -m hostname -a 'name=note1'

注意:改機器名字是直接寫入配置文件中的
    centos7:/etc/hostname
    centos6:/etc/sysconfig/network

Cron:計劃任務
支持時間:minute,hour,day,month,weekday
    ansible srv -m cron -a “minute=*/5 job=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null’ name=Synctime” 創建任務
    ansible srv -m cron -a ‘state=absent name=Synctime’ 刪除任務

問題:讓所有機器報警:
ansible all -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/wall FBI" name=FBI'
刪除計劃任務:
ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI" name=FBI

Yum:管理包
    ansible srv -m yum -a ‘name=httpd state=latest’ 安裝
    ansible srv -m yum -a ‘name=httpd state=absent’ 刪除

問題:給所有主機安裝vsftpd:
ansible all -m yum -a 'name=vsftpd'
把vsftpd全部卸載:
ansible all -m yum -a 'name=vsftpd state=removed'
驗證:是否取消安裝
ansible all -m shell -a 'rpm -q vsftpd'

Service:管理服務
    ansible srv -m service -a 'name=httpd state=stopped'
    ansible srv -m service -a 'name=httpd state=started'
    ansible srv –m service –a ‘name=httpd state=reloaded’
    ansible srv -m service -a 'name=httpd state=restarted'

問題:將所有vsftpd服務啓用:
ansible all -m service -a 'name=vsftpd state=started enabled=yes'

User:管理用戶
    ansible srv -m user -a 'name=user1 comment=“test user” uid=2048 home=/app/user1 group=root‘
    ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1 ’
    ansible srv -m user -a ‘name=user1 state=absent remove=yes‘ 刪除用戶及家目錄等數據

問題:在所有主機創建一個用戶ss,並指定shell爲/sbin/nologin
ansible all -m user -a 'name=ss shell=/sbin/nologin system=yes
驗證:
ansible all -a 'getent passwd ss'
那麼又如何刪除用戶呢:
ansible all -m user -a 'name=ss state=absent remove=yes'

Group:管理組
    ansible srv -m group -a "name=testgroup system=yes“
    ansible srv -m group -a "name=testgroup state=absent

問題:創建一個gg的組:
ansible all -m group -a 'name=gg system=yes gid=80'
驗證:
ansible all -a 'getent group gg'

ansible系列命令
ansible-galaxy
連接 https://galaxy.ansible.com 下載相應的roles
列出所有已安裝的galaxy
ansible-galaxy list
安裝galaxy
ansible-galaxy install geerlingguy.redis
刪除galaxy
ansible-galaxy remove geerlingguy.redis
也可在創建一個:
cd .ansible/roles
cp -rp geerlingguy.nginx/chen.nginx
ansible-galaxy list

ansible-pull
    推送命令至遠程,效率無限提升,對運維要求較高
Ansible-playbook
    ansible-playbook hello.yml

    cat hello.yml
     #hello world yml file
      - hosts: websrvs
       remote_user: root
        tasks:
         - name: hello world
          command: /usr/bin/wall hello world

實例:
vim ansible/play.yml

- hosts: mariadbservers
  remote_user: root             
  #運行的用戶

  tasks:
    - name: play
      command: hostname
ansible-playbook play.yml

Ansible-vault
    功能:管理加密解密yml文件
    ansible-vault [create|decrypt|edit|encrypt|rekey|view]
    ansible-vault encrypt hello.yml 加密
    ansible-vault decrypt hello.yml 解密
    ansible-vault view hello.yml 查看
    ansible-vault edit hello.yml 編輯加密文件
    ansible-vault rekey hello.yml 修改口令
    ansible-vault create new.yml 創建新文件

問題:那麼如何給ansible/play.yml文件加密呢:
ansible-vault encrypt play.yml
解密爲:
ansible-vault decrypt play.yml

Ansible-console:2.0+新增,可交互執行命令,支持tab
    root@test (2)[f:10] $
執行用戶@當前操作的主機組 (當前組的主機數量)[f:併發數]$
    設置併發數: forks n 例如: forks 10
    切換組: cd 主機組 例如: cd web
    列出當前組主機列表: list
    列出所有的內置命令: ?或help
示例:
    root@all (2)[f:5]$ list
    root@all (2)[f:5]$ cd appsrvs
    root@appsrvs (2)[f:5]$ list
    root@appsrvs (2)[f:5]$ yum name=httpd state=present
    root@appsrvs (2)[f:5]$ service name=httpd state=started
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章