ansible的安装与简单的使用

Ansible安装和简单的使用

主要内容:

一、ansible概述和运行机制

二、实战-安装并配置Ansible管理两个节点

三、ansible常见模块高级使用方法

四、实战-使用Playbook批量部署多台LAMP环境

一、ansible概述和运行机制

ansible概述

Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具。它用Python写成,类似于saltstackPuppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端。它使用SSH来和节点进行通信。Ansible基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用 YMAL  Jinja2模板语言,更强的远程命令执行操作

image.png

官方网站:https://www.ansible.com/


ansiblle具有如下特点:

    1、部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;

    2、默认使用SSH协议对设备进行管理;

    3、主从集中化管理;

    4、配置简单、功能强大、扩展性强;

    5、支持API及自定义模块,可通过Python轻松扩展;

    6、通过Playbooks来定制强大的配置、状态管理

    7、对云计算平台、大数据都有很好的支持;

Ansible 工作机制

Ansible 在管理节点将 Ansible 模块通过 SSH 协议推送到被管理端执行,执行完之后自动删除,可以使用 SVN 等来管理自定义模块及编排。

image.png 

由上面的图可以看到 Ansible 的组成由 5 个部分组成:

Ansible      ansible核心

Modules     包括 Ansible 自带的核心模块及自定义模块

Plugins       完成模块功能的补充,包括连接插件、邮件插件等

Playbooks    剧本;定义 Ansible 多任务配置文件,由Ansible 自动执行

Inventory     定义 Ansible 管理主机的清单  [ˈɪnvəntri] 清单

 

 4-13-2  实战-安装并配置Ansible管理两个节点

实验环境:

 

Ansible server 192.168.2.88

Simple service 192.168.2.88

Simple service 192.168.2.69

server 192.168.2.88安装ansible

1、 设置EPEL仓库

Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库。

yum -y install epel-release.noarch

 

yum install ansible -y

 

ansible --version

 

ansible命令参数

我们首先写一个ansible的命令查看ansible的文档

ansible-doc -s service

 

anisble命令语法: ansible [-i 主机文件] [-f 批次] [组名] [-m 模块名称] [-a 模块参数]

ansible  object  method   argument

环境变量  对象      方法    调用方法需要的参数

-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]   片断

定义主机清单

1、基于端口,用户,密码定义主机清单

ansible基于ssh连接-i (inventory)参数后指定的远程主机时,也可以写端口,用户,密码。

格式:ansible_ssh_port:指定ssh端口   ansible_ssh_user:指定 ssh 用户 ansible_ssh_pass:指定 ssh 用户登录是认证密码(明文密码不安全)  ansible_sudo_pass:指明 sudo 时候的密码

 例:

     

     配置内容

        192.168.2.88 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123

     然后执行命令

   ansible -i /etc/ansible/hosts webservers -m ping

     

    这个错误还是来源于ssh首次登陆陌生的主机,会校验know_hosts

     解决方法

1、 ssh一次就可以了

 

2、 关闭询问

 

 

    解决之后,效果如此

   

2、基于ssh密钥来访问定义主机清单

一般来说,使用明文密码不安全,所以增加主机无密码访问。

Ansible服务端生成密钥,并且复制公钥到节点中。

生成秘钥

ssh-keygen

 

复制到客户机

ssh-copy-id

ssh-copy-id [email protected]

 

ssh-copy-id [email protected]

 

然后修改hosts配置

 

 

注意:两个#注释只是为了和上面一

进行测试

ansible 'web-servers'  -m ping

 

2:检查Ansible节点的运行时间(uptime)

 

[root@saltMaster ~]# uptime

 21:48:39 up  2:20,  5 users,  load average: 0.15, 0.09, 0.07

[root@saltMaster ~]# ansible -m command -a "uptime" "webservers"

192.168.2.88 | CHANGED | rc=0 >>

 21:49:09 up  2:21,  6 users,  load average: 0.57, 0.19, 0.10

192.168.2.69 | CHANGED | rc=0 >>

 08:49:09 up  2:01,  4 users,  load average: 0.00, 0.01, 0.05

[root@saltMaster ~]#

3:检查节点的内核版本

 

4:给节点增加用户

[root@saltMaster ~]# useradd while123

[root@saltMaster ~]# grep while123 /etc/passwd

while123:x:1001:1001::/home/while123:/bin/bash

[root@saltMaster ~]# ansible -m command -a "useradd WHILE123" "webservers"

192.168.2.88 | CHANGED | rc=0 >>

192.168.2.69 | CHANGED | rc=0 >>

 

[root@saltMaster ~]# ansible -m command -a "grep WHILE123 /etc/passwd" "webservers"

192.168.2.88 | CHANGED | rc=0 >>

WHILE123:x:1002:1002::/home/WHILE123:/bin/bash

 

192.168.2.69 | CHANGED | rc=0 >>

WHILE123:x:1001:1001::/home/WHILE123:/bin/bash

 

[root@saltMaster ~]#

 

5df命令在所有节点执行后,重定向输出到本机的/tmp/command-output.txt文件中

