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 动态 inventory ansible 自动部署_bash

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

Ansible 动态 inventory ansible 自动部署_bash_02


Ansible 动态 inventory ansible 自动部署_bash_03


Ansible 动态 inventory ansible 自动部署_bash_04


配置密钥

[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.

Ansible 动态 inventory ansible 自动部署_bash_05


在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

Ansible 动态 inventory ansible 自动部署_bash_06


设置免密登录

[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 动态 inventory ansible 自动部署_服务器_07

ansible命令行模块

command模块

[root@server3 .ssh]# ansible-doc -s command #查看当前模块可添加的参数信息

Ansible 动态 inventory ansible 自动部署_bash_08


Ansible 动态 inventory ansible 自动部署_mysql_09

cron模块

[root@server3 .ssh]# ansible-doc -s cron   #查看cron模块信息

Ansible 动态 inventory ansible 自动部署_mysql_10


Ansible 动态 inventory ansible 自动部署_mysql_11


Ansible 动态 inventory ansible 自动部署_bash_12


Ansible 动态 inventory ansible 自动部署_服务器_13


Ansible 动态 inventory ansible 自动部署_bash_14


Ansible 动态 inventory ansible 自动部署_mysql_15

两种状态
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服务器上查看

Ansible 动态 inventory ansible 自动部署_服务器_16


删除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上查看是否已删除任务

Ansible 动态 inventory ansible 自动部署_服务器_17

user用户模块

user模块是请求的是

  • useradd(增加)
  • userdel(删除)
  • usermod(用户属性修改)

查看两台服务器上是否有tree用户

Ansible 动态 inventory ansible 自动部署_mysql_18

Ansible 动态 inventory ansible 自动部署_mysql_19


创建用户

在ansible服务器上

[root@server3 .ssh]# ansible all -m user -a 'name="tree"'

Ansible 动态 inventory ansible 自动部署_服务器_20


在两台服务器上查看

Ansible 动态 inventory ansible 自动部署_服务器_21


Ansible 动态 inventory ansible 自动部署_mysql_22


删除用户

[root@server3 .ssh]# ansible webserver -m user -a 'name="tree" state=absent'  #删除webserver上的用户

Ansible 动态 inventory ansible 自动部署_mysql_23


webserver上查看

Ansible 动态 inventory ansible 自动部署_服务器_24


删除成功

group模块

用于添加或删除组
group模块请求的是groupadd,groupdel,groupmod三个指令

[root@server3 ~]# ansible mysql -m group -a 'name=ky gid=1050 system=yes' # 在标签为mysql的服务器上创建属主为ky,组id为1050

Ansible 动态 inventory ansible 自动部署_服务器_25


在mysql服务器上查看

[root@client1 ~]# getent group | grep ky

Ansible 动态 inventory ansible 自动部署_bash_26


进行用户属主,组设置调整

[root@server3 ~]# ansible mysql -m user -a 'name=tree uid=1050 system=yes group=ky'

Ansible 动态 inventory ansible 自动部署_服务器_27


查看

修改前后对比

Ansible 动态 inventory ansible 自动部署_bash_28

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

Ansible 动态 inventory ansible 自动部署_mysql_29


在mysql服务器上查看

[root@client1 ~]# cd /opt/
[root@client1 opt]# ls
[root@client1 opt]# ll
[root@client1 opt]# cat fstab.bak

Ansible 动态 inventory ansible 自动部署_mysql_30

[root@server3 ~]# ansible mysql -m copy -a 'content="this is my life" dest=/opt/life.txt'  #创建具有内容的文件

Ansible 动态 inventory ansible 自动部署_服务器_31


查看

[root@client1 opt]# ls
[root@client1 opt]# cat life.txt

Ansible 动态 inventory ansible 自动部署_服务器_32

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

Ansible 动态 inventory ansible 自动部署_bash_33


查看

Ansible 动态 inventory ansible 自动部署_mysql_34


创建软链接

[root@server3 ~]# ansible mysql -m file -a 'path=/fstab.link src=/opt/fstab.bak state=link'
#标签为mysql上创建软链接,文件位置为根目录下/fstab.link,源文件为/opt/fstab.bak .状态信息为链接

Ansible 动态 inventory ansible 自动部署_bash_35


查看

Ansible 动态 inventory ansible 自动部署_服务器_36


删除文件

[root@server3 ~]# ansible mysql -m file -a 'path=/opt/fstab.bak state=absent'

Ansible 动态 inventory ansible 自动部署_bash_37


查看

Ansible 动态 inventory ansible 自动部署_mysql_38


创建文件aaa

[root@server3 ~]# ansible mysql -m file -a 'path=/opt/aaa state=touch'

Ansible 动态 inventory ansible 自动部署_服务器_39


查看

Ansible 动态 inventory ansible 自动部署_mysql_40

ping模块

每次ansible在执行自动化部署前,需要做检查工作,查看所有节点是否与master管理端保持连通状态

[root@server3 ~]# ansible all -m ping

Ansible 动态 inventory ansible 自动部署_bash_41

yum模块

在mysql上查看有无装httpd

Ansible 动态 inventory ansible 自动部署_mysql_42


在ansible服务器上

[root@server3 ~]# ansible mysql -m yum -a 'name=httpd'

Ansible 动态 inventory ansible 自动部署_mysql_43


查看

Ansible 动态 inventory ansible 自动部署_服务器_44


卸载httpd

[root@server3 ~]# ansible mysql -m yum -a 'name=httpd state=absent'

Ansible 动态 inventory ansible 自动部署_mysql_45


查看

Ansible 动态 inventory ansible 自动部署_服务器_46

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服务状态开启,自启动

Ansible 动态 inventory ansible 自动部署_服务器_47


标签为mysql上防火墙状态为关闭

[root@server3 ~]# ansible mysql -m service -a 'name=firewalld state=stopped'

Ansible 动态 inventory ansible 自动部署_服务器_48


在ansible服务器上查看防火墙的状态

[root@server3 ~]# ansible mysql -a 'systemctl status firewalld'

Ansible 动态 inventory ansible 自动部署_服务器_49


浏览器上访问20.0.0.17

Ansible 动态 inventory ansible 自动部署_bash_50


添加网页文件

[root@server3 ~]# ansible mysql -m copy -a 'content="hello world!" dest=/var/www/html/index.html'

Ansible 动态 inventory ansible 自动部署_服务器_51


继续访问

Ansible 动态 inventory ansible 自动部署_mysql_52

shell模块

  • chdir:指定工作目录,在执行对应的命令时,会先进入到chdir参数指定的目录中(即cd命令)

条件判断:

  • creates:指定一个文件,当指定的文件存在时,就不执行对应命令
  • removes:使用此参数指定一个文件,当指定的文件不存在时,就不执行对应命令
[root@server3 ~]# ansible mysql -m command -a 'echo this is a > /opt/a.txt'

Ansible 动态 inventory ansible 自动部署_mysql_53


默认command模块不识别重定向符号

输出this is a重定向/opt/a.txt下

ansible mysql -m shell -a 'echo this is a > /opt/a.txt'

Ansible 动态 inventory ansible 自动部署_mysql_54


查看

Ansible 动态 inventory ansible 自动部署_bash_55

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'

Ansible 动态 inventory ansible 自动部署_服务器_56


Ansible 动态 inventory ansible 自动部署_mysql_57


被控制器上查看

Ansible 动态 inventory ansible 自动部署_bash_58


Ansible 动态 inventory ansible 自动部署_服务器_59

setup模块

获取节点信息

Ansible 动态 inventory ansible 自动部署_mysql_60

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

Ansible 动态 inventory ansible 自动部署_mysql_61