自动化运维工具Ansible的部署

一、初识ansible

当下有许多的运维自动化工具( 配置管理 ),例如:Ansible、SaltStack、Puppet、Fabric 等。

Ansible 一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,是 AnsibleWorks 公司名下的项目,该公司由 Cobbler 及 Func 的作者于 2012 年创建成立。

Ansible 基于 Python 语言实现,由 Paramiko 和 PyYAML 两个关键模块构建。

Ansible 特点:

部署简单,只需在主控端部署 Ansible 环境,被控端无需做任何操作。
默认使用 SSH(Secure Shell)协议对设备进行管理。
主从集中化管理。
配置简单、功能强大、扩展性强。
支持 API 及自定义模块,可通过 Python 轻松扩展。
通过 Playbooks 来定制强大的配置、状态管理。
对云计算平台、大数据都有很好的支持。
提供一个功能强大、操作性强的 Web 管理界面和 REST API 接口 —- AWX 平台。

Ansible 与 SaltStack

最大的区别是 Ansible 无需在被监控主机部署任何客户端代理,默认通过 SSH 通道进行远程命令执行或下发配置。
相同点是都具备功能强大、灵活的系统管理、状态配置,都使用 YAML 格式来描述配置,两者都提供丰富的模板及 API,对云计算平台、大数据都有很好的支持。

二、ansible部署

实验环境rhel6.5
server1 :172.25.62.1
解决依赖性问题:

python-jinja2-26-2.6-3.el6.noarch.rpm    python-keyczar-0.71c-1.el6.noarch.rpm
libyaml-0.1.6-1.el6.x86_64.rpm           python-six-1.9.0-2.el6.noarch.rpm
python-crypto2.6-2.6.1-2.el6.x86_64.rpm  PyYAML-3.10-3.el6.x86_64.rpm
python-httplib2-0.7.7-1.el6.noarch.rpm   sshpass-1.05-1.el6.x86_64.rpm

安装release包,会生成.repo的yum源配置文件

[root@server1 rhel6]# yum  install  epel-release-6-5.noarch.rpm -y

使server1可以上网

[root@server1 rhel6]# route add default gw  172.25.62.250
[root@server1 rhel6]# vim  /etc/resolv.conf
nameserver 114.114.114.114
[root@server1 rhel6]# vim  /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@server1 rhel6]# sysctl -p
[root@foundation62 repodata]# iptables -t nat  -I  POSTROUTING -s 172.25.62.0/24  -j  MASQUERADE

这里写图片描述
安装ansible

[root@server1 rhel6]# yum install  -y ansible
[root@server1 rhel6]# rpm -qa |grep ansible
ansible-2.6.2-1.el6.noarch

ansible的配置文件

[root@server1 rhel6]# rpm -qc  ansible
/etc/ansible/ansible.cfg
/etc/ansible/hosts

ansible的配置文件手册
设置ansible主机

[root@server1 rhel6]# vim  /etc/ansible/hosts

这里写图片描述
设置ssh免密登录

[root@server1 ~]# ssh-keygen
[root@server1 .ssh]# ssh-copy-id -i id_rsa.pub  [email protected]
[root@server1 .ssh]# scp * server2:
[root@server1 .ssh]# scp * server3:

测试 Ansible
all 为操作 hosts 文件中所有主机 ,-m 指定执行 ping 模块,下面是返回结果
这里写图片描述

ansible 命令详解
Usage: ansible <host-pattern> [options]
命令选项

-a # 模块的参数。
-B # 异步运行时,多长时间超时。
-P    #如果使用-B,则设置轮询间隔。
-C # 只是测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化。
-D # 当更改文件和模板时,显示这些文件得差异,比–check效果好。
-f # 指定定要使用的并行进程数,默认为5个。
-i # 指定主机清单文件或逗号分隔的主机,默认为/etc/ansible/hosts。
-l # 进一步限制所选主机/组模式,只执行-l 后的主机和组。 也可以这样使用 -l @retry_hosts.txt
-m   # 要执行的模块,默认为command。
-M   # 要执行的模块的路径。
-o   # 压缩输出,摘要输出.尝试一切都在一行上输出。
-v, –verbose # 输出执行的详细信息,使用-vvv获得更多,-vvvv 启用连接调试
–version # 显示程序版本号
-e –extra-vars=EXTRA_VARS # 添加附加变量,比如key=value,yaml,json格式。
–list-hosts # 输出将要操作的主机列表,不会执行操作
–output=OUTPUT_FILE # 加密或解密输出文件名 用于标准输出。
–tree=TREE # 将日志内容保存在该目录中,文件名以执行主机名命名。
–syntax-check # 对playbook进行语法检查,且不执行playbook。
–ask-vault-pass # vault 密码。
–vault-password-file=VAULT_PASSWORD_FILE vault密码文件
–new-vault-password-file=NEW_VAULT_PASSWORD_FILE 新vault密钥文件。

连接选项:

