Ansible自动化运维
- 一、Ansible简介
- 二、Ansible准备工作
- 1.域名解析
- 2.安装软件
- 3.客户机1免密登录
- 4.客户机密码登录
- 三、inventory(主机库)
- 1.增加主机组
- 2.增加用户,密码
- 3.增加端口
- 4.增加组变量
- 5.增加子分组
- 四、Ad-Hoc(点对点模式)
- 1.复制模块
- 2.用户模块
- 3.软件包模块
- 4.服务模块
- 5.文件模块
- 6.收集模块
- 7.Shell模块(非常简便)
- 五、YAML(非标记语言)
- 1.简介
- 2.实例
- 2.1清理环境
- 2.2编写及测试剧本
- 2.4完善
- 六、role (角色)
- 1.简介
- 2.实例
- 2.1目录结构
- 2.2编写任务
- 2.3编写配置文件
- 2.4编写变量
- 2.5编写触发点
- 2.6编写剧本
- 2.7测试实施
一、Ansible简介
Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
二、Ansible准备工作
准备3台机器,一台做主服务器,两台做客户机(其中一台免密登录,另一台正常登录)
1.域名解析
2.安装软件
- 列出所有软件
- 列出配置文件
- 查看帮助
ansible --help
3.客户机1免密登录
- 生成秘钥
- 传递秘钥
- 测试
4.客户机密码登录
- 定义主机清单
vim /etc/ansible/hosts
- 使用 “ping”模块 测试host1 host2 这个ping模块 与 ping命令是不一样的 Ansible ping模块 利用的是 sshd的服务 而ping命令是测试两台主机是否连通
host1测试连接成功
- 发现hosts2失败 ,这是因为还没有让Ansible 知道密码 不能进行登录
- 使用-k 属性 来输入密码
- 去掉yes/no的询问
vim /etc/ssh/ssh_config
三、inventory(主机库)
1.增加主机组
将host1 host2 放入一个组中
2.增加用户,密码
在客户机上查看用户
3.增加端口
vim /etc/ssh/sshd_config
systemctl restart sshd
4.增加组变量
5.增加子分组
[apache]
host[1]
[nginx]
host[2]
[webserver:children]
apache
nginx
[webserver:vars]
ansible_ssh_user='root'
ansible_ssh_pass='666666'
四、Ad-Hoc(点对点模式)
- 临时的,在ansible中是指需要快速执行的单条命令,并且不需要保存的命令。对于复杂的命令则为 playbook。
1.复制模块
帮助文档
ansible-doc copy
ansible webserver -m copy -a 'src=/etc/hosts dest=/tmp/ '
2.用户模块
- 创建用户
ansible webserver -m user -a'name="lisi" state="present" '
- 删除用户
ansible webserver -m user -a 'name="lisi" state="absent" '
- 修改密码
echo '777777' | openssl passwd -1 -stdin
ansible webserver -m user -a 'name="wangwu" password="$1$C4sfsWbW$WZ8afyvONqzk3NzGU7tNb0" '
使用密码“777777”登录
- 修改shell
ansible webserver -m user -a 'name="wangwu" shell=/sbin/nologin append=yes '
无法登陆
3.软件包模块
ansible webserver -m yum -a 'name="httpd" state="latest" '
4.服务模块
- 批量开启服务
ansible webserver -m service -a 'name="httpd" state="started"'
- 批量设置开机自启
ansible webserver -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'
5.文件模块
- 创建文件
ansible webserver -m file -a 'path=/tmp/888.txt mode=777 state=touch'
- 批量创建目录
ansible webserver -m file -a 'path=/tmp/dir1 mode=777 state=directory'
6.收集模块
- 查询host1所有信息
ansible host1 -m setup
7.Shell模块(非常简便)
但最好还是用本身归属的模块
- 显示所有用户名
ansible webserver -m shell -a 'hostname' -o
- 批量安装软
ansible webserver -m shell -a 'yum -y install elinks' -o
五、YAML(非标记语言)
1.简介
YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。
YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲
注意
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- '#'表示注释
2.实例
目的:通过YAML来实现部署,配置,启动一个web网站的需求
2.1清理环境
- 清理环境并在服务器上安装httpd服务
ansible webserver -m yum -a 'name=httpd state=absent
2.2编写及测试剧本
- hosts: webserver
tasks:
- name: install httpd
yum: name=httpd state=present
- name: copy copy: src=/root/apache/httpd.conf dest=/etc/httpd/conf/httpd.conf
- name: start service
service: name=httpd state=started enable=yes
- 测试剧本是否可用
ansible-playbook apache.yaml --syntax-check
- 测试剧本任务清单
ansible-playbook apache.yaml --list-tasks
- 测试剧本主机
ansible-playbook apache.yaml --list-hosts
- 运行剧本
ansible-playbook apache.yaml
成功
- 访问网站 这里端口号 我设置的为8080 所以访问的时候需要在ip地址后加端口号
2.4完善
再次修改端口号的时候 会发现客户机的端口号 并未改变 ,页面没有生效,这是因为客户机没有重新启动服务,所以我们添加一个触发任务:一旦配置文件被修改后,就会触发notify 就会执行handler任务
这里要注意的是 notify后面的内容一定要和handler 的 name 的内容一致
- 运行剧本
- 查看网页,发现之前的等不上去了
- 切换端口号
成功!
六、role (角色)
1.简介
roles则是在ansible中,playbooks的目录组织结构。将代码或文件进行模块化,成为roles的文件目录组织结构,易读,代码可重用,层次清晰。
2.实例
需求:部署,测试Nginx
2.1目录结构
- 准备目录结构
mkdir roles/nginx/{files,handlers,tasks,templates,vars} -p
touch roles/site.yaml roles/nginx/{handlers,tasks,vars}/main.yaml
echo 20200914 welcome > roles/nginx/files/index.html
yum install -y nginx
cp/etc/nginx/nginx.confroles/nginx/templates/nginx.conf.j2
2.2编写任务
---
- name: install epel-release package
yum: name=epel-release state=latest
- name: install nginx package
yum: name=nginx state=latest
- name: copy index.html
cpoy: 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
- name: service running
service: name=nginx state=started enabled=yes
2.3编写配置文件
2.4编写变量
2.5编写触发点
# vim roles/nginx/handlers/main.yaml
# 在触发点文件中写
---
- name: restart nginx
service: name=nginx state=restarted
vim roles/nginx/tasks/main.yaml
---
- name: copy nginx.conf template
template: src=nginx.conf.j2 dest= /etc/nginx/nginx.conf
notify: restart nginx
2.6编写剧本
vim roles/site.yaml
- hosts: webserver
roles:
- nginx
2.7测试实施
没有报错
成功!