ansible筆記1--ansible基礎
筆記1–ansible基礎
ansible
ansible 基礎介紹
Ansible是一種IT自動化工具。 它可以配置系統,部署軟件並協調更高級的IT任務,例如連續部署或零停機滾動更新。
Ansible的主要目標是簡單和易用。 它還非常關注安全性和可靠性,其特色爲具備最少的活動部件,使用OpenSSH進行運輸(也可以使用其他運輸方式和拉動模式作爲替代方案);其提供一種基於人類可審計性而設計的語言,即便一些人不熟悉該程序。
更多介紹參考:ansible/latest/index 官方介紹
ansible 基礎用法
- copy
案例1:
ansible -i ~/tmp/iplist all -m copy -a “src=/etc/hosts dest=/tmp/hosts”
案例2:
ansible -i ~/tmp/iplist all -m copy -a “src=/etc/hosts dest=/home/xg/tmp/hosts owner=xg group=xg mode=0644”
不加參數的話,此處只能使用自己的用戶羣組,使用root會出錯
案例3:
ansible -i ~/tmp/iplist all -m copy -a “src=/etc/hosts dest=/home/xg/tmp/hosts_root2 owner=root group=root mode=0755” -b --become-method su --become-user root -K - shell
案例1:
ansible -i ~/tmp/iplist all -m shell -a “mkdir /home/xg/tmp0610 -p”
案例2:
ansible -i ~/tmp/iplist all -m shell -a “chown -R root:root /home/xg/tmp0610” -b --become-method su --become-user root -K - get_url
ansible -i /home/xg/file/tmp/mars all -m get_url -a ‘url=http://10.120.75.102:8660/tarFile.tar.gz dest=/home/xg’ - unarchive
ansible -i /home/xg/file/tmp/iplist all -m unarchive -a ‘src=/home/xg/tarFile.tar.gz dest=/home/xg copy=no’
playbook
playbook基礎介紹
playbook是基於Ansible的配置、部署和編排語言。 它可以描述我們希望遠程系統執行的策略,或一般IT流程中的一組步驟。
如果把Ansible模塊比作車間中的工具,則playbook是工具的說明手冊,主機清單是原材料。
從根本上講,playbook可用於管理遠程計算機的配置和部署。 更進一步,它可以對涉及滾動更新的多層部署進行排序,並可以將操作委派給其他主機,在此期間與監視的服務器和負載平衡器進行交互。
更多介紹參考:playbooks 官方介紹
playbook用法
案例1
- host.py
案例1均使用如下host信息,第一行必須指定/usr/bin/env python,否則會報錯#!/usr/bin/env python # coding=utf-8 import json ret = { '_meta': { 'hostvars': { 'docker-master-01_10.120.75.102': { 'ansible_host': '10.120.75.102' }, 'docker-master-02_10.120.75.103': { 'ansible_host': '10.120.75.103' }, 'docker-master-03_10.120.75.107': { 'ansible_host': '10.120.75.107' }, 'docker-data-01_10.120.75.102': { 'ansible_host': '10.120.75.102' }, 'docker-data-02_10.120.75.103': { 'ansible_host': '10.120.75.103' }, 'docker-data-03_10.120.75.107': { 'ansible_host': '10.120.75.107' }, 'docker-meta-01_10.120.75.102': { 'ansible_host': '10.120.75.102' }, 'docker-meta-02_10.120.75.103': { 'ansible_host': '10.120.75.103' }, 'docker-meta-03_10.120.75.107': { 'ansible_host': '10.120.75.107' }, 'docker-object-01_10.120.75.102': { 'ansible_host': '10.120.75.102' }, 'docker-object-02_10.120.75.103': { 'ansible_host': '10.120.75.103' }, 'docker-object-03_10.120.75.107': { 'ansible_host': '10.120.75.107' } } }, 'zx_101': { 'hosts': [ 'docker-master-01_10.120.75.102', 'docker-master-02_10.120.75.103', 'docker-master-03_10.120.75.107', 'docker-data-01_10.120.75.102', 'docker-data-02_10.120.75.103', 'docker-data-03_10.120.75.107', 'docker-meta-01_10.120.75.102', 'docker-meta-02_10.120.75.103', 'docker-meta-03_10.120.75.107', 'docker-object-01_10.120.75.102', 'docker-object-02_10.120.75.103', 'docker-object-03_10.120.75.107' ] } } #print(ret) print json.dumps(ret,indent=4)
- 主要功能
1)拷貝文件到tmp目錄
2)將操作時間和inventory_hostname輸出到指定文件
3)按照 inventory_hostname的前半部分啓動對應的docker
chubao_rolling_upgrade.yml 內容如下:- hosts: "{{ hosts }}" serial: "{{ serial }}" remote_user: xg gather_facts: False tasks: - name: copy the latest script copy: src=./docker_update.py dest=/tmp vars: display: true - name: echo time and hostname to file shell: date>>/home/xg/0610.log && echo {{inventory_hostname}}>>/home/xg/0610.log vars: display: true - name: run container shell: service_name="{{ inventory_hostname.split('_')[0] }}";port=881;if [[ ${service_name} == *data* ]];then port=882;elif [[ ${service_name} == *meta* ]];then port=883;elif [[ ${service_name} == *object* ]];then port=884;else port=881;fi; docker run -d --name=$service_name -p 0.0.0.0:${port}:80 nginx
- 執行效果
依次將hosts=‘docker-xxx-0*’ 中的xxx更改爲master、data、meta、object即可分別啓動對應的容器實例。
ansible-playbook -i zx_host.py chubao_rolling_upgrade.yml -e hosts=‘docker-object-0*’ -e ‘serial=1’
其中serial=n可以用於控制執行併發力度;
執行效果:
機器上容器:
- 關閉所有data容器:
ansible-playbook -i zx_host.py chubao_rolling_upgrade.yml -e hosts=‘docker-data-0*’ -e ‘serial=1’
只需要將上述中的run container更改爲如下內容即可:- hosts: "{{ hosts }}" serial: "{{ serial }}" remote_user: xg gather_facts: False tasks: - name: copy the latest script copy: src=./docker_update.py dest=/tmp vars: display: true - name: echo time and hostname to file shell: date>>/home/xg/0610.log && echo {{inventory_hostname}}>>/home/xg/0610.log vars: display: true - name: stop and delete container shell: service_name="{{ inventory_hostname.split('_')[0] }}";docker stop ${service_name} > /dev/null 2>&1 && docker rm ${service_name} > /dev/null 2>&1
說明
測試系統爲debian系統,需要安裝對應的docker,並pull相應鏡像;
主控機爲mac,安裝ansible後即會有對應的ansible-playbook。