-k –ask-pass # 要求用户输入请求连接密码
-u –user=REMOTE_USER # 连接远程用户
-c –connection=CONNECTION # 连接类型,默认smart,支持local ssh 和 paramiko
-T –timeout=TIMEOUT # 指定默认超时时间,默认是10S
–ssh-common-args=SSH_COMMON_ARGS # 指定要传递给sftp / scp / ssh的常见参数 (例如 ProxyCommand)
–sftp-extra-args=SFTP_EXTRA_ARGS # 指定要传递给sftp,例如-f -l
–scp-extra-args=SCP_EXTRA_ARGS # 指定要传递给scp,例如 -l
–ssh-extra-args=SSH_EXTRA_ARGS # 指定要传递给ssh,例如 -R
–private-key=PRIVATE_KEY_FILE, –key-file=PRIVATE_KEY_FILE 私钥路径,使用这个文件来验证连接

特权升级选项:

-s –sudo # 使用sudo (nopasswd)运行操作, 不推荐使用
-U –sudo-user=SUDO_USER # sudo 用户,默认为root, 不推荐使用
-S –su # 使用su运行操作 不推荐使用
-R –su-user=SU_USER # su 用户,默认为root,不推荐使用
-b –become # 运行操作
–become-method=BECOME_METHOD
–become-user=BECOME_USER # 使用哪个用户运行,默认为root
–ask-sudo-pass # sudo密码,不推荐使用
–ask-su-pass # su密码,不推荐使用
-K –ask-become-pass # 权限提升密码

查看ansible主机网络参数

[root@server1 ~]# ansible all -m command -a 'ifconfig'
172.25.62.2 | SUCCESS | rc=0 >>
eth0      Link encap:Ethernet  HWaddr 52:54:00:92:82:EA  
          inet addr:172.25.62.2  Bcast:172.25.62.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe92:82ea/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:777 errors:0 dropped:0 overruns:0 frame:0
          TX packets:491 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:290903 (284.0 KiB)  TX bytes:70872 (69.2 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:344 (344.0 b)  TX bytes:344 (344.0 b)

172.25.62.3 | SUCCESS | rc=0 >>
eth0      Link encap:Ethernet  HWaddr 52:54:00:0F:5A:DE  
          inet addr:172.25.62.3  Bcast:172.25.62.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe0f:5ade/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:579 errors:0 dropped:0 overruns:0 frame:0
          TX packets:453 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:275238 (268.7 KiB)  TX bytes:66699 (65.1 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:21604 errors:0 dropped:0 overruns:0 frame:0
          TX packets:21604 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1413794 (1.3 MiB)  TX bytes:1413794 (1.3 MiB)

shell模块在远程主机上调用shell解释器运行命令,支持shell的各种功能 :

[root@server1 ~]# ansible all -m  shell -a 'tail /etc/passwd'
172.25.62.3 | SUCCESS | rc=0 >>
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false

172.25.62.2 | SUCCESS | rc=0 >>
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
zabbix:x:498:499:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin

copy:复制文件到远程主机,可以改权限等
复制文件,指定路径 -a "src= dest= " 给定内容生成文件 -a "content= dest= "

[root@server1 ~]# cat file 
linux123
[root@server1 ~]# ansible server -m copy -a 'src="/root/file" dest=/root/'
172.25.62.3 | SUCCESS => {
    "changed": true, 
    "checksum": "e490d33f7d175213a81b2d9036790aa2978b20c6", 
    "dest": "/root/file", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "160ce331cdfec81cfda3d44fe496aa4b", 
    "mode": "0644", 
    "owner": "root", 
    "size": 9, 
    "src": "/root/.ansible/tmp/ansible-tmp-1534422715.75-41606256875970/source", 
    "state": "file", 
    "uid": 0
}
172.25.62.2 | SUCCESS => {
    "changed": true, 
    "checksum": "e490d33f7d175213a81b2d9036790aa2978b20c6", 
    "dest": "/root/file", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "160ce331cdfec81cfda3d44fe496aa4b", 
    "mode": "0644", 
    "owner": "root", 
    "size": 9, 
    "src": "/root/.ansible/tmp/ansible-tmp-1534422715.72-265307589180905/source", 
    "state": "file", 
    "uid": 0
}

在server端查看
这里写图片描述

file 设置文件属性:

创建目录:-a “path= state=directory”
创建链接文件:-a “path= src= state=link”
删除文件:-a “path= state=absent”

state:
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件

例:在ansible_host建立目录

[root@server1 ~]# ansible server -m file -a 'path="/root/linux" state=directory'
172.25.62.2 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/root/linux", 
    "size": 4096, 
    "state": "directory", 
    "uid": 0
}
172.25.62.3 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/root/linux", 
    "size": 4096, 
    "state": "directory", 
    "uid": 0
}

这里写图片描述
fetch从远程某主机获取文件到本地:

dest:用来存放文件的目录
Src:在远程拉取的文件,并且必须是一个file,不能是目录

例如:获取ansible_host的passwd文件