[root@saltMaster ~]# ansible -m command -a "df -Th" "webservers" > /tmp/command-output.txt

[root@saltMaster ~]# cat /tmp/command-output.txt

192.168.2.88 | CHANGED | rc=0 >>

Filesystem              Type      Size  Used Avail Use% Mounted on

/dev/mapper/centos-root xfs        17G  5.5G   12G  33% /

devtmpfs                devtmpfs  897M     0  897M   0% /dev

tmpfs                   tmpfs     912M  124K  912M   1% /dev/shm

tmpfs                   tmpfs     912M   18M  895M   2% /run

tmpfs                   tmpfs     912M     0  912M   0% /sys/fs/cgroup

/dev/sda1               xfs      1014M  179M  836M  18% /boot

tmpfs                   tmpfs     183M   32K  183M   1% /run/user/0

/dev/sr0                iso9660   4.3G  4.3G     0 100% /run/media/root/CentOS 7 x86_64

192.168.2.69 | CHANGED | rc=0 >>

Filesystem              Type      Size  Used Avail Use% Mounted on

/dev/mapper/centos-root xfs        17G  4.6G   13G  27% /

devtmpfs                devtmpfs  471M     0  471M   0% /dev

tmpfs                   tmpfs     488M     0  488M   0% /dev/shm

tmpfs                   tmpfs     488M   15M  473M   4% /run

tmpfs                   tmpfs     488M     0  488M   0% /sys/fs/cgroup

/dev/sda1               xfs      1014M  201M  814M  20% /boot

tmpfs                   tmpfs      98M   44K   98M   1% /run/user/0

/dev/sr0                iso9660   4.3G  4.3G     0 100% /run/media/root/CentOS 7 x86_64

[root@saltMaster ~]#

 

 4-13-3  ansible常见模块高级使用方法

ansible常用模块

ansible 已经给开发者定义了好多可用的模块,我们除了拓展之外,大部分模块可以直接使用

1、3个远程命令模块的区别

1)、command模块为ansible默认模块,不指定-m参数时,使用的就是command模块; comand模块比较简单,常见的命令都可以使用,但其命令的执行不是通过shell执行的,所以,像这些 "<", ">", "|", and "&"操作都不可以,当然,也就不支持管道; 缺点:不支持管道,没法批量执行命令;

2)、shell模块使用shell模块,在远程命令通过/bin/sh来执行;所以,我们在终端输入的各种命令方式,都可以使用

1:运行free -m 命令

[root@saltMaster ~]# ansible webservers -m shell -a "free -m"

192.168.2.88 | CHANGED | rc=0 >>

              total        used        free      shared  buff/cache   available

Mem:           1823         781          82          12         959         783

Swap:          2047           6        2041

 

192.168.2.69 | CHANGED | rc=0 >>

              total        used        free      shared  buff/cache   available

Mem:            974         686          60           6         227          63

Swap:          2047         383        1664

 

[root@saltMaster ~]#

 

shell模块的使用可以分成两块:

1) 如果待执行的语句少,可以直接写在一句话中,上例

2) 如果在远程待执行的语句比较多,可写成一个脚本,通过copy模块传到远端,然后再执行;但这样就又涉及到两次ansible调用;对于这种需求,ansible已经为我们考虑到了,script模块就是干这事的;

3)、scripts模块

使用scripts模块可以在本地写一个脚本,在远程服务器上执行:

[root@saltMaster ~]# vim /etc/ansible/net.sh

#!/bin/bash

date

hostname

[root@saltMaster ~]# ansible webservers -m script -a "/etc/ansible/net.sh"

192.168.2.88 | CHANGED => {

    "changed": true,

    "rc": 0,

    "stderr": "Shared connection to 192.168.2.88 closed.\r\n",

    "stderr_lines": [

        "Shared connection to 192.168.2.88 closed."

    ],

    "stdout": "Mon Dec  3 22:08:55 CST 2018\r\nsaltMaster\r\n",

    "stdout_lines": [

        "Mon Dec  3 22:08:55 CST 2018",

        "saltMaster"

    ]

}

192.168.2.69 | CHANGED => {

    "changed": true,

    "rc": 0,

    "stderr": "Shared connection to 192.168.2.69 closed.\r\n",

    "stderr_lines": [

        "Shared connection to 192.168.2.69 closed."

    ],

    "stdout": "Mon Dec  3 09:09:06 EST 2018\r\nlocalhost.localdomain\r\n",

    "stdout_lines": [

        "Mon Dec  3 09:09:06 EST 2018",

        "localhost.localdomain"

    ]

}

 

2、copy模块:实现主控端向目标主机拷贝文件,类似scp功能

1:把ansible主机上的/etc/hosts文件复制到主机组中机器的/tmp目录下

[root@saltMaster /]# ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/ owner=root group=root mode=0755"

