ansible簡介
運維工具分類:
agent:基于專用的agent程序完成管理功能,puppet, func, zabbix, …
agentless:基于ssh服務完成管理,ansible, fabric, …
Ansible默認通過 SSH 協議管理機器
ansible 架構:
Ansible Core:absible核心
Modules:
Core Modules:內鍵模塊
Customed Modules:自定義模塊
Host Iventory:主機清單,定義要管理的主機
可以是Files
可以是CMDB
PlayBooks:定義主機要使用的那些角色
Hosts
roles
Connection Plugins:連接插件:并發連接默認一次管理5臺
ansible特性:
模塊化:調用特定的模塊完成特定任務
基于Python語言開發,由Paramilo,PYYAML和Jinjia2(模板庫)單個核心庫實現
部署簡單:agentless
強大的playbook機制
冪等性,一個playbook可以在同一臺主機使用多次,效果一樣
默認沒有server
不依賴證書
支持任何編程語言編寫自動義模塊
ansible安裝:
ansible軟件包位于epel源中,配置好epel源直接安裝即可
yum install ansible
安裝完成后成程序:
ansible
ansible-playbook
ansible-doc
ansible主要文件:
配置文件:
/etc/ansible/ansible.cfg
主機清單:
/etc/ansible/hosts
插件目錄:
/usr/share/ansible_plugins/
ansible簡單使用:
ansible命令:
Usage: ansible <host-pattern> [options]
常用選項:
-m MOD_NAME -a MOD_ARGS
ansible配置
1、配置基于ssh無密碼登錄要管理的主機,在ansible管理主機上生成公鑰 ssh-keygen -t rsa
2、將生成的公鑰發送到要管理主機的家目錄中ssh-copy-id root@ip
3、編輯/etc/ansible/hosts文件,配置管理主機清單
ansible管理遠程主機命令:
模塊:
獲取模塊列表:ansible-doc -l
獲取指定模塊的使用幫助:ansible-doc -s MOD_NAME
ansible常用模塊:
1、 ping:探測目標主機是否存活;
2、command:在遠程主機執行命令;不支持特性的命令
3、shell:在遠程主機上調用shell解釋器運行命令,支持shell的各種功能,例如管道等 ; 注意:command和shell模塊的核心參數直接為命令本身;而其它模塊的參數通常為“key=value”格式;
copy: 用法: (1) 復制文件 -a "src= dest= " (2) 給定內容生成文件 -a "content= dest= " 其它參數:mode, owner, group, ...
file:設置文件屬性 用法: (1) 創建目錄: -a "path= state=directory" (2) 創建鏈接文件: -a "path= src= state=link" (3) 刪除文件: -a "path= state=absent“
fetch:從遠程主機拉去文件
cron:管理遠程主機自動化任務 -a "" minute= hour= day= month= weekday= job= name= user= state={present|absent} present:新建計劃任務默認選項 absent:刪除計劃任務
hostname:管理主機名 name=
yum:yum包管理 -a "" (1) name= state={present|latest} 安裝包可以使用present或者absent (2) name= state=absent
service:服務啟動管理 -a "" name= state= started stopped restarted enabled= runlevel=
group: A d d o r r e m o v e g r o u p s -a "" name= state= system= gid= user:M a n a g e u s e r a c c o u n t s -a "" name= group= groups= comment= uid= system= shell= expires= home=
setup:獲取遠程主機中信息
playbook 編寫:
YAML: YAML is a data serialization format designed for human readability and interaction with scripting languages. YAML:編程語言 程序包:PyYAML 數據結構: key:value - item1 - item2 - item3 {name:jerry, age:21} palybook作用: 將遠程操作的命令通過YAML語言編寫腳本,通過執行腳本完成操作 PlayBook: 核心元素: Tasks:任務,由模塊定義的操作的列表; Variables:變量 Templates:模板,即使用了模板語法的文本文件; Handlers:由特定條件觸發的Tasks; Roles:角色; playbook的基礎組件: Hosts:運行指定任務的目標主機; remote_user:在遠程主機以哪個用戶身份執行; sudo_user:非管理員需要擁有sudo權限; 運行playbook: 運行playbook,使用ansible-playbook命令 (1) 檢測語法 ansible-playbook --syntax-check /path/to/playbook.yaml (2) 測試運行 ansible-playbook -C /path/to/playbook.yaml --list-hosts --list-tasks --list-tags (3) 運行 ansible-playbook /path/to/playbook.yaml -t TAGS, --tags=TAGS :只運行某TAGS的命令 --skip-tags=SKIP_TAGS --start-at-task=START_AT 示例: - hosts: websrvs remote_user: root tasks: - name: install httpd package yum: name=httpd state=latest - name: install conf file copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf notify: restart httpd service - name: start httpd service service: name=httpd state=started handlers: - name: restart httpd service service: name=httpd state=restarted
playbook tasks創建實例:
大寫的注意:注意腳本之間的縮進,縮進錯誤也會包語法錯誤,縮進為2個字符
tasks:任務列表 模塊,模塊參數: 格式: (1) action: module arguments (2) module: arguments
1、給webservers組中的所有主機創建grp組,和用戶mygrp ,并所屬組為grp
2、給所有的webservers組中的主機安裝web服務,并啟動端口為8080 注意:保障每個主機中的yum源配置 方法一:在ansible主機中編譯httpd.conf文件,將端口改成8080,并將httpd.conf文件復制給每個主機 (注意:此方法適應于相同版本的應用程序,否則配置文件不聽可能會出錯) 方法二:不同版本之間可以用命令直接更改
playbook handlers介紹及實例:
handlers:由特定條件觸發的Tasks; 調用及定義方式: tasks: - name: TASK_NAME module: arguments notify: HANDLER_NAME handlers: - name: HANDLER_NAME module: arguments 3、出發操作,httpd配置文件發生變化時,執行restart命令
playbook tags語法及實例:
tags:給指定的任務定義一個調用標識;指在tasks中定義,在handlers中定義不生效 - name: NAME module: arguments tags: TAG_ID 4、定義重啟操作標簽切restart ,下次啟動時可以直接執行重啟,而不執行其他腳本中的任務
playbook vaiable語法以及實例:
Variables: 類型 內建: (1) facts 自定義: (1) 命令行傳遞; -e VAR=VALUE (2) 在hosts Inventory(清單)中為每個主機定義專用變量值; (a) 向不同的主機傳遞不同的變量 ; IP/HOSTNAME variable_name=value (b) 向組內的所有主機傳遞相同的變量 ; [groupname:vars] variable_name=value (3) 在playbook中定義 vars: - var_name: value vars: - var_name: value (4) Inventory還可以使用參數: 用于定義ansible遠程連接目標主機時使用的屬性,而非傳遞給playbook的變量; ansible_ssh_host :指定ansible遠程連接主機使用的哪個ip地址 ansible_ssh_port :指定ansible遠程連接主機使用的哪個端口 ansible_ssh_user ansible_ssh_pass ansible_sudo_pass (5) 在角色調用時傳遞 roles: - { role: ROLE_NAME, var: value, ...} 變量調用: {{ var_name }} 注意::-e傳遞的變量值會覆蓋playbook和hosts傳遞的變量值 實例: 5、而根據不同主機安裝和卸載不同的程序包
※編寫腳本vim /root/bin/install.yaml
※通過執行腳本傳遞參數
※通過/etc/absible/hosts傳遞參數,
※通過playbook中傳遞參數
playbook Templates 語法以及使用:
什么是模板:文本文件,內部嵌套有模板語言腳本(使用模板語言編寫) 編寫語言:jinja2 語法: 字面量: 字符串:使用單引號或雙引號; 數字:整數、浮點數; 列表:[item1, item2, ...] 元組:(item1, item2, ...) 是一個不可變類型 字典:{key1:value1, key2:value2, ...} :以鍵值對隊存儲數據 布爾型:true/false 算術運算: +, -, *, /, //, %, ** 比較操作: ==, !=, >, <, >=, <= 邏輯運算:and, or, not 執行模板文件中的腳本,并生成結果數據流,需要使用template模塊; template: -a ”“ src= dest= mode= onwer= group= 注意:此模板不能在命令行使用,而只能用于playbook; 示例: 題目:將nginx安裝到ngxsrvs組中的服務器中,并啟動nginx,啟動時的wordpress為cpu核心數 思路:每臺主機的cup核心數不同,要完成操作,就必須用變量代表,ansible內嵌了ansible_process_vpus 變量,可獲取每臺主機的cpu核心數 步驟: 1、 在ansible主機中安裝nginx為了生成nginx.conf文件 2、更改配置文件nginx.conf文件worker_processes {{ ansible_processes_vpus }}; 3、復制文件到/root/目錄下并更改名稱為/etc/nginx.conf.j2 4、編寫腳本 :installnginx.yaml - hosts: ngxsrvs remote_user: root tasks: - name: install nginx package yum: name=nginx state=latest - name: install conf file template: src=/root/nginx.conf.j2 dest=/etc/nginx/nginx.conf tags: ngxconf notify: reload nginx service - name: start nginx service service: name=nginx state=started enabled=true handlers: - name: reload nginx service shell: /usr/sbin/nginx -s reload 條件測試: when語句:在tasks中使用,Jinja2的語法格式; - hosts: all remote_user: root tasks: - name: install nginx package yum: name=nginx state=latest - name: start nginx service on CentOS6 shell: service nginx start when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6" - name: start nginx service shell: systemctl start nginx.service when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7" 循環:迭代,需要重復執行的任務; 對迭代項的引用,固定變量名為"item”,使用with_item屬性給定要迭代的元素; 元素:列表 字符串 字典 基于字符串列表給出元素示例: - hosts: websrvs remote_user: root tasks: - name: install packages yum: name={{ item }} state=latest with_items: - httpd - php - php-mysql - php-mbstring - php-gd 基于字典列表給元素示例: - hosts: all remote_user: root tasks: - name: create groups group: name={{ item }} state=present with_items: - groupx1 - groupx2 - groupx3 - name: create users user: name={{ item.name }} group={{ item.group }} state=present with_items: - {name: 'userx1', group: 'groupx1'} - {name: 'userx2', group: 'groupx2'} - {name: 'userx3', group: 'groupx3'}
ansible roles語法和使用:
角色:roles 角色概念:以特定的層級目錄結構進行組織的tasks、variables、handlers、templates、files等,方便調用; role_name/:角色名稱,例如安裝httpd,在/etc/ansible/roles中常見httpd文件,在httpd文件中常見以下的目錄。httpd則為角色名 files/:存儲由copy或script等模塊調用的文件; tasks/:此目錄中至少應該有一個名為main.yml的文件,用于定義各task;其它的文件需要由main.yml進行“包含”調用; handlers/:此目錄中至少應該有一個名為main.yml的文件,用于定義各handler;其它的文件需要由main.yml進行“包含”調用; vars/:此目錄中至少應該有一個名為main.yml的文件,用于定義各variable;其它的文件需要由main.yml進行“包含”調用; templates/:存儲由template模塊調用的模板文本; meta/:此目錄中至少應該有一個名為main.yml的文件,定義當前角色的特殊設定及其依賴關系;其它的文件需要由main.yml進行“包含”調用; default/:此目錄中至少應該有一個名為main.yml的文件,用于設定默認變量; ansible中角色默認存放路徑為:/etc/ansible/roles中 更改角色路徑:便捷/etc/ansible/ansible.cfg roles_path=/path/to/somefile 在playbook中調用角色的方法: - hosts: HOSTS remote_user: USERNAME roles: - ROLE1:角色名 - ROLE2 - { role: ROLE3, VARIABLE: VALUE, ...} :在調用角色的同時傳遞參數 - { role: ROLE4, when: CONDITION }:在調用角色的同時給出條件
角色實用實戰: 利用角色安裝memcache,并將啟動的內存設置為總內存的4分之一 步驟一: 1、創建memcache角色 mkdir /etc/ensible/roles/memcached 2、在memcached創建tasks 和templates文件 3、在tasks文件中創建main.yml文件 4、修改memcache配置文件/etc/sysconfig/memcached文件并將文件拷貝到/etc/ansible/roles/memcahced/templates中,重名為為 memcahced.conf.j2 5、編寫playbook調用此角色
1、main.yml 和 playbook文件
原創文章,作者:wangnannan,如若轉載,請注明出處:http://www.www58058.com/57578