ansible笔记1--ansible基础

笔记1–ansible基础

ansible

ansible 基础介绍

Ansible是一种IT自动化工具。 它可以配置系统,部署软件并协调更高级的IT任务,例如连续部署或零停机滚动更新。
Ansible的主要目标是简单和易用。 它还非常关注安全性和可靠性,其特色为具备最少的活动部件,使用OpenSSH进行运输(也可以使用其他运输方式和拉动模式作为替代方案);其提供一种基于人类可审计性而设计的语言,即便一些人不熟悉该程序。

更多介绍参考:​​ansible/latest/index 官方介绍​

ansible 基础用法

  1. 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
  2. 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
  3. 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’
  4. 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

  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. 主要功能
    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
  1. 执行效果
    依次将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可以用于控制执行并发力度;
    执行效果:
  2. ansible笔记1--ansible基础_docker

  3. 机器上容器:
  4. ansible笔记1--ansible基础_滚动更新_02

  5. 关闭所有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。