192.168.2.88 | CHANGED => {

    "changed": true,

    "checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",

    "dest": "/tmp/hosts",

    "gid": 0,

    "group": "root",

    "md5sum": "54fb6627dbaa37721048e4549db3224d",

    "mode": "0755",

    "owner": "root",

    "size": 158,

    "src": "/root/.ansible/tmp/ansible-tmp-1543846330.63-199478885009462/source",

    "state": "file",

    "uid": 0

}

192.168.2.69 | CHANGED => {

    "changed": true,

    "checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",

    "dest": "/tmp/hosts",

    "gid": 0,

    "group": "root",

    "md5sum": "54fb6627dbaa37721048e4549db3224d",

    "mode": "0755",

    "owner": "root",

    "secontext": "unconfined_u:object_r:admin_home_t:s0",

    "size": 158,

    "src": "/root/.ansible/tmp/ansible-tmp-1543846330.65-125711974784987/source",

    "state": "file",

    "uid": 0

}

[root@saltMaster /]#

 

我们看一眼

 

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

例如:

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

验证:

[root@xuegod63 ~]# ll /tmp/hosts

-rwxrwxrwx 1 root root 158 11月 14 22:39 /tmp/hosts

 

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

[root@xuegod63 ~]# 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@xuegod63 ~]# 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"

注:url=https://xxx  的等号=前后不能有空格

扩展:查看force=yes的作用

[root@xuegod63 ~]# ansible-doc -s get_url    #在弹出的信息中找到force

如果force=yes,当下载文件时,如果所下的内容和原目录下的文件内容不一样,则替换原文件,如果一样,就不下载了。

如果为“否”,则仅在目标不存在时才下载文件。 一般来说,只有小型本地文件才应该为“是”。 在0.6之前,该模块表现为默认为“是”。

 

查看下载的文件:

[root@xuegod63 ~]# ll /tmp/epel-release-latest-7.noarch.rpm

-r--r----- 1 root root 15080 11月 14 22:43 /tmp/epel-release-latest-7.noarch.rpm

 

测试:下载文件时,当文件不一样时,会替换原来的文件

[root@xuegod64 ~]# cp /etc/passwd /tmp/epel-release-latest-7.noarch.rpm

[root@xuegod63 ~]# 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"

192.168.1.63 | SUCCESS => {

    "changed": false,   #xuegod63上原来的文件和当前的文件一样,就没有改变。执行成功,但没有发生改变,那么显示绿色

   。。。

}

192.168.1.64 | SUCCESS => {

    "changed": true,   #xuegod64上的文件名字一样,但是内容变,就会重新下载。执行成功,且发生改变,那么显示×××

 

6、yum模块linux平台软件包管理。

yum模块可以提供的status状态: latest ,present,installed  #这3个代表安装;removed, absent #后面2个是卸载

例子:安装httpd软件

[root@xuegod63 ~]# ansible -i /etc/ansible/hosts web-servers -m yum -a "name=httpd  state=latest"

 

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

例如:增加每30分钟执行ls /tmp

[root@xuegod63 ~]# ansible -i /etc/ansible/hosts web-servers -m cron -a "name='list dir' minute='*/30' job='ls /tmp'"

xuegod63上查看

[root@xuegod63 ~]# 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 命令启动或关闭

 

例如:远程启动Apache服务

[root@xuegod63 ~]# ansible -i /etc/ansible/hosts web-servers -m service -a "name=httpd state=restarted"

 

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

例:开启路由转发功能

[root@xuegod63 ~]# ansible -i /etc/ansible/hosts web-servers -m sysctl -a "name=net.ipv4.ip_forward value=1 reload=yes"

验证:

[root@xuegod63 ~]# cat /proc/sys/net/ipv4/ip_forward

1 

 

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

例如:

[root@xuegod63 ~]# ansible -i /etc/ansible/hosts web-servers -m user -a "name=xuegod6 state=present"

# present  [ˈpreznt]  目前 

验证:

[root@xuegod63 ~]# id xuegod6

uid=1001(xuegod6) gid=1001(xuegod6) 组=1001(xuegod6)

 4-13-4  实战-使用Playbook批量部署多台LAMP环境

playbooks使用步骤

playbook是一个不同于使用ansible命令行执行方式的模式,功能更强大更灵活。

Playbook本身是一个很灵活的创意,但是灵活在于jinja2使用

  我们Django,template就是采用的jinja2模板系统

  注意,我们使用的是yaml格式的配置文件,yaml格式对缩进的要求严格程度不下于Python

1、在playbooks 中定义任务:

- name: task description     #任务描述信息

 module_name: module_args    #需要使用的模块名字:  模块参数

2、ansible-playbook 执行 命令:

ansible-playbook site.yml

playbook是由一个或多个"play"组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。

github上提供了大量的实例供大家参考  https://github.com/ansible/ansible-examples

实战1:使用Playbook批量部署多台LAMP环境

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

总结

 4-13-1  ansible概述和运行机制

 4-13-2  实战-安装并配置Ansible管理两个节点

 4-13-3  ansible常见模块高级使用方法

 4-13-4  实战-使用Playbook批量部署多台LAMP环境

 


猜你喜欢

转载自blog.51cto.com/853056088/2326995