ansible基礎用法~八週目

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

以上。
共勉!
相關文章
相關標籤/搜索