自动化运维工具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仓库。
[root@ip240 yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo
http://mirrors.aliyun.com/repo/Centos-7.repo
[root@ip240 yum.repos.d]# yum clean all
[root@ip240 yum.repos.d]# yum makecache
[root@ip240 ~]# yum install epel-release -y
2、 使用yum安装Ansible
[root@ip240 ~]#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] 片断
例:[root@ip240 ~]# 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 时候的密码
例: [root@ip240 ~]# 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
测试主机和服务器之间的连通性
[root@ip240 ~]# 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 root@192.168.13.197

2、基于ssh密钥来访问定义主机清单
一般来说,使用明文密码不安全,所以增加主机无密码访问。
[root@ip240 ~]#ssh-keygen #一路回车
使用ssh-copy-id命令来复制Ansible公钥到节点:xuegod63和xuegod63
[root@ip240 ~]# ssh-copy-id root@192.168.14.240
[root@ip240 ~]# ssh-copy-id root@192.168.13.197
测试一下:
[root@ip240 ~]# ssh 192.168.13.197
[root@ip197 ~]# exit

在Ansible服务端运行命令

ping模块检查网络连通性
command模块执行shell命令,command:作为ansible的默认模块,可以运行远程权限范围内的所有shell命令

例如:使用ping检查‘web-servers’或者ansible节点的连通性。
[root@ip240 ~]# 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)
[root@ip240 ~]# 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来执行;所以,我们在终端输入的各种命令方式,都可以使用。
例如:
[root@ip240 ~]# ansible -i /etc/ansible/hosts web-servers -m shell -a “free -m”
注:但是我们自己定义在/.bashrc或/.bash_profile中的环境变量shell模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句;
可以直接写在一句话中
[root@ip240 ~]# ansible -i /etc/ansible/hosts web-servers -m shell -a “source ~/.bash_profile && df -h”
执行语句较多就需要写成脚本,即下一个模块
(3)、scripts模块
使用scripts模块可以在本地写一个脚本,在远程服务器上执行:
[root@ip240 ~]# vim /etc/ansible/net.sh
hostname
[root@ip240 ~]# ansible -i /etc/ansible/hosts web-servers -m script -a “/etc/ansible/net.sh”

2.使用copy模块拷贝文件到主机,类似scp

例子:
ansible主机上的/etc/hosts文件复制到主机组中机器的/tmp目录下
在这里插入图片描述

3、file模块设置文件属性。

[root@ip240 ~]# ansible -i /etc/ansible/hosts web-servers -m file -a “path=/tmp/hosts mode=0777”

4、stat模块获取远程文件信息

[root@ip240 ~]# 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/目录下
[root@ip240 ~]# 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
[root@ip240 ~]# ansible -i /etc/ansible/hosts web-servers -m yum -a “name=httpd state=latest”

7.cron模块远程主机crontab配置。

例子:增加每30分钟执行ls /tmp
[root@ip240 ~]# ansible -i /etc/ansible/hosts web-servers -m cron -a "name=‘list dir’ minute=’*/30’ job=‘ls /tmp’ "
[root@ip240 ~]# 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
[root@ip240 ~]# ansible -i /etc/ansible/hosts web-servers -m service -a “name=httpd state=restarted”

9、sysctl模块远程主机sysctl配置。

例子:开启路由转发功能
[root@ip240 ~]# ansible -i /etc/ansible/hosts web-servers -m sysctl -a “name=net.ipv4.ip_forward value=1 reload=yes”
[root@ip240 ~]# cat /proc/sys/net/ipv4/ip_forward
1表示开启。

10、user模块远程主机用户管理

[root@ip240 ~]# 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软件
[root@ip240 ~]# yum install httpd -y
第二部:安装MySQL
[root@ip240 ~]# yum install mariadb-server mariadb -y
[root@ip240 ~]# rpm -qf /usr/bin/mysql
[root@ip240 ~]# mkdir -p /mydata/data #创建目录作为数据存放的位置
[root@ip240 ~]# chown -R mysql:mysql /mydata/
[root@ip240 ~]# vim /etc/my.cnf #改变数据存放目
改:2 datadir=/var/lib/mysql
为:2 datadir=/mydata/data
[root@ip240 ~]# systemctl start mariadb
第三步:安装PHP和php-mysql模块
[root@ip240 ~]# yum install php php-mysql -y
第四步:提供php的测试页
[root@ip240 ~]# vim /var/www/html/index.php

<?php phpinfo(); ?>

启动httpd服务,在浏览器中访问
[root@ip240 ~]# systemctl restart httpd
[root@ip240 ~]# iptables -F

3. 使用playbook创建一个LAMP构建的任务

1、创建相关文件
[root@ip240 ~]# mkdir -pv /etc/ansible/lamp/roles/{prepare,httpd,mysql,php}/{tasks,files,templates,vars,meta,default,handlers}
我们将上面搭建成功的LAMP环境的httpd和MySQL的配置文件拷贝到对应目录下
[root@ip240 ~]# cd /etc/ansible/
[root@ip240 ~]# cp /etc/httpd/conf/httpd.conf lamp/roles/httpd/files/
[root@ip240 ~]# cp /etc/my.cnf lamp/roles/mysql/files/

写prepare(前期准备)角色的playbooks
[root@ip240 ansible]# vim lamp/roles/prepare/tasks/main.yml
在这里插入图片描述

2、构建httpd的任务
[root@ip240 ansible]# cd /etc/ansible/lamp/roles
[root@ip240 roles]# mv /var/www/html/index.php httpd/files/
[root@ip240 roles]# vim httpd/tasks/main.yml
[root@ip240 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
[root@ip240 roles]# vim httpd/handlers/main.yml
在这里插入图片描述

4、部署我们的mariadb数据库
创建MySQL服务的任务,需要安装MySQL服务,改变属主信息,启动MySQL
[root@ip240 roles]# vim mysql/tasks/main.yml
在这里插入图片描述
5、构建PHP的任务
[root@ip240 roles]# vim php/tasks/main.yml
在这里插入图片描述

6、定义整个的任务
[root@ip240 roles]# vim site.yml
在这里插入图片描述

开始部署
[root@ip240 roles]# ansible-playbook -i /etc/ansible/hosts
/etc/ansible/lamp/roles/site.yml
浏览器测试成功。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值