ansible自动化部署
- ansible
- ansible简介
- ansible安装部署
- ansible命令行模块
- command模块
- cron模块
- user用户模块
- group模块
- copy模块
- file模块
- ping模块
- yum模块
- service模块
- shell模块
- script模块
- setup模块
- Inventory(库存)中变量
ansible
ansible简介
- Ansible可以同时管理Redhat系的Linux,Debian系的Linux,以及Window主机。管理节点的只在执行脚本时与远程主机连接,没有特别的同步机制,所以断电等异常一般不会影响ansible
- ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、 chef、func、fabric) 的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能
- ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
- 连接插件connection plugins:负责和被监控端实现通信(远程连接通过ssh端口22)
- host inventory:指定操作的主机,是一个配置文件里面定义监控的主机
- 各种模块核心模块,command模块,自定义模块
- 借助于插件完成记录日志邮件等功能
- playbook: 剧本执行多个任务时,非必需可以让节点一次性运行多个任务
- ansible的架构:连接其它主机默认使用ssh协议
ansible安装部署
设备准备
管理服务器:20.0.0.13
被管理服务器1:20.0.0.16
被管理服务器2: 20.0.0.17
关闭所有防火墙
安装扩展源
[root@server3 ~]# yum install epel-release
[root@server3 ~]# yum -y install ansible
[root@server3 ~]# ansible --version #查看版本
[root@server3 ~]# yum -y install tree #安装树状结构 查看文件
[root@server3 ~]# tree /etc/ansible/
[root@server3 ~]# vi /etc/ansible/hosts #配置主机清单
#添加
[webserver]
20.0.0.16
[mysql]
20.0.0.17
配置密钥
[root@server3 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase): #密码123123
Enter same passphrase again: #密码123123
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:khEv7iRQhmJGAk7lNlgs2xPe2K4PyekF4V8qtVgZ7n0 root@server3
The key's randomart image is:
+---[RSA 2048]----+
|=oo+o . |
|=+== o |
|o+*==.o . |
| .o*++o+ |
| o+==.S |
| . X==. |
| B.*.. E |
| ..+ . |
| ... |
+----[SHA256]-----+
[root@server3 ~]# ls -a
[root@server3 ~]# cd .ssh/
[root@server3 .ssh]# ls
#对应 私钥 和 公钥
# 将公钥密码123456发送给被管理端1,2
20.0.0.16 20.0.0.17
[root@server3 .ssh]# ssh-copy-id root@20.0.0.16
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
Enter passphrase for key '/root/.ssh/id_rsa':
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
Enter passphrase for key '/root/.ssh/id_rsa':
root@20.0.0.16's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@20.0.0.16'"
and check to make sure that only the key(s) you wanted were added.
[root@server3 .ssh]# ssh-copy-id root@20.0.0.17
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@20.0.0.17's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@20.0.0.17'"
and check to make sure that only the key(s) you wanted were added.
在20.0.0.16服务器上查看
[root@amoeba ~]# ls -a
. .bashrc .ICEauthority .Xauthority 下载
.. .cache initial-setup-ks.cfg 公共 音乐
anaconda-ks.cfg .config .local 模板 桌面
.bash_history .cshrc .redhat 视频
.bash_logout .dbus .ssh 图片
.bash_profile .esd_auth .tcshrc 文档
[root@amoeba ~]# cd .ssh/
[root@amoeba .ssh]# ls
authorized_keys
[root@amoeba .ssh]# cat authorized_keys
设置免密登录
[root@server3 .ssh]# ssh-agent bash
[root@server3 .ssh]# ssh-add
Enter passphrase for /root/.ssh/id_rsa:
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
[root@server3 .ssh]# ansible all -m command -a 'date'
[root@server3 .ssh]# ansible all -m command -a 'ls /'
ansible命令行模块
command模块
[root@server3 .ssh]# ansible-doc -s command #查看当前模块可添加的参数信息
cron模块
[root@server3 .ssh]# ansible-doc -s cron #查看cron模块信息
两种状态
state=present #添加
state=absent #删除,移除
[root@server3 .ssh]# ansible mysql -m cron -a 'minute="*/1" job="/usr/bin/echo hello >> /opt/hello.txt" name="cron_hello"'
# 计划每隔1分钟产生字符串hello写入追加的标签为mysql(20.0.0.17)的/opt/hello.txt目录下,任务名为cron_hello
Enter passphrase for key '/root/.ssh/id_rsa': # 密码123123 上面设置的
20.0.0.17 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"cron_hello"
]
}
[root@server3 .ssh]# ansible mysql -a 'crontab -l' #查看计划任务列表
Enter passphrase for key '/root/.ssh/id_rsa':
20.0.0.17 | CHANGED | rc=0 >>
#Ansible: cron_hello
*/1 * * * * /usr/bin/echo hello >> /opt/hello.txt
在20.0.0.17服务器上查看
删除hello的任务计划
[root@server3 .ssh]# ansible mysql -m cron -a 'name="cron_hello" state=absent'
20.0.0.17 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": []
}
[root@server3 .ssh]# ansible mysql -a 'crontab -l'
20.0.0.17 | CHANGED | rc=0 >>
在20.0.0.17上查看是否已删除任务
user用户模块
user模块是请求的是
- useradd(增加)
- userdel(删除)
- usermod(用户属性修改)
查看两台服务器上是否有tree用户
创建用户
在ansible服务器上
[root@server3 .ssh]# ansible all -m user -a 'name="tree"'
在两台服务器上查看
删除用户
[root@server3 .ssh]# ansible webserver -m user -a 'name="tree" state=absent' #删除webserver上的用户
webserver上查看
删除成功
group模块
用于添加或删除组
group模块请求的是groupadd,groupdel,groupmod三个指令
[root@server3 ~]# ansible mysql -m group -a 'name=ky gid=1050 system=yes' # 在标签为mysql的服务器上创建属主为ky,组id为1050
在mysql服务器上查看
[root@client1 ~]# getent group | grep ky
进行用户属主,组设置调整
[root@server3 ~]# ansible mysql -m user -a 'name=tree uid=1050 system=yes group=ky'
查看
修改前后对比
copy模块
将管理端的文件复制到远程主机上
[root@server3 ~]# ansible mysql -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=tree mode=600'
#复制本地光盘自动挂载文件到标签为mysql(node2)上,目标位置/opt/fstab.bak,其属主为tree,权限为读写600
在mysql服务器上查看
[root@client1 ~]# cd /opt/
[root@client1 opt]# ls
[root@client1 opt]# ll
[root@client1 opt]# cat fstab.bak
[root@server3 ~]# ansible mysql -m copy -a 'content="this is my life" dest=/opt/life.txt' #创建具有内容的文件
查看
[root@client1 opt]# ls
[root@client1 opt]# cat life.txt
file模块
file文件管理:可以进行操作更改文件属性,创建软连接,创建,删除文件,创建目录
更改文件属性
[root@server3 ~]# ansible mysql -m file -a 'owner=root group=tree mode=755 path=/opt/fstab.bak'
#更改属主为root,属组为tree,权限为755,目标文件位置为/opt/fstab.bak
查看
创建软链接
[root@server3 ~]# ansible mysql -m file -a 'path=/fstab.link src=/opt/fstab.bak state=link'
#标签为mysql上创建软链接,文件位置为根目录下/fstab.link,源文件为/opt/fstab.bak .状态信息为链接
查看
删除文件
[root@server3 ~]# ansible mysql -m file -a 'path=/opt/fstab.bak state=absent'
查看
创建文件aaa
[root@server3 ~]# ansible mysql -m file -a 'path=/opt/aaa state=touch'
查看
ping模块
每次ansible在执行自动化部署前,需要做检查工作,查看所有节点是否与master管理端保持连通状态
[root@server3 ~]# ansible all -m ping
yum模块
在mysql上查看有无装httpd
在ansible服务器上
[root@server3 ~]# ansible mysql -m yum -a 'name=httpd'
查看
卸载httpd
[root@server3 ~]# ansible mysql -m yum -a 'name=httpd state=absent'
查看
service模块
标签为mysql上安装软件名为httpd
[root@server3 ~]# ansible mysql -m yum -a 'name=httpd'
[root@server3 ~]# ansible mysql -a 'systemctl status httpd'
#标签为mysql上查看httpd服务状态
20.0.0.17 | FAILED | rc=3 >> #rc不为0,表示状态异常,服务未开
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: man:httpd(8)
man:apachectl(8)non-zero return code
[root@server3 ~]# ansible mysql -m service -a 'name=httpd state=started enabled=true'
#标签为mysql上httpd服务状态开启,自启动
标签为mysql上防火墙状态为关闭
[root@server3 ~]# ansible mysql -m service -a 'name=firewalld state=stopped'
在ansible服务器上查看防火墙的状态
[root@server3 ~]# ansible mysql -a 'systemctl status firewalld'
浏览器上访问20.0.0.17
添加网页文件
[root@server3 ~]# ansible mysql -m copy -a 'content="hello world!" dest=/var/www/html/index.html'
继续访问
shell模块
- chdir:指定工作目录,在执行对应的命令时,会先进入到chdir参数指定的目录中(即cd命令)
条件判断:
- creates:指定一个文件,当指定的文件存在时,就不执行对应命令
- removes:使用此参数指定一个文件,当指定的文件不存在时,就不执行对应命令
[root@server3 ~]# ansible mysql -m command -a 'echo this is a > /opt/a.txt'
默认command模块不识别重定向符号
输出this is a重定向/opt/a.txt下
ansible mysql -m shell -a 'echo this is a > /opt/a.txt'
查看
script模块
在ansible管理服务器创建脚本
[root@server3 opt]# vi script.sh
#!/bin/bash
echo "hello world!" > /opt/script.txt
[root@server3 opt]# ll
[root@server3 opt]# chmod +x script.sh
[root@server3 opt]# ll
[root@server3 opt]# ansible all -m script -a 'script.sh'
被控制器上查看
setup模块
获取节点信息
Inventory(库存)中变量
- ansible默认的主机清单是/etc/ansible/hosts文件
主机清单可以手动设置,也可以通过Dynamic Inventory动态生成 - url http://www.baidu.com:80/new
url:资源定位
协议://主机名.二级域名.顶级域名.(根域):端口/虚拟目录 - 一般主机名使用FQDN(完全合格域名):www.baidu.com (主机名+域名)
- 域名:baidu.com
进入主机清单
[root@server3 ~]# vi /etc/ansible/hosts