Ansible 自动化运维实战

1.abstract-简介

1.png

介绍

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
无客户端。
我们要学一些Ansible的安装和一些基本概念,然后我们会开始研究一些真正有意思的东西 – playbook,配置管理,部署以及语法编排.我们将会学习如何使用/usr/bin/ansible执行ad-hoc并行命令,我们还会学习ansible的核心有什么样的模块可供使用.当然以后你也可以写你自己的模块,我们会在后期讲到.

工作原理

2.png

2.install-部署

1.dns resolve

环境

ansible服务器
10.18.41.64
ansible客户机
10.18.41.84
10.18.41.82
10.18.41.83
10.18.41.95

ansible服务器

域名解析

[ansible-server]#vim /etc/hosts
192.168.0.107 ansible
192.168.0.116 host1
192.168.0.117 host2
192.168.0.118 host3
192.168.0.119 host4
ansible客户机

无需配置
IP
YUM源

2.install ansible

ansible服务器
yum install -y epel-release

安装epel源,如果您在非学校环境,请使用下方阿里YUM

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 
yum install -y ansible
rpm -ql ansible

列出所有文件

rpm -qc ansible

查看配置文件

ansible --help

查看ansible帮助

ansible-doc -l

看所有模块(A10,华为,docker,EC2,aws等等广大厂商设备)

ansible-doc -s yum

看yum模块,了解其功能

