Ansible

Ansible

远程操作主机功能

自动化运维(playbook 剧本 yaml格式)

是基于python开发的配置管理和应用部署工具。在自动化运维中,现在是异军突起。

Ansible能批量配置、部署、管理上千台主机。类似于xshell的一键输入工具,不需要每次都切换主机进行操作。只要有一台ansible的固定主机,就可以所有节点的操作。

不需要angent,客户端。

只需要一台主机上配置了ansible。

ansible是基于模块进行工作,只是提供了一种运行的架构,执行操作和辩证的是ansible的模块来实现的。

copy

service

Ansible默认是通过ssh的密钥对实现通信。(可以改)

Ansible的另一个特点,所有模块都是幂等性。

所谓幂等性,指的是多次操作或者多次执行对系统资源的影响是一致的。

只要发现要停止的目标服务已经停止了,后续同样的停止操作,不会改变任何结果,什么也不做。

systemctl restart firewalld 每一次操作都会先停再启动。

http get 幂等性

post:多次执行相同的post可能创建多个相同的资源。(结果有变化)

1

1

1(数据库里面写入了3个1)

ansible的幂等性,决定了你可以放心大胆的使用,重复执行某个任务不会对结果产生任何影响(绝大多数情况)

Ansible的四大组件:

1、Inventory 主机清单(主机组)定义ansible可以远程操作的服务器。

2、模块 13个模块(常用的),通过模块可以实现远程的配置和操作。

3、Plugins 插件

4、playbook剧本(shell脚本)yaml格式

Ansible的优缺点:

部署较为简单,主要在控制主机部署即可,被控制主机需要有ssh和Python2.5以上版本。基本上Linux都是自带的。ansible只能控制Linux系统,Windows不行。

基于模块工作,可以使用任意语言开发模块(二次开发。底层架构)

环境:

1、管理端:192.168.233.10  ansible

2、被管理端:192.168.233.20

                        192.168.233.30

备用:192.168.233.40

/etc/ansible/

|—— ansible.cfg

|—— hosts

|—— roles

ansible.cfg:ansible的主配置文件,一般无需修改

hosts:主机组,声明可以被控制的主机

roles:公共角色目录

配置主机有两种方式:

1、直接声明主机的ip地址

2、主机名映射(/etc/hosts做映射)

ansible的命令格式:

ansible 组名/ip  -m  模块名称   -a  参数列表(执行的命令)

ansible的操作模块

模块1:

command模块,在远程主机执行Linux的命令,不支持管道符,重定向输出。

ansible 192.168.233.20  -m command -a 'date'

指定ip地址,只会目标主机执行

ansible webserver  -m command -a 'ls /opt'

指定组,组内所有的声明的主机都会执行

ansible all -m command -a 'ls /opt'

所有声明的主机都会执行

ansible 192.168.233.20 -a 'ls /opt'

不加-m也就是不声明使用的模块,默认就是command模块

常用参数:

chdir:在远程主机上运行命令,提前进入目录。

creates:判断指定文件是否存在,如果存在,不执行后面的操作。

removes:判断指定文件是否存在,如果存在,执行后续的操作。

例如:

ansible all -m command -a 'chdir=/home ls'

ansible all -m command -a 'creates=/opt/123 ls /opt'

ansible 192.168.233.20 -m command -a 'removes=/opt/123 ls/opt'

Ansible_第1张图片

模块2:

shell模块,在远程主机执行命令,相当于调用远程主机的shell进制,支持管道符和重定向。

在Ansible当中,多个引号之间要做隔离

例:指定截取主机地址

ansible 192.168.233.20 -m shell -a 'echo $(ifconfig ens33 | awk "NR==2{print $2}" ) | cut -d " " -f2'

Ansible_第2张图片

ansible 192.168.233.30 -m shell -a 'touch /opt/123 && echo 456 > /opt/123 && ls /opt && cat /opt/ 123'

表示逻辑且,前一个命令成功才会执行后一个命令。

