1. 程式人生 > >大型架構及配置技術之Ansible

大型架構及配置技術之Ansible

定義變量 ret replace man ssh端口 語法 字符 ifcfg-eth 運行

大型架構及配置技術之Ansible

一、ansible簡介

1、什麽是ansible ?

Ansible是2013年推出的一款IT自動化和DevOps軟件,目前由Redhat已簽署Ansible收購協議。其是基於Python研發,糅合了很多老運維工具的優點實現了批量操作系統配置,批量程序的部署,批量運行命令等功能。
2、ansible可以實現:
1)自動化部署APP
2)自動化管理配置項
3)自動化的持續交付
4)自動化的(AWS)雲服務管理
3、為什麽要選擇ansible?

1)活躍度(社區活躍度)
2)學習成本
3)使用成本
4)編碼語言
5)性能
6)使用是否廣泛

ansible優點:
1)僅需ssh和python即可使用

2)無需客戶端
ansible缺點:
對於幾千臺、上萬臺機器的操作,還不清楚性能、效率情況如何,需要進一步了解。
4、ansible特性
1)模塊化設計,調用特定的模塊來完成特定任務
2)基於python語言實現
paramiko
PyYAML (半結構化語言)
jinja2
3)其模塊支持JSON等標準輸出格式,可采用任何編程語言重寫
4)部署簡單
5)主從模式工作
6)支持自定義模塊
7)支持playbook
8)易於使用
9)支持多層部署
10)支持異構IT環境

二、ansible安裝

機器準備:
1:ansible 192.168.1.10 管理機器
2:web1 192.168.1.11 托管機器

3:web2 192.168.1.12 托管機器
4:db1 192.168.1.21 托管機器
5:db2 192.168.1.22 托管機器
6:cache 192.168.1.33 托管機器

管理機器:
要求python2.6或python2.7
需要安裝ansible使用模塊:
paramiko
PyYAML
Jinja2
httplib2
six
托管機器:
Ansible默認通過 SSH 協議管理機器
被管理主機要開吭 ssh 服務,允許 ansible 主機登彔
在托管節點上也需要安裝 Python 2.5 或以上的版本

如果托管節點上開啟了SElinux,需要安裝libselinux-python

1、在ansible管理機器上配置yum源
2、安裝ansible
]#yum -y install ansible
3、安裝完成查看版本信息
]#ansible –version

三、主機管理

ansible 的配置文件是 ansible.cfg
ansible.cfg 的查找順序是

1  ANSIBLE_CONFIG 變量定義的配置文件
2 當前目錄下的 ./ansible.cfg 文件
3 前用戶家目錄下 ~/ansible.cfg 文件
4 /etc/ansible/ansible.cfg 文件
ansible.cfg 中 inventony 指定主機分組文件的路徑和地址,默認分組文件 hosts

1、主機定義於與分組管理——編輯/etc/ansible/hosts文件

1.1、格式:

[組名稱]
主機名稱或ip地址, 登陸用戶名,密碼、端口等信息

1.2、測試:

ansible [組名稱] --list-hosts

2、主機定義與分組——inventory 參數說明

1)ansible_ssh_host

將要連接的進程主機名與你想要設定的主機的別名不同的話,可通過此變量設置。

2)ansible_ssh_port

ssh端口號,如果不是默認的端口號,通過此變量設置。

3)ansible_ssh_user

默認的 ssh 用戶名

4)ansible_ssh_pass

ssh 密碼(這種方式並不安全,我們強烈建議使用 --ask-pass 或 SSH 密鑰)

5)ansible_sudo_pass

sudo 密碼(建議使用 --ask-sudo-pass)

6 ) ansible_sudo_exe (new in version 1.8)

sudo 命令路徑(適用亍1.8及以上版本)

7)ansible_connection

不主機的連接類型.比如:local, ssh 或者 paramiko。Ansible 1.2 以前默認使用 paramiko.1.2 以後默認使用 ‘smart‘,‘smart‘ 方式會根據是否支持ControlPersist, 來判斷‘ssh‘ 方式是否可行。

8)ansible_ssh_private_key_file

ssh 使用的私鑰文件,適用亍有多個密鑰,而你不想使用SSH 代理的情況

9)ansible_shell_type

目標系統的shell類型.默認情況下,命令的執行使用 ‘sh‘語法,可設置為 ‘csh‘ 或 ‘fish‘。

10)ansible_python_interpreter

目標主機的 python 路徑.適用於的情況: 系統中有多個Python, 或者命令路徑不是"/usr/bin/python”
[web]
web[1:2]
[db]
db1
db2
[app:children]  # 指定子組
web
db
[app:vars]
ansible_ssh_user="root"
ansible_ssh_pass="123456"
[other]
cache           ansible_ssh_user="root" ansible_ssh_pass="123456"

3、動態主機

ansible 的inventony 文件可以是靜態也可以是腳本(輸出格式 json)
修改ansible.cfg
]#mkdir /var/myansible
]#cd /var/myansible
]#vim ansible.cfg

[defaults]
inventory      = urscript

編寫usrscript腳本

#!/bin/bash
echo ‘
{
    "web"   : ["web1", "web2"],
    "db"    : ["db1", "db2"],
    "other" : ["cache"]
}‘

四、批量執行

1、ansible命令基礎

ansible 主機分組 -m 模塊 -a ‘命令和參數‘
– host-pattern 主機戒定義的分組
– -M 指定模塊路徑
– -m 使用模塊,默認 command 模塊
– -a or --args 模塊參數
– -i inventory 文件路徑,或可執行腳本
– -k 使用交互式登錄密碼
– -e 定義變量
– -v 詳細信息,-vvvv 開啟 debug 模式

2、列出要執行的主機,不執行任何操作

]#ansible all –list-hosts

