一、Ansible簡介
Ansible是一種agentless(基於ssh),可實現批量配置、命令執行和控制,基於Python實現的自動化運維工具。
其特性有:
①模塊化:通過調用相關模塊,完成指定任務,且支持任何語言編寫的自定義模塊
②playbook:劇本,可根據需要一次執行完劇本中的所有任務或某些任務
安裝方式:
1.yum安裝,在epel源中
2.pip安裝
首先安裝:
yum -y install python-pip python-devel
再安裝ansible:
pip install ansible
二、程序文件
/usr/bin/ansible:命令行工具
ansible命令通用格式:ansible <host-pattern> [options] [-m module_name] [-a args]
/usr/bin/ansible-doc:幫助文檔
/usr/bin/ansible-playbook:劇本執行工具
/etc/ansible/ansible.cfg:主配置文件
/etc/ansible/hosts:管理的主機清單
/etc/ansible/roles:角色存放處
三、基本配置
1.SSH基於密鑰方式登陸
本次演示以三台CentOS 7 主機,一台CentOS 6 主機進行:
其中A主機為管理端主機:192.168.1.101
B主機:192.168.1.102
C主機:192.168.1.103
D主機(CentOS 6):192.168.1.105
在A主機上創建密鑰對,實現對其他三台主機實現無密碼訪問,執行:
# ssh-keygen -t rsa -f ./.ssh/id_rsa.pub -P ""
# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.102
# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.103
# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.105
操作完畢后可實現無密碼訪問
2.A主機管理清單的配置
# cd /etc/ansible
# cp hosts{,.bak}
# vim hosts
3.簡單測試,可設置是否生效:
四、常用模塊
1.command模塊:在遠程主機上執行的命令
相關選項:
creates:一個文件名,當該文件存在,則該命令不執行
free_form:要執行的linux指令
chdir:在執行指令之前,先切換到該目錄
removes:一個文件名,當該文件不存在,則該選項不執行
executable:切換shell來執行指令,該執行路徑必須是一個絕對路徑
/*示例*/ ansible test-hosts -m command -a "ls"
2.setup模塊:查看遠程主機的相關facts變量信息
3.shell模塊:讓遠程主機在shell進程下執行命令,從而支持shell的特性,如管道等
/*示例*/ ansible all -m shell -a "echo "test" | passwd --stdin test1"
3.copy模塊:復制本地文件至遠程主機上
相關選項:
backup:在覆蓋之前,將源文件備份,備份文件包含時間信息。有兩個選項:yes|no
content:用於替代“src”,可以直接設定指定文件的值
dest:必選項。要將源文件復制到的遠程主機的絕對路徑,如果源文件是一個目錄,那么該路徑也必須是個目錄
directory_mode:遞歸設定目錄的權限,默認為系統默認權限
force:如果目標主機包含該文件,但內容不同,如果設置為yes,則強制覆蓋,如果為no,則只有當目標主機的目標位置不存在該文件時,才復制。默認為yes
others:所有的file模塊里的選項都可以在這里使用
src:被復制到遠程主機的本地文件,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它將遞歸復制。在這種情況下,如果路徑使用“/”來結尾,則只復制目錄里的內容,如果沒有使用“/”來結尾,則包含目錄在內的整個內容全部復制,類似於rsync。
owner,group,mode...
/*示例*/ ansible test-hosts -m copy -a "src=/etc/fstab dest=/root/"
4.file模塊:設置文件屬性
相關選項:
force:需要在兩種情況下強制創建軟鏈接,一種是源文件不存在,但之后會建立的情況下;另一種是目標軟鏈接已存在,需要先取消之前的軟鏈,然后創建新的軟鏈,有兩個選項:yes|no
group:定義文件/目錄的屬組
mode:定義文件/目錄的權限
owner:定義文件/目錄的屬主
path:必選項,定義文件/目錄的路徑
recurse:遞歸設置文件的屬性,只對目錄有效
src:被鏈接的源文件路徑,只應用於state=link的情況
dest:被鏈接到的路徑,只應用於state=link的情況
state:
directory:如果目錄不存在,就創建目錄
file:即使文件不存在,也不會被創建
link:創建軟鏈接
hard:創建硬鏈接
touch:如果文件不存在,則會創建一個新的文件,如果文件或目錄已存在,則更新其最后修改時間
absent:刪除目錄、文件或者取消鏈接文件
/*示例*/ ansible test-hosts -m file -a "path=/root/fstab owner=root group=root mode=600"
5.cron模塊:計划任務的實現
相關選項:
minute=/hour=/day=/month=/weekday= 某個值不寫,默認就是*
name:必選項,任務描述信息
job:執行的任務,要加引號
state:present(創建)/absent(刪除)
/*示例*/ ansible test-hosts -m cron -a "minute=*/1 job='/usr/bin/echo 'hello'' name=hello"
6.yum模塊:管理安裝相關程序包
相關選項:
name:程序包名稱,可帶版本號
state:present、installed、latest(安裝)/absent、removed(刪除)
7.service模塊:管理服務
相關選項:
name:服務名稱
state:started/stopped/restarted
enabled:true/false
runlevel:運行級別
8.group模塊:管理用戶組模塊
相關選項:
name:組名稱
gid:指定GID
state:present/absent
system:yes/no
/*示例*/ ansible all -m group -a "name=test_grp state=present"
9.user模塊:管理用戶模塊
相關選項:
由於user模塊的選項眾多,這里只介紹一些常用的選項:
name:用戶名
password:為用戶設置登陸密碼,此密碼是明文密碼加密后的密碼
update_password:always/on_create
always:只有當密碼不相同時才會更新密碼(默認)
on_create:只為新用戶設置密碼
shell:用戶的shell設定
groups:用戶組設定
home:指定用戶的家目錄
state:present/absent
append:yes/no
yes:增量添加group
no:全量變更group,只設置groups指定的group組(默認)
remove:配合state=absent使用,刪除用戶的家目錄->remove=yes
expires:設置用戶的過期時間,值是一個時間戳
/*示例*/ ansible all -m user -a "name=test2 state=present groups=test2,test_grp shell=/bin/bash append=yes"
五、playbook
playbook是由一個或多個“play”組成的列表,可以讓它們聯同起來按事先編排的機制執行;所謂task無非是調用ansible的一個module,而在模塊參數中可以使用變量;模塊執行是冪等的,這意味着多次執行是安全的,因為其結果均一致;
核心元素:hosts,tasks,variables,templates,handlers和roles(包含以上四個元素於一體的角色集合)
role目錄的層級結構:
files/ [存放由copy或script模塊等調用的文件]
tasks/ [至少應該包含一個名為main.yaml文件,其他的文件需要在此文件中通過include進行包含]
task配置文件示例:
templates/ [template模塊查找模塊文件的目錄]
handlers/ [至少應該包含一個名為main.yaml的文件;其他的文件需要在此文件中通過include進行包含]
vars/ [至少應該包含一個名為main.yaml的文件;其他的文件需要在此文件中通過include進行包含]
meta/ [至少應該包含一個名為main.yaml的文件;定義當前角色的特殊設定及其依賴關系;其他的文件需要在此文件中通過include進行包含]
default/ [設定默認變量時使用此目錄中的main.yaml文件]
調用角色的方式:
①直接調用
- hosts: remote_user: root roles: - mysql - nginx
②通過傳遞參數給角色調用
- hosts: remote_user: root roles: - { role:mysql,username:mysqld} //鍵值對形式:第一個鍵role指明調用的角色名稱;后續的鍵值對是用來傳給角色的變量