ansible 192.168.233.39 -m shell -a 'touch 456; cheo "帅帅帅" > /opt/456 ; cat /opt/456'

Ansible_第3张图片

指定主机上创建一个脚本,在脚本中写入一个内容 #!/bin/bash/ ifconfig ,然后运行这个脚本

ansible 192.168.233.20 -m shell -a 'echo -e "#!/bin/bash\nifconfig" > /opt/test.sh && sh /opt/test.sh'

Ansible_第4张图片

在脚本中用位置变量,实现加法,然后运行脚本。

ansible 192.168.233.30 -m shell -a ‘echo -e "#!/bin/bash\na=$((2+3))\necho \$a" > /opt/test1.sh && sh /opt/test1.sh’

ansible 192.168.233.30 -m shell -a 'touch /opt/123 ; echo 456 > /opt/123 ; ls /opt ; cat /opt/ 123'

表示逻辑或,前面成功与否,后面的命令都会执行。

模块3:cron模块

远程主机设置定时任务

两种状态:present 表示添加(默认就是添加,可以省略)

                  absent  表示移除。注:absent在整个ansible的语法中都表示移除的意思(删除)

定时任务:分 时 日 月 周

分=minute

时=hour

日=day

月=month

周=weekday

job:任务执行的命令

name:任务计划的名称,可以不加。

例:

ansible 192.168.233.20 -m cron -a 'minute="*/5" job="ls /opt" name="test1"'

查看定时任务:crontab -l

例:

ansible 192.168.233.20 -a 'crontab -l'

Ansible_第5张图片

题1:

9月1号早上8点三十分,执行ls /opt 任务名:test2

删除定时任务

ansible -m -a '"name=None state="'

多个计划任务,如果不给名字都是None,一旦删除None,全部删除,不推荐(最好是指定一个不重复的名称)。

模块4:

user模块:用户管理模块

常用的参数:

name 指定用户名,必须要有

state  present   absent        创建用户可以不加present,删除一定要加 absent

system=yes | no,标记用户是否是一个程序用户

uid:用户的唯一标识

group:用户的所在组

create_home=yes | no,替换用户的家目录,不需要替换用户的家目录可以不写

passwd:创建用户的密码

comment:添加用户的注释信息(可有可无)

remove=yes | no 当删除用户时,加上remove=yes,就是删除用户的家目录=userdel -r。如果不需要删除家目录,可以不写。

例:

ansible 20.0.0.181 -m user -a'name=guoqi system=yes'

在创建用户时,虽然我声明了是一个程序用户,但是默认的登陆shell如果没有额外的声明,还是默认的/bin/bash,uid会按照程序用户来指定。

指定:ansible 

11:20

使用ansible的user模块创建用户时,如果创建普通用户可以把不加system,指定shell类型也可以不加,默认就是/bin/bash

如果创建的是程序用户,一定要声明system=yes,声明shell的类型  shell=/sbin/nologin.

也可以指定uid的方式,给用户分配一个uid

11:24

即指定 又指定

ansible 192.168.233.20 -m user -a 'name=gq1 home=/home/gq1 create_home=yes'

ansible  20.0.0.181 -a 'cat /etc/passwd'

删除家目录

ansible 192.168.233.20 -m user -a 'name=gq2 remove=yes state=absent'

模块5:

group模块:用户组的管理模块

name 必须要有(指定名称)

gid 设置组的id

ansible 不适合使用交互式的命令。

例:

ansible 192.168.233.30 -m group

添加到指定组

ansible 192.168.233.30 -m user -a ''

删除指定组

注:要先删除组里面的用户,才能删除组

ansible 192.168.233.30 -m group -a ‘name=gq4 state=absent’

模块6:

ping模块:

检测主机的连通性

注:只有在/etc/ansible/hosts文件当中声明的主机,ansible的服务器才能进行远程操作。

1、command模块

一般用于执行Linux的命令,不支持管道符和重定向。

