ansible
ansible是新出現的自動化運維工具,基於python開發,集合了衆多運維工具(puppet,cfengfunc,fabric)的優勢,實現了批量系統配置、批量程序部署、批量運行命令等功能。
ansible是基於模塊工做的,自己沒有批量部署的能力。真正具備批量部署的ansible所運行的模塊。ansible只是提供了一種框架/主要包括:
①,連接插件connnection plugins:負責和監控端實現通訊;
②,host inventory:指定操做的主機,是一個配置文件裏面定義監控的主機;
③,各類模塊核心、command模塊、自定義模塊;
④,藉助於插件完成記錄日誌郵件等功能;
⑤,playbook:劇本執行多個任務時,非必須可讓節點一次運行多個任務。
特性
①模塊化:調用特色模塊,完成特定任務
②有paramkio,pyyaml,jinja2(模塊語言)三個
關鍵模塊
③支持自定義模塊
④基於python語言
⑤支持playbook編排任務
⑥等冪性
⑦無需代理不依賴PKI(無需ssl)
⑧但是使用任何語言編寫模塊
⑨YAML格式,編排任務
安裝
yum install ansible -y
相關文件
配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工做特性
/etc/ansible/hosts 主機清單
/etc/ansible/roles/ 存放角色目錄
程序
/usr/bin/ansible 主程序,臨時命令執行工具
/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具
/usr/bin/ansible-playbook 定製自動化任務,編排劇本工具
/usr/bin/ansible-pull 遠程執行命令工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基於console界面與用戶交互的執行工具
ansible語法格式
ansible 「主機清單」 -m 「模塊」 -a 「模塊語法」
ansible 基本文件類模塊參數
src參數:用於指定須要copy的文件]或目錄
dest參數:用於指定文件將被拷貝到遠程主機的哪一個目錄中,dest爲必須參數
content參數:當不使用src指定拷貝的文件時,可使用content直接指定文件內容,src與content兩個參數必有其一,不然會報錯。
force參: 當遠程主機的目標路徑中已經存在同名文件,而且與ansible主機中的文件內容不一樣時,是否強制覆蓋,可選值有yes和no,默認值爲yes,表示覆蓋,若是設置爲no,則不會執行覆蓋拷貝操做,遠程主機中的文件保持不變。
backup參數: 當遠程主機的目標路徑中已經存在同名文件,而且與ansible主機中的文件內容不一樣時,是否對遠程主機的文件進行備份,可選值有yes和no,當設置爲yes時,會先備份遠程主機中的文件,而後再將ansible主機中的文件拷貝到遠程主機。
owner參數: 指定文件拷貝到遠程主機後的屬主,可是遠程主機上必須有對應的用戶,不然會報錯。
group參數: 指定文件拷貝到遠程主機後的屬組,可是遠程主機上必須有對應的組,不然會報錯。
mode參數: 指定文件拷貝到遠程主機後的權限,若是你想將權限設置爲"rw-r--r--",則可使用mode=0644表示,若是你想要在user對應的權限位上添加執行權限,則可使用mode=u+x表示。
encrypt 加密
decrypt 解密
view 查看
edit 編輯加密文件
rekey 修改口令
create 建立新文件
ansible基本程序類模塊參數
name參數:指定程序服務名
state參數:指定對程序採起何種操做
安裝present
卸載absent
啓動started
中止stopped
重啓restarted
重讀配置文件reloaded
開機自啓enabled=yes
ansible經常使用模塊
Shell:在遠處主機上執行命令,非默認模塊,改成默認模塊後可忽略-m 選項
ansible all -m shell -a ‘echo magedu |passwd –stdin wang’
注:上句中all表示主機清單裏面全部遠程主機,下同。
將shell設爲默認模塊:
vim /etc/ansible.cfg
module_name=shell
Script:在遠處主機上運行ansible服務器的腳本
ansible all -m script -a /data/f1.sh
Copy:從主控端複製文件到遠程主機
ansible all -m copy -a 「src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes」
Fetch:從遠程主機提取文件至主控端,與Copy相反
ansible all -m fetch -a ‘src=/root/a.sh dest=/data/scripts’
File:設置文件屬性
ansible all -m file -a "path=/root/a.sh owner=wang mode=755「
ansible all -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’
Cron:計劃任務,支持時間:minute,hour,day,month,weekday
ansible all -m cron -a "minute=*/5 job='/usr/sbin/ntpdate
172.16.0.1 &>/dev/null' name=Synctime"
Yum:管理包
ansible all -m yum -a 'name=httpd state=present'
ansible all -m yum -a 'name=httpd state=absent'
Service:管理服務
ansible all -m service -a 'name=httpd state=stopped'
ansible all -m service -a 'name=httpd state=started enabled=yes'
ansible all -m service -a 'name=httpd state=reloaded’
ansible all -m service -a 'name=httpd state=restarted'
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 ’
Group:管理組
ansible srv -m group -a name=testgroup system=yes「
ansible srv -m group -a name=testgroup state=absent"
Vault 管理加密解密yml文件
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
YML語法
語法要求
①在單一檔案中,可用連續三個連字號(——)區分多個檔案。另外,還有選擇性的連續三個點號( ... )用來表示檔案結尾
②次行開始正常寫Playbook的內容,通常建議寫明該playbook的功能
③使用#號註釋代碼
④縮進必須是統一的,不能空格和tab混用
⑤縮進的級別也必須是一致的,一樣的縮進表明一樣的級別,程序判別配置的級別是經過縮進結合換行來實現的
⑥YAML文件內容是區別大小寫的,k/v的值均需大小寫敏感
⑦多個k/v可同行寫也可換行寫,同行使用,分隔v但是個字符串,也但是另外一個列表
⑧一個完整的代碼塊功能需最少元素需包括 name 和 task
⑨一個name只能包括一個task
⑩YAML文件擴展名一般爲yml或yaml
示例①
name: John Smith
age: 41
gender: Male
spouse:
name: Jane Smith
age: 37
gender: Female
children:
- name: Jimmy Smith
age: 17
gender: Male
- name: Jenny Smith
age 13
gender: Female
示例②:
---
#test httpd role
- hosts: websrvs:appsrvs
roles:
- role: httpd
tags: web
when: ansible_distribution_major_version == "6"
- role: nginx
tags: web2
when: ansible_distribution_major_version == "7"
playbook
基礎組件:
hosts:用於指定要執行指定任務的主機,須事先定義在主機清單中
能夠是以下形式:
one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1.*
Websrvs:dbsrvs 或者,兩個組的並集
Websrvs:&dbsrvs 與,兩個組的交集
webservers:!phoenix 在websrvs組,但不在dbsrvs組
示例: - hosts: websrvs:dbsrvs
tasks:任務列表
每一個task都應該有其name,用於playbook的執行結果輸出。
示例:
tasks:
- name: disable selinux
command: /sbin/setenforce 0
經常使用選項
--check -C 只檢測可能會發生的改變,但不真正執行操做
--list-hosts 列出運行任務的主機
--list-tags 列出tag
--list-tasks 列出task
--limit 主機列表 只針對主機列表中的主機執行
-v -vv -vvv 顯示過程
示例
ansible-playbook file.yml --check 只檢測
ansible-playbook file.yml
ansible-playbook file.yml --limit websrvs
Roles
roles經過分別將變量、文件、任務、模板及處理器至於單獨的目錄中,並能夠便捷的include它們的一種機制。角色通常用於基於主機構建的場景中,但也能夠是用於構建守護進程等場景中
各目錄做用
/roles/project/:項目名稱,如下子目錄
files/ :存放由copy或script模塊等調用的文件
templates/:template模塊查找所須要模板文件的目錄
tasks/:定義task,role的基本元素,至少應該包含一個名爲main.yml的文件;其它的文件須要在此文件中經過include進行包含
handlers/:至少應該包含一個名爲main.yml的文件;其它的文件須要在此文件中經過include進行包含
vars/:定義變量,至少應該包含一個名爲main.yml的文件;其它的文件須要在此文件中經過include進行包z
meta/:定義當前角色的特殊設定及其依賴關係,至少應該包含一個名爲
main.yml的文件,其它文件需在此文件中經過include進行包含
default/:設定默認變量時使用此目錄中的main.yml文件
建立role
1,建立以roles命名的目錄
2,在roles下建立以角色命名的子目錄,如httpd,nginx等
3,在角色目錄下建立files,handlers,meta,tasks,templates,vars等
4,在playbook文件中,調用個角色
調用角色方法
-hosts: all
remote_user: root
roles:
- mysql
- nginx
示例:遠程主機安裝httpd服務
tree roles/httpd/
roles/httpd/
├── files
│ ├── httpd6.conf
│ ├── httpd7.conf
│ └── index.html
└── tasks
├── conf.yml
├── data.yml
├── install.yml
├── main.yml
└── service.yml
2 directories, 8 files
cat roles/httpd/tasks/*.yml
- name: conf6
copy: src=files/httpd6.conf dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution_major_version == "6"
- name: conf7
copy: src=files/httpd7.conf dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution_major_version == "7"
- name: data
copy: src=files/index.html dest=/var/www/html/
- name: install
yum: name=httpd
- include: install.yml
- include: data.yml
- include: conf.yml
- include: service.yml
- name: service
service: name=httpd state=started enabled=yes
cat role-httpd.yml
- hosts: all
roles:
- role: httpd
檢查語法是否錯誤
ansible-playbook role-httpd.yml -C
執行命令
ansible-playbook role-httpd.yml
以上。
共勉!