云计算三种服务架构
IAAS:
不提供OS 只购买硬件(网络,存储,计算)
PAAS:
提供硬件和OS和开发和运行环境 只需要开发应用软件
SAAS:
提供 硬件 os 软件 相当于直接购买软件
Ansible介绍
1.有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块
2.部署简单,基于python和SSH(默认已安装),agentless
3.支持playbook编排任务 编排定义Ansible任务集的配置 文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
4.幂等性: 一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
主机清单inventory
ansible只有首先配置好主机清单才能够管理其它主机,如果没有配置ansible将无法管理任何主机
默认的inventory file 为 /etc/ansible/hosts
inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成
Ansible执行命令流程
ansible命令执行过程
1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg
2. 加载自己对应的模块文件,如command
3. 通过ansible将模块或命令生成对应的临时py文件,并将该 文件传输至远程服务器 的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
4. 给文件+x执行
5. 执行并返回结果
6. 删除临时py文件,sleep 0退出
执行状态:
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
Ansible的安装和基本模块的使用
[root@localhost ~]# yum install ansible [root@localhost ~]# ansible --version ansible 2.5.3 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] [root@localhost ~]# vi /etc/ansible/hosts [root@localhost ~]# ansible 192.168.231.7 -m ping -k SSH password: 192.168.231.7 | SUCCESS => { "changed": false, "ping": "pong" } [root@localhost .ssh]# ansible webservers -m ping -k SSH password: 192.168.231.7 | SUCCESS => { "changed": false, "ping": "pong" } [root@localhost .ssh]# ansible 192.168.231.7 -vvv -m ping -k # -vvv 输出ansible操作的详细信息,可以当作调试日志 [root@localhost .ssh]# ssh-keygen [root@localhost .ssh]# ssh-copy-id 192.168.231.7 [root@localhost .ssh]# ansible all -m command -a 'ss -ntul' #command模块不支持命令管道(|),重定向(>),变量($HOSTNAME) [root@localhost .ssh]# ansible all -m shell -a 'echo $HOSTNAME' [root@localhost .ssh]# ansible all -m shell -a 'echo "333">1ansible.aaa' 192.168.231.7 | SUCCESS | rc=0 >> [root@localhost .ssh]# ansible all -a 'echo "333">1ansible.aaa' 192.168.231.7 | SUCCESS | rc=0 >> 333>1ansible.aaa [root@localhost ~]# ansible all -m fetch -a 'src=/root/guess.sh dest=/root' #owner mode #fetch 只能拉取文件,不能拉取目录或者匹配通配符 192.168.231.7 | SUCCESS => { "changed": true, "checksum": "656427f4ebbcbb4745fa80fbffc456b88378c4ed", "dest": "/root/192.168.231.7/root/guess.sh", "md5sum": "435fe28b40aa89a35f9dc63c7063b1a7", "remote_checksum": "656427f4ebbcbb4745fa80fbffc456b88378c4ed", "remote_md5sum": null } [root@localhost ~]# ansible all -m file -a 'name=/root/yxh state=directory' #file模块包括对文件夹的操作 #file不能删除使用通配符批量删除目录下的文件,只能删除整个目录 [root@localhost ~]# ansible all -m shell -a 'rm -fr /data/*'
YAML语法简介
使用#号注释代码
缩进必须是统一的,不能空格和tab混用
缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写的,k/v的值均需大小写敏感
k/v的值可同行写也可换行写,同行使用:分隔
v可是个字符串,也可是另一个列表
一个完整的代码块功能需最少元素需包括 name: task
一个name只能包括一个task
YAML文件扩展名通常为yml或yaml
List: 列表,其所有元素均使用 "-" 打头
Dictionary: 字典,通常由多个key与value构成 skill: Elite
也可以将key:value放置于{}中进行表示, 用,分隔多个key:value {name: Example Developer, job: Developer, skill: Elite}
YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构.
其结构(Structure)通过空格来展示,序列(Sequence)里的项用 "-" 来代表,Map里的键值对用":"分隔
children: children表示一个序列, name 和 age 表示序列中的一个数据项
- name: Jimmy Smith
age: 17
- name: Jenny Smith
age 13
Playbook介绍
playbook是由一个或多个 "play" 组成的列表
play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色.
所谓task无非是调用ansible的一个module. 将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制顺序执行
playbook变量介绍
1.普通(主机)变量 在inventory中定义主机时为其添加主机变量以便于在playbook中使用
[websrvs]
192.168.99.101 http_port=8080 hname=www1
192.168.99.102 http_port=80 hname=www2
2.组变量 组变量是指赋予给指定组内所有主机上的在playbook中可用的变量
[websrvs]
www1.magedu.com
www2.magedu.com
[websrvs:vars]
ntp_server=ntp.magedu.com
nfs_server=nfs.magedu.com
3.命令行指定变量
ansible websvrs –e http_port=8000 –m hostname –a 'name={{ hname }}{{ mark }}{{ http_port }}'
4.在playbook中定义
vars:
- var1: value1
- var2: value2
5.单独使用一个yaml文件定义所有的变量
vi myvars.yaml
var1: httpd
var2: vsftpd
var3: nginx
vi playbook.yaml
vars_files:
- myvars.yaml
task:
- name: install {{ var1 }} package
6.在role中定义
变量的优先级
1. 通过命令行指定变量,优先级最高 ansible-playbook –e varname=value
2. 在playbook中定义的变量
3.普通(主机)变量: 主机组中主机单独定义,优先级高于公共变量
4.公共(组)变量: 针对主机组中所有主机定义统一变量 优先级最低
变量的调用方式
通过 {{ variable_name }} 调用变量,且变量名前后必须有空格,有时用 "{{ variable_name }}" 才生效
yaml文件中的缩进是非常重要的,同一级别的必须写到同一个缩进,否则程序无法运行 yaml里面的task是按照次序依次执行,不会出现执行顺序不同的问题 一个name只能包含一个task(命令模块) #按照指定的task的顺序依次执行 #ansible的task中相对路径是相对于当前yaml文件的所在目录 [root@localhost playbook]# ansible-playbook test2.yaml PLAY [webservers] *************************************************************************************** TASK [Gathering Facts] ********************************************************************************** ok: [192.168.231.7] TASK [create new file] ********************************************************************************** changed: [192.168.231.7] TASK [create new user] ********************************************************************************** changed: [192.168.231.7] TASK [copy file] **************************************************************************************** changed: [192.168.231.7] TASK [start httpd] ************************************************************************************** changed: [192.168.231.7] PLAY RECAP ********************************************************************************************** 192.168.231.7 : ok=5 changed=4 unreachable=0 failed=0 [root@localhost playbook]# ansible-playbook test2.yaml --list-tasks playbook: test2.yaml play #1 (webservers): webservers TAGS: [] tasks: create new file TAGS: [] create new user TAGS: [] copy file TAGS: [] start httpd TAGS: [] [root@yxh6 conf]# netstat -ntlp | grep httpd tcp 0 0 :::9527 :::* LISTEN 8013/httpd --- - hosts: webservers remote_user: root tasks: - name: install httpd pagckage yum: name=httpd tags: installhttpd - name: copy conf file action copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes notify: restart httpd service - name: start httpd service service: name=httpd state=started enabled=yes tags: rshttpd
#tags inshttpd,rshttpd #通过ansible命令单独执行指定标签的task action命令,而不是执行整个playbook. #多个action可以共用一个标签 [root@localhost playbook]# ansible-playbook -t inshttpd,rshttpd handler.yaml --- - hosts: webservers remote_user: root tasks: - name: install httpd pagckage yum: name=httpd tags: installhttpd - name: copy conf file action copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes notify: restart httpd service - name: start httpd service service: name=httpd state=started enabled=yes tags: rshttpd
#ansible收集主机信息,同时也可以做为变量传递给playbook中 [root@localhost playbook]# ansible webservers -m setup [root@localhost playbook]# ansible webservers -m setup -a 'filter=*address*' #playbook中自定义变量{{ bialiangmin }} tasks: - name: install {{ packname }} pagckage yum: name={{ packname }} tags: installhttpd #执行的时候传递变量值 [root@localhost playbook]# ansible-playbook -e 'packname=vsftpd' bianliang.yaml [root@localhost playbook]# ansible-playbook -e 'packname=vsftpd packname2=redis' bianliang.yaml PLAY [webservers] *************************************************************************************** TASK [Gathering Facts] ********************************************************************************** ok: [192.168.231.6] TASK [install vsftpd pagckage] ************************************************************************* changed: [192.168.231.6] PLAY RECAP ********************************************************************************************** 192.168.231.6 : ok=2 changed=1 unreachable=0 failed=0 变量使用的第二种方式: - hosts: webservers remote_user: root vars: - packname: httpd - packname2: vsftpd 变量使用的第三种方式 在/etc/ansible/hosts中定义
1 --- 2 - hosts: webservers 3 remote_user: root 4 5 tasks: 6 - name: install httpd pagckage 7 yum: name=httpd 8 tags: installhttpd 9 - name: copy conf file action 10 copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes 11 notify: restart httpd service 12 - name: start httpd service 13 service: name=httpd state=started enabled=yes 14 tags: rshttpd 15 16 #handlers必须和notify配合使用,两者不能分开使用 17 handlers: 18 - name: restart httpd service 19 service: name=httpd state=restarted 20 - name: testaction 21 shell: ls