2、shell模块,相当于command的升级版,也可以执行Linux命令,支持管道符和重定向。

3、cron 在远程主机生成定时任务

分 时 日 月 周

minute

hour

day

month

weekday

job=

name声明计划任务的名称,可以不加(None),以后声明定时任务的名称是必须的。

4、user模块

远程管理用户的模块,创建用户

system=yes | no

声明是普通用户还是系统用户

yes 程序用户

no   普通用户

登录的shell还是需要用户自己声明。

remove=yes | no

删除用户时是否删除家目录

userdel -r

password,创建密码

5、group模块, 创建用户组

6、ping模块测试和远程主机的连通性

注:只有在/etc/ansible/hosts文件当中声明的主机,ansible的服务器才可以进行远程操作。

7、hostname模块

更改远程主机的名称

ansible 192.168.233.20 -m hostname

8、copy模块:

用于复制指定的主机文件到远程主机的模块

常用的参数:

dest:指出要复制的文件在哪,必须使用绝对路径。如果源目标是目录,指目标也得是目录。如果目标的文件存在,会覆盖原有的内容。

src:复制文件的源,最好使用绝对路径。源目标是目录,指目标也得是目录。

owner:指定文件的所有者

group:指定文件的所在组

content:从主机复制指定的内容到目标主机,content就不能使用src。

mode:指定复制之后的文件的权限。

复制目录时,还是复制完整的目录,即目录当中不能为空,目录里面最终要有一个文件,不能只有目录。

现在第一步,在目标主机上创建一个用户guoqi system=yes shell nologin,复制文件ky32.txt。

ky32.txt 所有者和所在组都是guoqi,权限是600

ansible 192.168.233.30 -m user -a ‘name=guoqi system=yes shell=/sbin/nologin'

touch ky32.txt

ansible 192.168.233.30 -m copy -a 'src=/opt/ky32.txt dest=/opt/ky32.txt owner=guoqi group=guoqi mode=600'

Ansible_第6张图片

Ansible_第7张图片

复制目录,guoqi/   到guoqi1/   mode 777

mv用command即可

ansible 192.168.233.30 -a 'mv /opt/hello.txt /opt/wdf.txt

ansible 192.168.233.30 -a 'test'

9、file模块 文件模块,跟目录无关

owner  所有者

group  所在组

mode  

state=link  可以创建链接文件

state=touch 创建文件

state=absent 删除文件

ansible192.168.233.20 -m file -a 'owner=guoqi  group=guoqi1  mode=777 path=/opt/guoqi1

file模块创建一个文件,ky32.txt 所有者和所在组guoqi1 权限700

ansible 192.168.233.20 -m file -a ‘path=/opt state=touch’

ansible 192.168.233.20 -m file -a 'owner=guoqi1  group=guoqi1  mode=700 path=/opt/guoqi1'

创建链接文件:

ansible 192.168.233.30 -m file -a ' '

给/etc/fastab创建一个软连接,这个文件从主机/opt/fastb.bak复制过来的文件,复制的文件/opt/fstab.bak在目标主机的/opt下,创建一个文件fstab然后

touch fstab.bak

ansible 192.168.233.20 -m copy -a 'src=/opt/fstab.bak/ dest=/opt/fstab.bak/'

ansible 192.168.233.20 -m file 'path=/opt/fstab.bak state=link'

删除文件

ansible 192.168.233.30 -m file -a 'path=/opt/fstab.link state=absent'

file模块也可以生成目录

用state声明的时候state=directory

ansible 192.168.233.20 -m file -a 'path=/opt/yyqsg.txt  state=directory'

Ansible_第8张图片

10、yum模块

远程主机上安装和卸载软件包

安装:

ansible 192.168.233.20 -m yum -a 'name=httpd'

在目标主机上的操作都是后台运行,并不影响其他用户的使用。

卸载:

ansible 192.168.233.20 -m yum -a 'name=httpd state=absent'