3、批量檢測主機

]#ansible all -m ping 

4、批量執行命令

]#ansible all -m command -a ‘id‘ -k

5、給所有主機部署密鑰

]#ansible all -m authorized_key -a "user=root exclusive=true manage_dir=true key=‘$(< /root/.ssh/id_rsa.pub)‘" -k

註意:
報錯:"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."
解決方法:

修改ansible.cfg
host_key_checking = False

五、模塊

1) ansible-doc

    模塊的手冊,相當於shell的man
    ansible-doc -l  //列出所有模塊
    ansible-doc  模塊名        //查看幫助

2) ping模塊

    測試網絡連通性,ping模塊沒有參數(測試ssh的連通性)

3) command模塊

    默認模塊,遠程執行命令沒有啟用 shell ,所有shell 相關特性命令無法使用,例如 < > | &
    raw    模塊,沒有 chdir create remove 等參數,能執行大部分操作
    shell  模塊,啟動 /bin/sh 運行命令,可以執行所有操作
    用法:ansible 主機分組 -m command -a ‘命令和參數‘
    測試:
    ansible cache -m command -a ‘chdir=/tmp touch f1‘   創建成功
    ansible cache -m shell -a ‘chdir=/tmp touch f2‘             創建成功
    ansible cache -m raw -a ‘chdir=/tmp touch f3‘               文件可以創建,但無法切換目錄,文件在用戶家目錄下生成。

4) shell | raw 模塊

    shell 模塊用法基本和command一樣,區別是 shell模塊是通過/bin/sh迚行執行命令,可以執行任意命令
    raw模塊,用法和shell 模塊一樣 ,可以執行任意命令
    區別是 raw 沒有chdir、creates、removes參數

5) script模塊

    處理復雜操作,編寫腳本
    測試:
    #!/bin/bash
    id  zhang3
    if [ $? != 0 ];then
    useradd li4
    echo 123456 |passwd --stdin li4
    fi
    ansible all -m scriopt -a "urscriopt.sh"

6) copy 模塊

復制文件到進程主機
– src:要復制到進程主機的文件在本地的地址,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它將遞歸復制。在這種情況下,如果路徑使用"/"來結尾,則只復制目錄裏的內容,如果沒有使用"/"來結尾,則包含目錄在內的整個內容全部復制,類似於rsync
– dest:必選項。進程主機的絕對路徑,如果源文件是一個目錄,那麽該路徑也必須是個目錄
– backup:在覆蓋之前將原文件備份,備份文件包含時間信息。有兩個選項:yes|no
– force:如果目標主機包含該文件,但內容不同,如果設置為yes,則強制覆蓋,如果為no,則只有當目標主機的目標位置不存在該文件時,才復制。默認為yes
    測試:
    復制文件
    ]#ansible cache -m copy -a ‘src=/root/a.log dest=/root/a.log‘
    復制目錄:
    ]#ansible cache -m copy -a ‘src=urdir  dest=/root/‘

7) lineinfile | replace 模塊

– 類似 sed 的一種行編輯替換模塊
– path 目的文件
– regexp 正則表達式
– line 替換後的結果
利用 lineinfile 修改 /etc/sysconfig/network-scriopts/ifcfg-eth0 
]#ansible cache -m lineinfile -a ‘path=/etc/sysconfig/network-scripts/ifcfg-eth0 regexp="^ONBOOT" line="ONBOOT=\"no\""

– 替換指定字符
利用 replace 修改 /etc/sysconfig/network-scriopts/ifcfg-eth0 
]#ansible cache -m replace -a ‘path=/etc/sysconfig/network-scripts/ifcfg-eth0 regexp="^(ONBOOT=).*" replace="\1\"yes\""‘

8) yum模塊

– 使用yum包管理器來管理軟件包
– config_file:yum的配置文件
– disable_gpg_check:關閉gpg_check
– disablerepo:不啟用某個源
– enablerepo:啟用某個源
– name:要進行操作的軟件包的名字,也可以傳遞一個url或者一個本地的rpm包的路徑
– state:狀態(present,absent,latest)

刪除軟件包
]#ansible cache -m yum -a ‘name=”lftp” state=”removed”‘
刪除多個軟件包
]#ansible cache -m yum -a ‘name=”lftp,lrzsz” state=”removed”‘

安裝軟件包
]#ansible cache -m yum -a ‘name=”lftp” ‘
安裝多個軟件包
]#ansible cache -m yum -a ‘name=”lftp,lrzsz” ‘

9) service 模塊

– name:必選項,服務名稱
– enabled:是否開機啟動 yes|no
– sleep:如果執行了restarted,在則stop和start之間沈睡幾秒鐘
– state:對當前服務執行啟動,停止、重啟、重新加載等操作(started,stopped,restarted,reloaded)
測試:
]#ansible cache -m service -a ‘ name=”sshd” enabled=”yes” state=”started” ‘

10) setup 模塊

– 主要用亍獲取主機信息,在playbooks裏經常會用到的一個參數gather_facts就不該模塊相關。setup模塊下經常使用的一個參數是filter參數。
– filter 可以過濾到我們需要的信息
]# ansible cache -m setup -a ‘filter="ansible_os_family"‘

練習:

安裝apache,修改apache監聽端口為8080,設置默認主頁,啟動服務,設置開機自啟。

]#ansible web -m yum -a ‘name=”httpd”‘
]#ansible web -m lineinfile -a ‘path=/etc/httpd/conf/httpd.conf  regexp=”^Listen”  line=”Listen 8080”‘
]#ansible web -m shell -a ‘echo  this is test_web > /var/www/html/index.html‘
]#ansible web -m service -a ‘name=”httpd” state=”restarted”  enabled=yes‘

大型架構及配置技術之Ansible