install (`present' or `installed', `latest'), or remove (`absent' or `removed')
yum list
 Package name
enablerepo

3.ssh-key(可选)

免密码ssh-key的方式。

ssh-keygen
ssh-copy-id IP地址

4.ansible基础

1.定义主机清单
vim /etc/ansible/hosts
host1
host2
host3

注意此处少一个主机。请留意

2.测试连通性
ansible   localhost   -m ping

测试host1连通性
-m 指定模块。什么功能
ping只是其中一个模块。还有shell,yum等等

3.简洁输出
ansible host1 -m ping  -o 
4.know_hosts
ansible host2 -m ping 
ansible host2 -m ping -u root -k -o 
去掉(yes/no)的询问
vim /etc/ssh/ssh_config
StrictHostKeyChecking no
ansible host2 -m ping -u root -k -o 

成功不提示

5.错误示范
ansible host4 -m ping -u root -k -o 

失败,主机清单未标注主机。

6.请注意ping和ssh

关闭host1主机的sshd进程,进行ping连通性测试。
结论ansible的ping,是探测ssh程序是否连接。

ansible host1 -m ping -u root -k
5.Inventory -主机清单

含义
清查;存货清单;财产目录;主机清单

1 增加主机组

官方链接
http://docs.ansible.com/ansible/intro_inventory.html#

vim /etc/ansible/hosts
[webserver]
host1
host2
host3
host4
ansible webservers  -m ping  -o
2 增加用户名 密码
vim /etc/ansible/hosts
[webserver]
host[1:4] ansible_ssh_user='root' ansible_ssh_pass='666666'

注意您的密码与教材中不同。

ansible webservers  -m ping -o

免用户名和密码成功
请思考主机和主机的用户名密码不同。如何设置?

[webservers]
host1 ansible_ssh_user='root' ansible_ssh_pass='777777'
host[2:4] ansible_ssh_user='root' ansible_ssh_pass='666666'
3 增加端口

请将host1的sshd程序端口修改为2222

vim /etc/ssh/sshd_config
Port 2222
ansible webservers -m ping -o

失败,因为默认端口已更改

vim /etc/ansible/hosts
[webserver]
host1 ansible_ssh_user='root' ansible_ssh_pass='777777' ansible_ssh_port='2222'
host[2:4] ansible_ssh_user='root' ansible_ssh_pass='666666'

请将用户名密码和端口回复原状

4 变量

ansible内部变量可以帮助我们简化主机清单的设置

vim /etc/ansible/hosts
[webserver]
host[1:4]
[webserver:vars]
ansible_ssh_user='root'
ansible_ssh_pass='666666'

常用变量

5 子分组

将不同的分组进行组合

vim /etc/ansible/hosts
[apache]
host[1:2]
[nginx]
host[3:4]
[webserver:children]
apache
nginx
[webserver:vars]
ansible_ssh_user='root'
ansible_ssh_pass='666666'
6 自定义主机列表
vim hostlist
[dockers]
host1
host2
[dockers:vars]
ansible_ssh_user='root'
ansible_ssh_pass='666666'

注意您的计算机密码

ansible -i  hostlist dockers  -m ping  -o
6.Ad-Hoc-点对点模式

简介
临时的,在ansible中是指需要快速执行的单条命令,并且不需要保存的命令。对于复杂的命令则为 playbook。

1.shell模块

帮助

ansible-doc shell
ansible webserver -m shell -a 'hostname' -o
获取主机名
ansible webserver -m shell -a 'hostname' -o -f 2
-f 2   指定线程数
-f FORKS, --forks=FORKS  Ansible一次命令执行并发的线程数。NUM被指定为一个整数,默认是5
                        specify number of parallel processes to use
                        (default=5)
ansible host2 -m shell -a 'yum -y install httpd' -o
部署apache
ansible host3 -m shell -a 'uptime' -o
查询系统负载
2.复制模块

帮助

ansible-doc copy
ansible webserver -m copy -a 'src=/etc/hosts dest=/tmp/2.txt owner=root group=bin mode=777'
ansible webserver -m copy -a 'src=/etc/hosts dest=/tmp/2.txt owner=root group=bin mode=777 backup=yes'
如果文件有多份,可以进行备份。
[root@localhost ~]# ls /tmp/
2.txt  2.txt.17037.2017-11-16@16:23:41~
3.用户模块

帮助

ansible-doc user

创建用户

ansible webserver -m user -a 'name=qianfeng state=present'
创建

删除用户

ansible webserver -m user -a 'name=qianfeng state=absent'
删除

修改密码
1.生成加密密码

echo '777777' | openssl passwd -1 -stdin

生成加密密码值

$1$XVzsJMDr$5wI4oUaQ.emxap6s.N272.

2.修改密码

ansible webserver -m user -a 'name=qianfeng password="$1$XVzsJMDr$5wI4oUaQ.emxap6s.N272."'
修改shell
ansible webserver -m user -a 'name=qianfeng shell=/sbin/noglogin append=yes'
追加
4.软件包管理

帮助

ansible-doc yum
ansible host1 -m yum -a 'name="*" state=latest'
升级所有包
ansible host2 -m yum -a 'name="httpd" state=latest'
安装apache
5.服务模块

帮助

ansible-doc service
ansible host2 -m service -a 'name=httpd state=started'
启动
ansible host2 -m service -a 'name=httpd state=started enabled=yes'
开机启动
ansible host2 -m service -a 'name=httpd state=stopped'
停止
ansible host2 -m service -a 'name=httpd state=restarted'
重启
ansible host2 -m service -a 'name=httpd state=started enabled=no'
开机禁止启动
6.文件模块

帮助

ansible-doc file
ansible host1 -m file -a 'path=/tmp/88.txt mode=777 state=touch'
创建文件
ansible host1 -m file -a 'path=/tmp/99 mode=777 state=directory'
7.收集模块

帮助

ansible-doc setup
ansible host3 -m setup
查询所有信息
ansible host3 -m setup -a 'filter=ansible_all_ipv4_addresses'
7.YAML-YAML Ain’t Markup Language-非标记语言

语法

列表

fruits:
- Apple
- Orange
- Strawberry
- Mango

字典

martin:
name: Martin D'vloper
job: Developer
skill: Elite

示例1

需求
通过YAML编写一个简单的剧本,完成web的部署,配置,启动的全过程。
ansible服务器

ansible all -m yum -a 'name=httpd state=removed' -o
清理一下环境
yum install -y httpd
准备配置文件
mkdir apache
cd apache
cp -rf /etc/httpd/conf/httpd.conf .
grep '^Listen' httpd.conf
Listen 8080
修改配置,用作推送
vim apache.yaml
- hosts: host2
  tasks:
  - name: install apache packages
    yum: name=httpd state=present
  - name: copy apache conf
    copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
  - name: ensure apache is running
    service: name=httpd state=started enabled=yes

测试:

ansible-playbook apache.yaml  --syntax-check
 检验语法
ansible-playbook apache.yaml --list-tasks
列出任务
ansible-playbook apache.yaml --list-hosts
 列出主机
ansible-playbook apache.yaml
执行
http://192.168.2.142:8080/
注意端口

handlers

如果配置文件发生变化。
Listen 9000

ansible-playbook apache.yaml
再次执行,命令成功,但配置未生效,所以要增加处理程序。设置触发器

vim apache.yaml


image.png

如果配置文件再发生变化。
Listen 9080

ansible-playbook apache.yaml
再次执行,配置生效,触发成功
8.Role-角色扮演

简介
roles则是在ansible中,playbooks的目录组织结构。
而模块化之后,成为roles的组织结构,易读,代码可重用,层次清晰。

目标

通过role远程部署nginx并配置

1.目录结构
image.png

准备目录结构

mkdir roles/nginx/{files,handlers,tasks,templates,vars} -p
touch roles/site.yaml roles/nginx/{handlers,tasks,vars}/main.yaml
echo 1234 > roles/nginx/files/index.html
yum install -y nginx && cp /etc/nginx/nginx.conf roles/nginx/templates/nginx.conf.j2
2.编写任务
vim roles/nginx/tasks/main.yaml
---
- name: install nginx packge
  yum: name={{ item }} state=latest
  with_items:
  - epel-release
  - nginx

- name: copy index.html
  copy: src=index.html dest=/usr/share/nginx/html/index.html

- name: copy nginx.conf template
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  notify: restart nginx

- name: make sure nginx service running
  service: name=nginx state=started enabled=yes

对迭代项的引用,固定变量名为"item”,使用with_item属性给定要迭代的元素;

3.准备配置文件
vim roles/nginx/templates/nginx.conf.j2
worker_processes  {{ ansible_processor_cores }};
调用内部已知变量
worker_connections {{ worker_connections }};
自定义变量
4.编写变量
vim roles/nginx/vars/main.yaml
worker_connections: 10240
5.编写处理程序
vim roles/nginx/handlers/main.yaml
---
- name: restart nginx
  service: name=nginx state=restarted
6.编写剧本
vim roles/site.yaml
- hosts: host4
  roles:
  - nginx
7.实施
ansible-playbook site.yaml --syntax-check
测试
ansible-playbook site.yaml
实施剧本
验证host4
9.Homework
了解行业背景知识

==采购服务器并托管==

  1. 了解DELL常见服务器的价格、型号、配置(CPU,内存、硬盘、支持的RAID功能)
  2. 了解HP常见服务器的价格、型号、配置(CPU,内存、硬盘、支持的RAID功能)
  3. 了解常见的硬盘接口类型、速率、价格如:ATA, SATA, SCSI, SAS, FC
  4. 了解国内主要是北京托管商的信息如:厂商名称、托管的价格、地理位置(光环新网/世纪互联)

==云主机==

  1. 了解青云qingcloud.com如价格、基本部署
  2. 了解阿里云价格、基本部署
  3. 了解阿亚马逊云价格、基本部署
  4. 了解腾讯云价格、基本部署

==DNS 解析==

  1. 了解国内主要的DNS ISP如万网、新网、DNSPOD、阿里DNS
  2. 申请自己的域名,学习在DNS管理界面上添加各种记录

==CDN 技术==
1.了解国内主要的3家CDN ISP,对比其价格、性能、市场的占有率等
2.了解主要CDN购买及使用方式
3.了解反向代理技术Varnish原理及部署
4.查看126.com,sina.com, baidu.com使用的代理机制

[root@tianyun ~]# curl -I http http://www.126.com

DELL R730

戴尔PowerEdge R730 机架式服务器(Xeon E5-2603 V3/8GB/1.2TB)

所属:
戴尔 PowerEdge R730 机架式
产品类别:机架式
CPU型号:Xeon E5-2603 v3 1.6GHz
标配CPU数量:1颗
内存容量:8GB DDR4
标配硬盘容量:1.2TB
内部硬盘架数:最大支持16块2.5英寸硬盘-使用1.2TB热插拔SAS硬盘最高可配19.2TB
网络控制器:四端口千兆网

¥1.18万 2019-02-07

DELL R740

戴尔PowerEdge R740 机架式服务器(R740-A420805CN)

所属:
戴尔 PowerEdge R740 机架式
产品类别:机架式
CPU型号:Xeon Bronze 3104 1.7GHz
标配CPU数量:1颗
内存容量:8GB DDR4
标配硬盘容量:600GB*2
内部硬盘架数:前置硬盘托架: 高达16×2.5"SAS/SATA/SSD,最大60TB 高达8×3.5"SAS/SATA,最大80TB
网络控制器:QLogic FastL 

¥1.84万 2019-02-07

DELL R940

戴尔PowerEdge R940 机架式服务器(R940-A420813CN)

所属:
戴尔 PowerEdge R940 机架式
产品类别:机架式
CPU型号:Xeon Gold 5120 2.2GHz
标配CPU数量:2颗
内存容量:32GB DDR4
标配硬盘容量:1.2TB
内部硬盘架数:最大支持8块2.5英寸硬盘
网络控制器:Broadcom 572 

¥8.82万 2019-02-07

如何不同的用户登录不同的主机?

在主机清单里设置

[webservers`]
asdf.example.com  ansible_port=5000   ansible_user=alice  ansible_pass=123456
jkl.example.com   ansible_port=5001   ansible_user=bob   ansible_pass=654321

如何加密hosts主机清单文件

[root@node1 ansible]# cat db_hosts
localhost ansible_connection=local
[root@node1 ansible]# ansible-vault encrypt db_hosts 
New Vault password: 
Confirm New Vault password: 
Encryption successful
[root@node1 ansible]# ansible -i db_hosts localhost -m ping
ERROR! Decryption failed
Decryption failed
[root@node1 ansible]# ansible -i db_hosts --ask-vault-pass localhost -m ping
Vault password: 
localhost | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
[root@node1 ansible]# cat db_hosts 
$ANSIBLE_VAULT;1.1;AES256
61663966666265363465653064386666326234353433346163633838366532366236313032303636
6437313333333936396164663031633566613233343161650a333163333732616130343762636135
30303864663138643661393234336433313465623830333832663165393964353961323261373130
3135626236626435640a396338616563646532623966333337366365636665663563666432333539
61663632633130623733316232353836663366623136636432616332376266383263356264303765
6133616235363066356164653232326139643862653464623037

判断主机地址为10.18.46.37的主机。关闭该主机

- hosts: webserver
  tasks:
  - name: "shut down 10.18.46.37 systems"
    command: /usr/sbin/init 0
    when: ansible_all_ipv4_addresses == "10.18.46.37"

关闭两台呢?

- hosts: webserver
  tasks:
  - name: "shut down 10.18.46.37 systems"
    command: /usr/sbin/init 0
    when: (ansible_all_ipv4_addresses == "10.18.46.37") or(ansible_all_ipv4_addresses == "10.18.46.47")

循环创建多个用户

- hosts: host2
  tasks:
  - name: add several users
    user: name={{ item }} state=present groups=wheel
    with_items:
       - testuser1
       - testuser2
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351