-
Ansible簡介:
- ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。
-
Ansible主要組成部分:
- USER,普通用戶,即SYSTEM ADMINISTRATOR
- CMDB(資產管理系統) API 調用
- PUBLIC/PRIVATE CLOUD API調用
- USER-> Ansible Playbook -> Ansibile
- 利用ansible實現管理的方式:
- Ad-Hoc 即ansible命令,主要用於臨時命令使用場景
- Ansible-playbook 主要用於長期規劃好的,大型項目的場景,需要有前提的規劃
-
Ansible配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主機清單
/etc/ansible/roles/ 存放角色的目錄
-
Ansible程序
/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界面與用戶交互的執行工具
-
Ansible配置文件
-
Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默認)
-
Ansible主機清單inventory
- /etc/ansible/hosts文件格式
- inventory文件遵循INI文件風格,中括號中的字符爲組名。
- 可以將同一個主機同時歸併到多個不同的組中;此外,當如若目標主機使用了非默認的SSH端口,還可以在主機名稱之後使用冒號加端口號來標明
- 例:
-
Ansible系列命令
ansible #主程序命令,臨時執行命令用 ansible-doc #顯示模塊幫助 ansible-playbook #將一系列的任務寫在一起,稱爲:劇本 ansible-vault #管理加密、解密yml文件 ansible-console #2.0+版本新增,可交互執行命令,支持tab ansible-galaxy #連接 https://galaxy.ansible.com 下載相應的roles ansible-pull #推送命令至遠程,效率無限提升,對運維要求較高
- ansible
-
ansible-doc
- ansible-vault
-
ansible-console
- ansible
-
Ansible常用模塊
- Command:在遠程主機執行命令,默認模塊,可忽略-m選項
ansible srvs -m command -a 'service vsftpd start'
ansible srvs -m command -a 'echo bigboss | passwd --stdin wang' #執行失敗
#此模塊不支持 $VARNAME < > | ; & 等,用shell模塊實現 - Shell:和command相似,用shell執行命令
(1)ansible srv -m shell -a 'echo bigboss |passwd –stdin wang'
(2)調用bash執行命令
#類似 cat /tmp/stanley.md | awk -F'|' '{print $1,$2}' &> /tmp/example.txt
#這些複雜命令,即使使用shell也可能會失敗,解決辦法:寫到腳本時,copy到遠程,執行,再把需要的結果拉回執行命令的機器 - Script:運行腳本
ansible all -script -a "/PATH/TO/SCRIPT_FILE"
ansible all -m script -a test.sh - Copy:從服務器複製文件到客戶端
ansible srv -m copy -a 'src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes'
#如目標存在,默認覆蓋,backup=yes 指定先備份
ansible srv -m copy -a "content='test content\n' dest=/tmp/f1.txt"
#利用內容,直接生成目標文件 - 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' #刪除任務 -
Fetch:從客戶端取文件至服務器端,copy相反,拉取目錄可先tar打包
ansible srv -m fetch -a 'src=/root/a.sh dest=/data/scripts' - File:文件管理
ansible all -m file -a 'name=/app/a.txt state=touch'
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' -
Hostname:管理主機名
ansible all -m hostname -a "name=websrv" -
Yum:管理包
ansible srv -m yum -a 'name=httpd state=latest' #安裝
ansible srv -m yum -a 'name=httpd state=absent' #刪除 -
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' #重啓 -
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'
#刪除用戶及家目錄等數據 -
Group:管理組
ansible srv -m group -a "name=testgroup system=yes"
ansible srv -m group -a "name=testgroup state=absent" - Setup: 遠程主機信息變量
- Command:在遠程主機執行命令,默認模塊,可忽略-m選項
-
Ansible的playbook
- playbook是由一個或多個"play"組成的列表
- play的主要功能在於將事先歸併爲一組的主機裝扮成事先通過ansible中的task定義好的角色。
- 從根本上來講,所謂task無非是調用ansible的一個module。
-
將多個play組織在一個playbook中,即可以讓它們聯同起來按事先編排的機制同唱一臺大戲
- Playbook採用YAML語言編寫
- YAML是一個可讀性高的用來表達資料序列的格式
- http://www.yaml.org
-
運行playbook:
ansible-playbook <filename.yml> ... [options] 選項: --check 只檢測可能會發生的改變,但不真正執行操作 --list-hosts 列出運行任務的主機 --limit 主機列表 只針對主機列表中的主機執行 -v,-vv,-vvv 顯示過程,更詳細 例: ansible-playbook file.yml --check #只檢測不運行 ansible-playbook file.yml ansible-playbook file.yml --limit websrvs
-
YAML語法簡介
- (1)在單一檔案中,可用連續三個連字號(——)區分多個檔案。另外,還有選擇性的連續三個點號( ... )用來表示檔案結尾
- (2)次行開始正常寫Playbook的內容,一般建議寫明該Playbook的功能
- (3)使用#號註釋代碼
- (4)縮進必須是統一的,不能空格和tab混用
- (5)縮進的級別也必須是一致的,同樣的縮進代表同樣的級別,程序判別配置的級別是通過縮進結合換行來實現的
- (6)YAML文件內容和Linux系統大小寫判斷方式保持一致,是區別大小寫的,k/v的值均需大小寫敏感
- (7)k/v的值可同行寫也可換行寫。同行使用:分隔
- (8)v可是個字符串,也可是另一個列表
- (9)一個完整的代碼塊功能需最少元素需包括 name: task
- (10)一個name只能包括一個task
- (11)YAML文件擴展名通常爲yml或yaml **
-
Playbook核心元素
- Hosts #執行的遠程主機列表
- Tasks #任務集
- Varniables #內置變量或自定義變量在playbook中調用
- Templates #模板,可替換模板文件中的變量並實現一些簡單邏輯的文件
- Handlers #和notity結合使用,由特定條件觸發的操作,滿足條件方纔執行,否則不執行
- tags #標籤 指定某條任務執行,用於選擇運行playbook中的部分代碼。ansible具有冪等性,因此會自動跳過沒有變化的部分,即便如此,有些代碼爲測試其確實沒有發生變化的時間依然會非常地長。此時,如果確信其沒有變化,就可以通過tags跳過此些代碼片斷
- Hosts:
- playbook中的每一個play的目的都是爲了讓某個或某些主機以某個指定的用戶身份執行任務。
- hosts用於指定要執行指定任務的主機,須事先定義在主機清單中
-
可以是如下形式:
www.bigboss.com www.bigboss1.com:www.bigboss2.com 192.168.1.2 192.168.1.* web:db #兩個組的交集 web:&db #兩個組的並集 web:!db #在web組但不在db組中 例: - host: web:db
- remote_user:
- 可用於Host和task中。也可以通過指定其通過sudo的方式在遠程主機上執行任務,其可用於play全局或某任務
-
此外,甚至可以在sudo時使用sudo_user指定sudo時切換的用戶
- hosts: websrvs remote_user: root tasks: - name: test connection ping: remote_user: bigboss sudo: yes #默認sudo爲root sudo_user:wang #sudo爲wang
- tasks:任務列表
- 格式:
- (1) action: module arguments
- (2) module: arguments 建議使用
- 注意:shell和command模塊後面跟命令,而非key=value
- 某任務的狀態在運行後爲changed時,可通過"notify"通知給相應的handlers
- 任務可以通過"tags"打標籤,而後可在ansible-playbook命令上使用-t指定進行調用
-
例:
tasks: - name: disable selinux command: /sbin/setenforce 0 #如果命令或腳本的退出碼不爲零,可以使用如下方式替代 tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand || /bin/true #或者使用ignore_errors來忽略錯誤信息: tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand ignore_errors: True
-
handlers和notify結合使用觸發條件:
- hosts: websrvs remote_user: root tasks: - name: Install httpd yum: name=httpd state=present - name: Install configure file copy: src=files/httpd.conf dest=/etc/httpd/conf/ notify: restart httpd #當copy動作實現時,就會執行handlers的動作 - name: ensure apache is running service: name=httpd state=started enabled=yes handlers: - name: restart httpd service: name=httpd status=restarted
- tags使用:
http.yml - hosts: web remote_user: root task: - name: Install httpd yum: name=httpd - name: copy configure file copy: src=file/httpd.conf dest=/etc/httpd/conf/ tags: conf #設置tags名爲conf - name: start httpd tags:service service: name=httpd state=started enabled=yes ansible-playbook -t conf httpd.yml #調用名爲conf的tags
-
模板Templates
文本文件,嵌套有腳本(使用模板編程語言編寫)
Jinja2語言,使用字面量,有下面形式
字符串:使用單引號或雙引號
數字:整數,浮點數
列表:[item1, item2, ...]
元組:(item1, item2, ...)
字典:{key1:value1, key2:value2, ...}
布爾型:true/false
算術運算:+, -, *, /, //, %, **
比較操作:==, !=, >, >=, <, <=
邏輯運算:and, or, not
流表達式:For If When -
templates功能:根據模塊文件動態生成對應的配置文件
- templates文件必須存放於templates目錄下,且命名爲 .j2 結尾
-
yaml/yml 文件需和templates目錄平級,目錄結構如下:
- 例:利用templates 同步nginx配置文件
[root@centos7 ~]# cat nginx.conf.j2
user nginx;
worker_processes {{ ansible_processor_vcpus*2 }};
#setup模塊中ansible_processor_vcpus變量爲CPU核心數,[root@centos7 ~]# vim temnginx.yml
- hosts: web remote_user: root tasks: - name: template config to hosts template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
ansible-playbook temnginx.yml
-
when: 條件測試
-
如果需要根據變量、facts或此前任務的執行結果來做爲某task執行與否的前提時要用到條件測試,通過when語句實現,在task中使用,jinja2的語法格式在task後添加when子句即可使用條件測試;when語句支持Jinja2表達式語法
- 例:
#當setup模塊中ansible_os_family等於RedHat時執行關機
tasks:-
name: shutdown redhat system
command: /sbin/shutdown -h now
when: ansible_os_family == 'RedHat'#根據系統版本來安裝軟件
tasks: - name: install nginx to centos7
yum: name=nginx
when: ansible_distribution_major_version == '7' - name: install httpd to centos6
yum: name=httpd
when: ansible_distribution_major_version == '6'
-
-
-
迭代:with_items
- 迭代:當有需要重複性執行的任務時,可以使用迭代機制
- 對迭代項的引用,固定變量名爲”item“
- 要在task中使用with_items給定要迭代的元素列表
- 列表格式:
- 字符串
- 字典
- 例:
- 迭代嵌套子變量:
-
想要深入瞭解請點擊→Ansible中文權威指南