1、查询远程主机httpd的状态 2、开启 3、访问(this is httpd)

ansible 20.0.0.180 -a 'systemctl status httpd'

ansible 20.0.0.180 -a 'systemctl start httpd'

ansible 20.0.0.180 -m shell -a 'echo "this is httpd" > /var/www/html/index.html'

-a 'curl '

11、service/systemd模块

name,设置管理服务的名称

state=started | stopped| restarted 管理动作

enabled=true 表示是否设置开机自启,如果不加,默认就是开机不自动启动

runlevel:配合ansible,开机自启,可以设置运行级别。在命令行可以设置,但是不生效,要在playbook当中使用。

ansible 192.168.233.30

nginx 安装nginx  设置为开机自启动,设置访问页面this is nginx /usr/share/nginx/html

ansible 20.0.0.180 -m yum -a 'name=nginx'

(name=epel-release)

ansible 20.0.0.180 -m service -a ''name=httpd state=stopped'

ansible 20.0.0.180 -m service  -a 'name=nginx enable=true state=started'

ansible 20.0.0.180 -m shell -a 'echo this is nginx > /usr/share/nginx/html/index.html'

ansible 20.0.0.180 -a 'curl 20.0.0.180'

12、script模块

运行本地脚本,然后把结果输出到目标主机

echo "hello world" > /opt/test222.txt

chmod 777

ansible all -m script -a 'test1.sh'

ansible all -a 'cat /opt/test2222.txt'

写一个shell的脚本,内容:touch 123.txt echo "xxx" > 123.txt  在所有主机都能执行

vim test2.sh

touch 123

echo 'xxx' > /opt/123

chmod 777 test2.sh

ansible all -m script -a '/test2.sh'

ansible all -a 'cat /opt/123'

13、setup模块

setup查看目标主机的环境系统(facts),目标节点的系统信息。

ansible 20.0.0.180 -m setup(所有信息)

查看ip地址:ansible all -m setup -a ‘filter=*ipv4’(过滤条件)

查看cpu信息:ansible all -m setup -a 'filter=ansible_facts'

查看cpu的版本:ansible all -m setup 'filter=*process'

如何查看内存?

ansible all -m setup -a 'filter=ansible_*mem*'

查看内核信息:ansible all -m setup -a 'filter=*proc*'

查看使用什么系统:ansible all -m setup -a 'filter=*os*'

查看系统信息:ansible all -m setup -a 'filter=*system*'

查看硬盘信息(所有设备):ansible all -m setup -a 'filter=*dev*'

主机清单

ansible可以管理上千台主机

192.168.233.6[1:3] 主机名常用。要在/etc/hosts中声明

192.168.233.61 62 63

ansible webserver -m ping

取消秘钥验证

11:47

主机清单管理组当中的变量名

ansible_host 连接时的ip地址

ansible_port 声明对方的连接端口,默认是ssh的22端口。

ansible_user 指定连接时使用对方主机的用户名,不指定主机执行ansible的用户即为使用目标主机的用户。

ansible_password 指定连接ssh时的密码(目标主机的用户密码)

ansible_become  提升用户权限

ansible_become root 

ansible_become_password 免密登录

ansible_user=root ansible

vim /etc/ansible/hosts

vim /etc/ansible/ansible.cfg

host_key_checking =False 密钥对验证取消注释

[webservers]

ansible_

声明主机的用户名,密码,和端口(12:04)

也可以声明一个组变量

[webservers:vars]

ansible_user=root

ansible_passwork=123

ansible_port=22

[all:vars]

[dbservers]

30

192.168.233.6[1:3]

ansible 192.168.233.61 -m ping

ansible webservers

组嵌套

[webs:children]

dbservers

webservers

重要:copy模块

file模块 声明link链接文件

yum模块

service模块 enable=true

script 运行本地脚本,把运行结果输出给目标主机(最重要)

你可能感兴趣的:(ansible,linux,运维)