Ansible
ansilbe是实现自动化运维的工具,基于python开发,实现批量系统配置,批量程序部署,批量运行命令等功能。
ansible是基于模块工作的,自身是没有批量部署的能力。真正具有批量部署能力的是ansible的模块,ansbile只是提供一种框架
ansbile特点
模块化:使用特定的模块,完成特定的工作
支持自定义模块
基于Python语言开发的
不需要再被控端安装组件,也就是无需客户端,直接在服务端执行命令。
批量任务执行可以用脚本,也不需要传递到远程就可以执行。
ansible的基本架构:
1.链接插件用于连接主机,连接受控端。
2.核心模块连接主机实现操作,依靠模块做具体的事情。
3.自定义模块:根据自己的需求编写模块
4.插件是对模块功能的补充。
5.playbook,ansible功能的形象化描述。
6.host inventory 定义ansible需要的操作主机的范围
Ansible使用
服务端:10.220.5.63
两个被控端:10.220.5.65
10.220.5.66
一、安装ansible
[root@63 ~]# yum install ansible
查看版本
[root@63 ~]# ansible --version ansible 2.6.2 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 2015
相关文档
[root@63~]# rpm -qc ansible /etc/ansible/ansible.cfg /etc/ansible/hosts
二、生成密钥
[root@63 ~]# ssh-keygen -t rsa
[root@63 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.63 [root@63 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.65 [root@63~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.66
[root@63 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.63 <<<自己也作为受控端 [root@63 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.65 [root@63~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.66
在主控端/etc/hosts中添加受控端主机信息
[root@63 ~]# vim /etc/hosts
10.220.5.65 slave1
10.220.5.66 slave2
测试是否能免密码登录
[root@63 ~]# ssh slave1 Last login: Sat Nov 17 01:32:37 2018 from 10.220.5.63
[root@slave1 ~]# <<<为10.220.5.65主机
测试
[root@63 ~]# ssh slave1 ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000 link/ether 00:0c:29:d1:a8:6a brd ff:ff:ff:ff:ff:ff inet 10.220.5.65/24 brd 10.220.5.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 10.220.5.233/24 scope global secondary ens33:1 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fed1:a86a/64 scope link valid_lft forever preferred_lft forever
三、使用ansible管理其他节点
格式:ansible <host> [options]
选项:
-m:指定模块名称
-a:指定模块的具体参数
-s:以sudo的方式运行操作
-i:指定被管理节点的主机列表
-f:一次连接几个主机进行操作(默认是5个主机)
查看ansible所支持的模块的信息
[root@63 ~]# ansible-doc -l
默认用command模块
查看一个模块的使用帮助
例:
[root@63 ~]# ansible-doc -s command - name: Executes a command on a remote node command: argv: # Allows the user to provide the command as a list vs. a string. Only the string or the list form can be provided, not both. One or the other must be provided. chdir: # Change into this directory before running the command. creates: # A filename or (since 2.0) glob pattern, when it already exists, this step will *not* be run. free_form: # (required) The command module takes a free form command to run. There is no parameter actually named 'free form'. See the examples! removes: # A filename or (since 2.0) glob pattern, when it does not exist, this step will *not* be run. stdin: # Set the stdin of the command directly to the specified value. warn: # If command_warnings are on in ansible.cfg, do not warn about this particular line if set to `no'.
模块
1. command
默认模块
作用:在各个远程主机上执行命令,但是不能传递参数和变量,不支持特殊字符
格式:ansible 目标 -m command -a "命令"
说明:
目标:目标可以是一个主机组,也可以是hosts文件中的一个或者多个主机,也可是all
-m command:表示这次ansible操作是基于command模块实现
-a "命令":表示是在管理节点上要执行的命令
例子:获取受控节点主机名
[root@63~]# ansible webserver -m command -a "hostname" 10.220.5.65 | SUCCESS | rc=0 >> slave1 10.220.5.66 | SUCCESS | rc=0 >> slave2
也可以单独对一个受控端执行命令
[root@63 ~]# ansible 10.220.5.65 -m command -a "hostname" 10.220.5.65 | SUCCESS | rc=0 >> slave1
2.shell模块
也是在各个远程主机上执行命令,但shell模块可以支持特殊字符,command不支持
chdir:指定一个目录,在执行对应的命令之前,会先进入到 chdir 参数指定的目录中。
creates:数指定一个文件,当指定的文件存在时,就不执行对应命令
removes:指定一个文件,当指定的文件不存在时,就不执行对应命令
executable:默认情况下,shell 模块会调用远程主机中的 /bin/sh 去执行对应的命令,通常情况下,远程主机中的默认 shell 都是 bash。如果你想要使用其他类型的 shell 执行命令,则可以使用此参数指定某种类型的 shell 去执行对应的命令。指定 shell 文件时,需要使用绝对路径。
例子:获取65主机/tmp所有文件
[root@63 ~]# ansible 10.220.5.65 -m shell -a "ls /tmp/*" 10.220.5.65 | SUCCESS | rc=0 >> /tmp/mysql3306.sock /tmp/mysql3306.sock.lock
3.script
作用:在远程主机执行主控端存的shell脚本(相当于scp+shell)
[root@63 ~]# ansible all -m script -a "/root/shell.sh" 10.220.5.66 | SUCCESS => { "changed": true, "rc": 0, "stderr": "Shared connection to 10.220.5.66 closed. ", "stderr_lines": [ "Shared connection to 10.220.5.66 closed." ], "stdout": "", "stdout_lines": [] } 10.220.5.65 | SUCCESS => {
4. cron
作用:在指定的时间运行指定命令(计划任务)
cron: backup: 计划名称 cron_file: 替换客户端用户的计划任务的文件 day: 日 hour: 小时
name: 设置计划任务的名称
disabled:当计划任务有名称时,我们可以根据名称使对应的任务”失效”(注释掉对应的任务)。
除了需要指定任务的名称,还需要同时指定任务的job 以及任务的时间设定,而且任务的时间设定必须和对应任务完全相同,
否则在注释任务的同时,任务的时间设定会被修改,除非你确定这样做。
special_time 后面可加: reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)。 user: 设置当前计划任务属于哪个用户,如果不指定,默认为管理员用户 backup: 在修改或者删除计划任务时,会先对计划任务做备份,然后在进行修改或者删除 job: 用于指定计划任务中需要实际执行的命令或者脚本
state: 当计划任务有名字时,可以根据名称修改或者删除对应的任务,如果需要删除计划任务时,需要将state的值设置为absent
例子1:每隔2分钟再tmp下的log.txt中追加一个信息
[root@63 ~]# ansible all -m cron -a 'minute="*/2" job="echo 123>>/tmp/log.txt" name="job1" state="present"' 10.220.5.66 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "job1" ] } 10.220.5.65 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "job1" ]
例子2.在65主机上创建计划任务,任务名称为crontab day test ,任务每五天执行一次,任务内容输出为test
[root@63 ~]# ansible all -m cron -a " name='crontab day test' minute=1 day=*/3 job='echo test'" 10.220.5.65 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "job1", "crontab day test" ] } 10.220.5.66 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "job1", "crontab day test" ] }
例子:.在 65主机上创建计划任务,任务名称为”special time test”,任务将在重启时执行,任务内容为输出 test 字符。
[root@63 ~]# ansible 10.220.5.65 -m cron -a " name='special time test' special_time=reboot job='echo test'" 10.220.5.65 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "job1", "crontab day test", "special time test"
例子:任务”special time test”已经存在于65主机中。,要删除这个计划任务,删除任务的同时可以进行备份。
[root@63~]# ansible 10.220.5.65 -m cron -a " name='special time test' state=absent backup=yes " 10.220.5.65 | SUCCESS => { "backup_file": "/tmp/crontabNaCVq8", "changed": true, "envs": [], "jobs": [ "job1", "crontab day test"
检查一下在65主机上创建的计划任务
[root@63~]# ansible 10.220.5.65 -a "crontab -l" 10.220.5.65 | SUCCESS | rc=0 >> #Ansible: job1 */2 * * * * echo 123>>/tmp/log.txt #Ansible: crontab day test 1 * */3 * * echo test
5.copy
作用:文件的复制
子命令:
src:原文件路径
dest:目标文件路径
mode:指定权限
backup:有目标文件存在,先对原始文件做备份,然后进行覆盖
force:强制执行覆盖
owner:指定复制后的文件的属主
content:替代src
others:所有的file模块里的选项都可以在这里使用
例子1:将主控端/etc/passwd 文件,复制到65主机/tmp/目录下,并该名为psswd1
[root@63 ~]# ansible 10.220.5.65 -m copy -a 'src="/etc/passwd" dest=/tmp/passwd1' 10.220.5.65 | SUCCESS => { "changed": false, "checksum": "be868aa216508a02c3e0c64186e77f191f27eeca", "dest": "/tmp/passwd1", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "path": "/tmp/passwd1", "size": 1565, "state": "file", "uid": 0
6.user,group
home:指定用户的家目录,需要与createhome配合使用。
groups:指定用户的属组。
uid:指定用的uid。
password:指定用户的密码。
注意:指定password参数时,不能使用明文密码,因为后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,所以需要先将密码字符串进行加密处理。然后将得到的字符串放到password中即可。
name:指定用户名。
createhome:是否创建家目录 yes|no。
system:是否为系统用户。
remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r。
state:是创建还是删除。(present,absent)
shell:指定用户的shell环境。
generate_ssh_key:是否为相关用户生成SSH密钥。 这不会覆盖现有的SSH密钥。
ssh_key_bits:可选择指定要创建的SSH密钥中的位数。
ssh_key_passphrase:设置SSH密钥的密码。 如果没有提供密码,SSH密钥将默认没有密码。
ssh_key_file:指定SSH密钥文件名(可选)。 如果这是一个相对的文件名,那么它将是相对于用户的主目录。
ssh_key_type:指定要生成的SSH密钥的类型(可选)。 可用的SSH密钥类型将取决于目标主机上的实现。
例子:在65主机上创建用户名为qq,家目录为/home/,属组为redis,uid为1010
[root@63 ~]# ansible 10.220.5.65 -m user -a "name=qq home=/home/qq createhome=yes groups=redis uid=1010" 10.220.5.65 | SUCCESS => { "changed": true, "comment": "", "create_home": true, "group": 1010, "groups": "redis", "home": "/home/qq", "name": "qq", "shell": "/bin/bash", "state": "present", "system": false, "uid": 1010
例子:在65主机上创建用户组httpd
[root@66 ~]# ansible 10.220.5.65 -m group -a "name=httpd state=present" 10.220.5.65 | SUCCESS => { "changed": true, "gid": 1012, "name": "httpd", "state": "present", "system": fals
7.yum
RedHat / CentOS包管理工具
config_file:yum的配置文件
disable_gpg_check:关闭gpg_check
disablerepo:不启用某个源
enablerepo:启用某个源
name:要进行操作的软件包的名字,默认最新的程序包,指明要安装的程序包,可以带上版本号,也可以传递一个url或者一个本地的rpm包的路径
state:状态(present,absent,latest),表示是安装还卸载
present:默认的,表示为安装
lastest: 安装为最新的版本
absent:表示删除
例子:在65主机安装httpd
[root@63~]# ansible 10.220.5.65 -m yum -a "name=httpd state=present" 10.220.5.65 | SUCCESS => { "changed": true, "msg": "", "rc": 0, ................................... }
8.file模块
作用:实现文件的各种管理操作
force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:属组
mode:权限
owner:属主
path:路径
recurse:递归的设置文件的属性,只对目录有效
src:要被链接的源文件的路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果目录不存在,创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
例子:在65主机上创建文件abc.sh
[root@63 ~]# ansible 10.220.5.65 -m file -a 'state=touch path=/tmp/abc.sh' 10.220.5.65 | SUCCESS => { "changed": true, "dest": "/tmp/abc.sh", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "size": 0, "state": "file", "uid": 0
将65主机/tmp/abc.sh 链接为/tmp/abc
[root@63 ~]# ansible 10.220.5.65 -m file -a 'state=link src=/tmp/abc.sh path=/tmp/abc' 10.220.5.65 | SUCCESS => { "changed": true, "dest": "/tmp/abc", "gid": 0, "group": "root", "mode": "0777", "owner": "root", "size": 11, "src": "/tmp/abc.sh", "state": "link", "uid": 0 }
9. service
作用:管理服务
子命名;
name:指定服务的名称
enabled:指定服务是否开机自启动
state:指定服务最后的状态 started stopped reloaded restarted
runlevel:指定运行级别
例子:在65主机上重启网卡
[root@66 ~]# ansible 10.220.5.65 -m service -a "name=network state=restarted" 10.220.5.65 | SUCCESS => { "changed": true, "name": "network", "state": "started",
10.ping
作用:做ping测试
例子:对64主机做ping测试
[root@66 ~]# ansible 10.220.5.64 -m ping 10.220.5.64 | SUCCESS => { "changed": false, "ping": "pong" }
11.mount模块
配置挂载点
选项:
dumpfstype:必选项,挂载文件的类型
name:必选项,挂载点
opts:传递给mount命令的参数
src:必选项,要挂载的文件
state:必选项
present:只处理fstab中的配置
absent:删除挂载点
mounted:自动创建挂载点并挂载之
umounted:卸载
例子:在64主机上挂载光盘到/mnt
[root@66 ~]# ansible 10.220.5.64 -m mount -a "name=/mnt src=/dev/sr0 fstype=iso9660 state=mounted" 10.220.5.64 | SUCCESS => { "changed": true, "dump": "0", "fstab": "/etc/fstab", "fstype": "iso9660", "name": "/mnt",