[root@server1 ~]# ansible server -m fetch -a 'src=/etc/passwd dest=/root/'172.25.62.2 | SUCCESS => {
    "changed": true, 
    "checksum": "7a5bb5d0b2c4745f9cede516b3c4e6ed31ab22d0", 
    "dest": "/root/172.25.62.2/etc/passwd", 
    "md5sum": "4465300727fdad20fcda4dd4ca270072", 
    "remote_checksum": "7a5bb5d0b2c4745f9cede516b3c4e6ed31ab22d0", 
    "remote_md5sum": null
}
172.25.62.3 | SUCCESS => {
    "changed": true, 
    "checksum": "e6e947dcfb587f92f70446965b7b2d9cc7e8e5fc", 
    "dest": "/root/172.25.62.3/etc/passwd", 
    "md5sum": "29a09600f8d7741c6685ea54b3522dcf", 
    "remote_checksum": "e6e947dcfb587f92f70446965b7b2d9cc7e8e5fc", 
    "remote_md5sum": null
}

这里写图片描述
yum 安装软件

name= #所安装的包的名称
state=present|latest|absent #present安装,latest安装最新的,absent 卸载软件。
update_cache #强制更新yum的缓存。yum安装软件
conf_file #设定远程yum安装时所依赖的配置文件。如配置文件没有在默认的位置。
disable_gpg_check #是否禁止GPG checking,只用于‘present’ or `latest’。
disablerepo #临时禁止使用yum库。 只用于安装或更新时。
enablerepo #临时使用的yum库。只用于安装或更新时。

[root@server1 etc]# ansible server -m yum -a 'name=vsftpd state=present' 

这里写图片描述
service: 服务程序管理

name= #服务名称
sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。
state= #started启动服务, stopped停止服务, restarted重启服务, reloaded重载配置
enabled=true|false #设置开机启动。
runlevel #开机启动的级别,一般不用指定

[root@server1 etc]# ansible  server -m service -a 'name=vsftpd state=started enabled=true' 
172.25.62.2 | SUCCESS => {
    "changed": true, 
    "enabled": true, 
    "name": "vsftpd", 
    "state": "started"
}
172.25.62.3 | SUCCESS => {
    "changed": true, 
    "enabled": true, 
    "name": "vsftpd", 
    "state": "started"
}

这里写图片描述
user模块管理

用户模块,管理用户帐号 action: user

createhome  #是否创建家目录
force       #在使用state=absent是, 行为与userdel –force一致.
group       #指定基本组
groups      #指定附加组,如果指定为(groups=)表示删除所有组
home        #指定用户家目录
move_home   #如果设置为home=时, 试图将用户主目录移动到指定的目录
name        #指定用户名
non_unique  #该选项允许改变非唯一的用户ID值
password    #指定用户密码
remove      #在使用state=absent时, 行为是与userdel –remove一致
shell       #指定默认shell
state       #设置帐号状态,不指定为创建,指定值为absent表示删除
system      #当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid         #指定用户的uid
update_password     #更新用户密码
[root@server1 etc]# ansible server -m user -a 'name=ansible comment="ansible" uid=3333 shell=/bin/bash'
172.25.62.2 | SUCCESS => {
    "changed": true, 
    "comment": "ansible", 
    "create_home": true, 
    "group": 3333, 
    "home": "/home/ansible", 
    "name": "ansible", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 3333
}
172.25.62.3 | SUCCESS => {
    "changed": true, 
    "comment": "ansible", 
    "create_home": true, 
    "group": 3333, 
    "home": "/home/ansible", 
    "name": "ansible", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 3333
}

这里写图片描述
group

用户组模块,添加或删除组:action: group

gid # 设置组的GID号
name= # 管理组的名称
state # 指定组状态,默认为创建,设置值为absent为删除
system # 设置值为yes,表示为创建系统组
[root@server1 etc]# ansible  server  -m  group -a 'name=linux state=present system=yes'
172.25.62.3 | SUCCESS => {
    "changed": true, 
    "gid": 499, 
    "name": "linux", 
    "state": "present", 
    "system": true
}
172.25.62.2 | SUCCESS => {
    "changed": true, 
    "gid": 498, 
    "name": "linux", 
    "state": "present", 
    "system": true
}

这里写图片描述
script

[root@server1 ~]# vim   test.sh
#!/bin/bash
for i in  {1..10}
do
        echo $i
done

直接指定脚本路径:

[root@server1 ~]# ansible server -m script -a '/root/test.sh'
172.25.62.2 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "", 
    "stderr_lines": [], 
    "stdout": "1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n", 
    "stdout_lines": [
        "1", 
        "2", 
        "3", 
        "4", 
        "5", 
        "6", 
        "7", 
        "8", 
        "9", 
        "10"
    ]
}
172.25.62.3 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "", 
    "stderr_lines": [], 
    "stdout": "1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n", 
    "stdout_lines": [
        "1", 
        "2", 
        "3", 
        "4", 
        "5", 
        "6", 
        "7", 
        "8", 
        "9", 
        "10"
    ]
}

猜你喜欢

转载自blog.csdn.net/weixin_41476978/article/details/81747249