自动化运维工具Ansible部署与叙述
ansible概述和运行机制
Ansible 在管理节点将 Ansible 模块通过 SSH 协议推送到被管理端执行,执行完之后自动删除,可以使用 SVN 等来管理自定义模块及编排。
由上面的图可以看到 Ansible 的组成由 5 个部分组成:
Ansible : ansible核心
Modules : 包括 Ansible 自带的核心模块及自定义模块
Plugins : 完成模块功能的补充,包括连接插件、邮件插件等
Playbooks : 剧本;定义 Ansible 多任务配置文件,由Ansible 自动执行
Inventory : 定义 Ansible 管理主机的清单 [ˈɪnvəntri] 清单
安装ansible管理两个节点
1安装ansible服务
ansible 服务端 ip240 192.168.14.240
ansible节点1:ip240 192.168.14.240
ansible节点2:ip197 192.168.13.197
在ip240上安装ansible
1、设置EPEL仓库
Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库。
[[email protected] yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo
http://mirrors.aliyun.com/repo/Centos-7.repo
[[email protected] yum.repos.d]# yum clean all
[[email protected] yum.repos.d]# yum makecache
[[email protected] ~]# yum install epel-release -y
2、 使用yum安装Ansible
[[email protected] ~]#yum install ansible -y
此处需要等待很久
2.ansible的命令参数
anisble命令语法: ansible [-i 主机文件] [-f 批次] [组名] [-m 模块名称] [-a 模块参数]
ansible详细参数:
-v,–verbose # 详细模式,如果命令执行成功,输出详细的结果 (-vv –vvv -vvvv)
*** -i PATH, -inventory=PATH #指定 host 文件的路径,默认在 /etc/ansible/hosts ***
inventory [ˈɪnvəntri] 库存
-f NUM,-forks=NUM # NUM 是指定一个整数,默认是 5 ,指定 fork 开启同步进程的个数。
-m NAME,-module-name=NAME # 指定使用的 module 名称,默认使用 command模块
-a,MODULE_ARGS #指定 module 模块的参数
-k,-ask-pass #提示输入 ssh 的密码,而不是使用基于 ssh 的**认证
-sudo # 指定使用 sudo 获得 root 权限
-K,-ask-sudo-pass #提示输入 sudo 密码,与 -sudo 一起使用
-u USERNAME,-user=USERNAME # 指定移动端的执行用户
-C,–check #测试此命令执行会改变什么内容,不会真正的去执行
ansible-doc详细参数:
ansible-doc -l #列出所有的模块列表
ansible-doc -s 模块名 #查看指定模块的参数 -s, --snippet # [ˈsnɪpɪt] 片断
例:[[email protected] ~]# ansible-doc -s service
3. 定义主机清单
1、基于端口,用户,密码定义主机清单
ansible基于ssh连接-i (inventory)参数后指定的远程主机时,也可以写端口,用户,密码。
格式:ansible_ssh_port:指定ssh端口 ansible_ssh_user:指定 ssh 用户 ansible_ssh_pass:指定 ssh 用户登录是认证密码(明文密码不安全) ansible_sudo_pass:指明 sudo 时候的密码
例: [[email protected] ~]# vim /etc/ansible/hosts
#文件 /etc/ansible/hosts 维护着Ansible中服务器的清单。在文件最后追加以下内容
[web-servers] #主机组名
192.168.13.197 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
测试主机和服务器之间的连通性
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m ping
*** -i # 指定 host 文件的路径,默认是在 /etc/ansible/hosts
-m # 指定使用的ping模块***
如果报错:192.168.14.240 | FAILED! => {
“msg”: “Using a SSH password instead of a key is not possible because Host Key
checking is enabled and sshpass does not support this. Please add this host’s fingerprint to
your known_hosts file to manage this host.”
}
解决方式:ssh [email protected]
2、基于ssh**来访问定义主机清单
一般来说,使用明文密码不安全,所以增加主机无密码访问。
[[email protected] ~]#ssh-****** #一路回车
使用ssh-copy-id命令来复制Ansible公钥到节点:xuegod63和xuegod63
[[email protected] ~]# ssh-copy-id [email protected]
[[email protected] ~]# ssh-copy-id [email protected]
测试一下:
[[email protected] ~]# ssh 192.168.13.197
[[email protected] ~]# exit
在Ansible服务端运行命令
ping模块检查网络连通性
command模块执行shell命令,command:作为ansible的默认模块,可以运行远程权限范围内的所有shell命令
例如:使用ping检查‘web-servers’或者ansible节点的连通性。
[[email protected] ~]# ansible -i /etc/ansible/hosts ‘web-servers’ -m ping
[DEPRECATION WARNING]: The TRANSFORM_INVALID_GROUP_CHARS settings is set to allow bad characters in
group names by default, this will change, but still be user configurable on deprecation. This feature
will be removed in version 2.10. Deprecation warnings can be disabled by setting
deprecation_warnings=False in ansible.cfg.
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.13.197 | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: false,
“ping”: “pong”
}
192.168.14.240 | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: false,
“ping”: “pong”
}
例如:检查Ansible节点的运行时间(uptime)
[[email protected] ~]# ansible -m command -a “uptime” ‘web-servers’
[DEPRECATION WARNING]: The TRANSFORM_INVALID_GROUP_CHARS settings is set to allow bad characters in
group names by default, this will change, but still be user configurable on deprecation. This feature
will be removed in version 2.10. Deprecation warnings can be disabled by setting
deprecation_warnings=False in ansible.cfg.
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.13.197 | CHANGED | rc=0 >>
15:28:16 up 1:26, 4 users, load average: 0.00, 0.01, 0.05
192.168.14.240 | CHANGED | rc=0 >>
16:45:04 up 1:47, 5 users, load average: 0.00, 0.01, 0.05
例如:
将df命令在所有节点执行后,重定向输出到本机的/tmp/command-output.txt文件中
ansible常见模块的使用
1.常用模块
3个远程命令模块的区别
(1)command模块为ansible默认模块,不指定-m参数时,使用的就是command模块; comand模块比较简单,常见的命令都可以使用,但其命令的执行不是通过shell执行的,所以,像这些 “<”, “>”,
“|”, and "&"操作都不可以,当然,也就不支持管道; 缺点:不支持管道,没法批量执行命令;
(2)shell模块:使用shell模块,在远程命令通过/bin/sh来执行;所以,我们在终端输入的各种命令方式,都可以使用。
例如:
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m shell -a “free -m”
注:但是我们自己定义在/.bashrc或/.bash_profile中的环境变量shell模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句;
可以直接写在一句话中
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m shell -a “source ~/.bash_profile && df -h”
执行语句较多就需要写成脚本,即下一个模块
(3)、scripts模块
使用scripts模块可以在本地写一个脚本,在远程服务器上执行:
[[email protected] ~]# vim /etc/ansible/net.sh
hostname
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m script -a “/etc/ansible/net.sh”
2.使用copy模块拷贝文件到主机,类似scp
例子:
ansible主机上的/etc/hosts文件复制到主机组中机器的/tmp目录下
3、file模块设置文件属性。
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m file -a “path=/tmp/hosts mode=0777”
4、stat模块获取远程文件信息
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m stat -a “path=/tmp/hosts”
5、get_url模块实现远程主机下载指定url到本地,支持sha256sum文件校验。
例子:
下载epel-release-latest-7.noarch.rpm到主机清单中的/tmp/目录下
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m get_url -a “url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp/ mode=0440 force=yes”
6.yum 模块linux平台软件包管理
yum模块可以提供的status状态: latest ,present,installed #这3个代表安装;removed, absent #后面2个是卸载
例子:安装appache
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m yum -a “name=httpd state=latest”
7.cron模块远程主机crontab配置。
例子:增加每30分钟执行ls /tmp
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m cron -a "name=‘list dir’ minute=’*/30’ job=‘ls /tmp’ "
[[email protected] ~]# crontab -l
#Ansible: list dir
*/30 * * * * ls /tmp
8.service模块远程主机系统服务管理
service模块常用参数:
(1)、name参数:此参数用于指定需要操作的服务名称,比如 nginx,httpd。
(2)、state参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的httpd,则可以将
state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started stopped restarted(重启) reloaded。
enabled参数:此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。
注:想使用service模块启动服务,被启动的服务,必须可以使用service 命令启动或关闭
例子:远程启动httpd
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m service -a “name=httpd state=restarted”
9、sysctl模块远程主机sysctl配置。
例子:开启路由转发功能
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m sysctl -a “name=net.ipv4.ip_forward value=1 reload=yes”
[[email protected] ~]# cat /proc/sys/net/ipv4/ip_forward
1表示开启。
10、user模块远程主机用户管理
[[email protected] ~]# ansible -i /etc/ansible/hosts web-servers -m user -a “name=jjl state=present”
使用Playbook批量部署多台LAMP环境
1.playbook叙述
Playbook是一个不同于使用ansible命令行执行方式的模式,功能更强大更灵活。
playbooks使用步骤:
1、在playbooks 中定义任务:
- name: task description #任务描述信息
module_name: module_args #需要使用的模块名字: 模块参数
2、ansible-playbook 执行 命令:
playbook是由一个或多个"play"组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。
Playbook常用文件夹作用:
files:存放需要同步到异地服务器的源码文件及配置文件;
handlers:当服务的配置文件发生变化时需要进行的操作,比如:重启服务,重新加载配置文件; ['hændləz] 处理程序
meta:角色定义,可留空; ['metə] 元
tasks:需要进行的执行的任务; #任务
templates:用于执行lamp安装的模板文件,一般为脚本; ['templɪts] 模板
vars:本次安装定义的变量
2. LAMP部署
首先,可以在ansible服务器上安装LAMP环境,然后,再将配置文件通过ansible拷贝到远程主机上
第一步:安装httpd软件
[[email protected] ~]# yum install httpd -y
第二部:安装MySQL
[[email protected] ~]# yum install mariadb-server mariadb -y
[[email protected] ~]# rpm -qf /usr/bin/mysql
[[email protected] ~]# mkdir -p /mydata/data #创建目录作为数据存放的位置
[[email protected] ~]# chown -R mysql:mysql /mydata/
[[email protected] ~]# vim /etc/my.cnf #改变数据存放目
改:2 datadir=/var/lib/mysql
为:2 datadir=/mydata/data
[[email protected] ~]# systemctl start mariadb
第三步:安装PHP和php-mysql模块
[[email protected] ~]# yum install php php-mysql -y
第四步:提供php的测试页
[[email protected] ~]# vim /var/www/html/index.php
启动httpd服务,在浏览器中访问
[[email protected] ~]# systemctl restart httpd
[[email protected] ~]# iptables -F
3. 使用playbook创建一个LAMP构建的任务
1、创建相关文件
[[email protected] ~]# mkdir -pv /etc/ansible/lamp/roles/{prepare,httpd,mysql,php}/{tasks,files,templates,vars,meta,default,handlers}
我们将上面搭建成功的LAMP环境的httpd和MySQL的配置文件拷贝到对应目录下
[[email protected] ~]# cd /etc/ansible/
[[email protected] ~]# cp /etc/httpd/conf/httpd.conf lamp/roles/httpd/files/
[[email protected] ~]# cp /etc/my.cnf lamp/roles/mysql/files/
写prepare(前期准备)角色的playbooks
[[email protected] ansible]# vim lamp/roles/prepare/tasks/main.yml
2、构建httpd的任务
[[email protected] ansible]# cd /etc/ansible/lamp/roles
[[email protected] roles]# mv /var/www/html/index.php httpd/files/
[[email protected] roles]# vim httpd/tasks/main.yml
[[email protected] roles]# vim httpd/tasks/main.yml
notify: 这个action可用于在每个play的最后被触发,这样可以避免多次有改变发生时,每次都执行指定的操作,取而代之,仅在所有的变化发生完成后一次性地执行指定操作。
在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。
---- name: test.yml just for test
hosts: testserver
vars:
region: ap-southeast-1
tasks:
- name: template configuration
file template: src=template.j2 dest=/etc/foo.conf
notify:
- restart memcached
- restart apache
handlers:
- name: restart memcached
service: name=memcached state=restarted
- name: restart apache
service: name=apache state=restarted
handlers概述:
Handlers 也是一些 task 的列表,通过名字来引用,它们和一般的 task 并没有什么区别。
Handlers 是由通知者进行notify, 如果没有被 notify,handlers 不会执行。
不管有多少个通知者进行了notify,等到 play 中的所有 task 执行完成后,handlers 也只会被执行一次。
Handlers 最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了。
3、构建httpd的handlers
[[email protected] roles]# vim httpd/handlers/main.yml
4、部署我们的mariadb数据库
创建MySQL服务的任务,需要安装MySQL服务,改变属主信息,启动MySQL
[[email protected] roles]# vim mysql/tasks/main.yml
5、构建PHP的任务
[[email protected] roles]# vim php/tasks/main.yml
6、定义整个的任务
[[email protected] roles]# vim site.yml
开始部署
[[email protected] roles]# ansible-playbook -i /etc/ansible/hosts
/etc/ansible/lamp/roles/site.yml
浏览器测试成功。