自动化运维ansible配置,各模块的使用

自动化运维工具ansible简介
地址:https://blog.csdn.net/su_use/article/details/81741953

Ansible工作机制

这里写图片描述

从图中可以看出ansible分为以下几个部份:

1> Control Node:控制机器
2> Inventory:主机清单,配置管理主机列表
3> Playbooks:剧本、任务编排。根据规则定义多个任务,模块组织结构清晰,由ansible自动执行。
4> Modules(Core | Custom):模块,用于执行某个具体的任务
5> connection plugin(连接插件):Ansible通过不同的协议连接到远程主机上,执行指定的命令。默认采用ssh协议连接远程主机。

ansible安装

环境:rhel6.5
172.25.5.1

ansible安装包所需的依赖包

[root@server1 ~]# ls
libyaml-0.1.6-1.el6.x86_64.rpm           python-keyczar-0.71c-1.el6.noarch.rpm
python-crypto2.6-2.6.1-2.el6.x86_64.rpm  python-six-1.9.0-2.el6.noarch.rpm
python-httplib2-0.7.7-1.el6.noarch.rpm   PyYAML-3.10-3.el6.x86_64.rpm
python-jinja2-26-2.6-3.el6.noarch.rpm    sshpass-1.05-1.el6.x86_64.rpm
[root@server1 ~]# yum install ./*
安装release包,会生成.repo的yum源配置文件
[root@server1 ansible-rhel6]# ls
epel-release-6-5.noarch.rpm
[root@server1 ansible-rhel6]# yum install epel-release-6-5.noarch.rpm
需要网络
[root@server1 ~]# route add default gw 172.25.5.250
[root@server1 ~]# vim /etc/resolv.conf
-------------
nameserver 114.114.114.114
------------
[root@server1 ~]# yum install ansible
安装成功
[root@server1 ~]# rpm -qa |grep ansible
ansible-2.6.2-1.el6.noarch
[root@server1 ~]# 
配置文件:
[root@server1 ~]# rpm -qc  ansible
/etc/ansible/ansible.cfg
/etc/ansible/hosts
[root@server1 ~]# 
默认值就OK,不需要修改

设置/etc/ansible/ansible.cfg配置参数,ansible有许多参数,下面列出常用的参数:

inventory:#这个参数表示资源清单inventory文件的位置,资源清单就是一些ansible需要连接管理的主 机列表。
library: ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放ansible模块的目录。
forks:设置默认情况下ansible最多能有多少个进程同时工作, 从ansible 1.3开始,fork数量默认自动设置为主机数量或者潜在的主机数量,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管节点的数量来确定,可能是 50100。默认值5是非常保守的值
sudo_user:这是设置默认执行命令的用户,也可以在playbook中重新设置这个参数。
remote_port:这是指定连接被管节点的管理端口,默认是22。除非设置了特殊的SSH端口,不然这个参数一般是不需要修改的。 
host_key_checking:这是设置是否检查SSH主机的密钥。可以设置为TrueFalse,关闭后第一次连接没有提示
timeout:这是设置SSH连接的超时间隔,单位是秒。
log_path:**ansible系统默认是不记录日志的,如果想把ansible系统的输出记录到日志文件中,需要设置log_path来指定一个存储ansible日志的文件。

ansible主机清单设置

编辑/etc/ansible/hosts:
这里写图片描述

ssh免密配置:

[root@server1 ~]# ssh-keygen -t rsa
[root@server1 ~]# cp id_rsa.pub authorized_keys
[root@server1 ~]# cd ~/.ssh/
[root@server1 .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts
[root@server1 .ssh]# scp * [email protected]:/root/.ssh/
[root@server1 .ssh]# scp * [email protected]:/root/.ssh/
ping一下
[root@server1 ~]# ansible all -m ping
172.25.5.2 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
172.25.5.3 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
[root@server1 ~]# 
action: command
action: command
chdir       #在执行命令之前,先切换到该目录
creates     #一个文件名,当这个文件存在,则该命令不执行,可以用来做判断
executable  #切换shell来执行命令,需要使用命令的绝对路径
free_form   #要执行的Linux指令,一般使用ansible的-a参数代替。
removes     #一个文件名,这个文件不存在,则该命令不执行,与creates相反的判断

[root@server1 ~]# ansible all -m command -a 'ifconfig'
172.25.5.3 | SUCCESS | rc=0 >>
eth0      Link encap:Ethernet  HWaddr 52:54:00:05:87:9A  
          inet addr:172.25.5.3  Bcast:172.25.5.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe05:879a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:43686 errors:0 dropped:0 overruns:0 frame:0
          TX packets:779 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3007683 (2.8 MiB)  TX bytes:109393 (106.8 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:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

172.25.5.2 | SUCCESS | rc=0 >>
eth0      Link encap:Ethernet  HWaddr 52:54:00:60:C7:8D  
          inet addr:172.25.5.2  Bcast:172.25.5.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe60:c78d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:43983 errors:0 dropped:0 overruns:0 frame:0
          TX packets:943 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3036287 (2.8 MiB)  TX bytes:133227 (130.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:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

[root@server1 ~]# 
shell模块

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

[root@server1 ~]# ansible all -m shell -a 'ls /root/.ssh/'
172.25.5.2 | SUCCESS | rc=0 >>
authorized_keys
id_rsa
id_rsa.pub
known_hosts

172.25.5.3 | SUCCESS | rc=0 >>
authorized_keys
id_rsa
id_rsa.pub
known_hosts
test.sql

[root@server1 ~]# 
copy:复制文件到远程主机,可以改权限等

复制文件,指定路径

-a "src= dest= "

给定内容生成文件

-a "content= dest= "
[root@server1 ~]# vim test.txt 
[root@server1 ~]# cat test.txt 
hello
[root@server1 ~]# ansible server -m copy -a 'src="/root/test.txt" dest=/root/'
172.25.5.2 | SUCCESS => {
    "changed": true, 
    "checksum": "f572d396fae9206628714fb2ce00f72e94f2258f", 
    "dest": "/root/test.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "b1946ac92492d2347c6235b4d2611184", 
    "mode": "0644", 
    "owner": "root", 
    "size": 6, 
    "src": "/root/.ansible/tmp/ansible-tmp-1534398378.06-84744703285233/source", 
    "state": "file", 
    "uid": 0
}
172.25.5.3 | SUCCESS => {
    "changed": true, 
    "checksum": "f572d396fae9206628714fb2ce00f72e94f2258f", 
    "dest": "/root/test.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "b1946ac92492d2347c6235b4d2611184", 
    "mode": "0644", 
    "owner": "root", 
    "size": 6, 
    "src": "/root/.ansible/tmp/ansible-tmp-1534398378.07-92832546544666/source", 
    "state": "file", 
    "uid": 0
}
[root@server1 ~]# 
-----------------------------------------
server3查看
[root@server3 ~]# ls
epel-release-6-5.noarch.rpm  test.txt
[root@server3 ~]# cat test.txt 
hello
[root@server3 ~]#

file 设置文件属性:

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

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

eg:

[root@server1 ~]# ansible server -m file -a 'path="/root/test/" state=directory'
172.25.5.2 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/root/test/", 
    "size": 4096, 
    "state": "directory", 
    "uid": 0
}
172.25.5.3 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/root/test/", 
    "size": 4096, 
    "state": "directory", 
    "uid": 0
}
[root@server1 ~]# 
----------------------
server3查看:
[root@server3 ~]# ll
total 24
-rw-r--r-- 1 root root 13204 Aug 16 10:10 epel-release-6-5.noarch.rpm
drwxr-xr-x 2 root root  4096 Aug 16 13:51 test
-rw-r--r-- 1 root root     6 Aug 16 13:46 test.txt
[root@server3 ~]# 
fetch从远程某主机获取文件到本地:

dest:用来存放文件的目录,例如存放目录为backup,源文件名称为/etc/profile在主机pythonserver中,那么保存为/backup/pythonserver/etc/profile;
Src:在远程拉取的文件,并且必须是一个file,不能是目录。

[root@server1 ~]# ansible server -m fetch -a 'src=/var/log/messages dest=/root/'
172.25.5.2 | SUCCESS => {
    "changed": true, 
    "checksum": "5d3f600bd872ef58d8b6fbb40e99ac11eebba891", 
    "dest": "/root/172.25.5.2/var/log/messages", 
    "md5sum": "cd62454d8866f2383d30798d2c33495f", 
    "remote_checksum": "5d3f600bd872ef58d8b6fbb40e99ac11eebba891", 
    "remote_md5sum": null
}
172.25.5.3 | SUCCESS => {
    "changed": true, 
    "checksum": "9a236742b12c2d57d65965f7d34165ac6c3af37e", 
    "dest": "/root/172.25.5.3/var/log/messages", 
    "md5sum": "06c9b26675c61d1a125fe7de8626d99a", 
    "remote_checksum": "9a236742b12c2d57d65965f7d34165ac6c3af37e", 
    "remote_md5sum": null
}
[root@server1 ~]# ll
total 16
drwxr-xr-x 3 root root 4096 Aug 16 13:54 172.25.5.2
drwxr-xr-x 3 root root 4096 Aug 16 13:54 172.25.5.3
drwxr-xr-x 2 root root 4096 Aug 16 11:47 ansible-rhel6
-rw-r--r-- 1 root root    6 Aug 16 13:44 test.txt

[root@server1 ~]# ll 172.25.5.2/var/log/messages 
-rw-r--r-- 1 root root 131854 Aug 16 13:54 172.25.5.2/var/log/messages
[root@server1 ~]# 
cron管理cron计划任务
action: cron backup=    #如果设置,创建一个crontab备份 [yes|no]
cron_file=  #如果指定, 使用这个文件cron.d,而不是单个用户

crontab:
day=    #日应该运行的工作( 1-31, *, */2, )
hour=   #小时 ( 0-23, *, */2, )
minute=     #分钟( 0-59, *, */2, )
month=  #月( 1-12, *, /2, )
weekday     #周 ( 0-6 for Sunday-Saturday,, )
job=    #指明运行的命令是什么
name=   #定时任务描述
reboot  #任务在重启时运行,不建议使用,建议使用special_time
special_time    #特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)
state   #指定状态,present表示添加定时任务,也是默认设置,absent表示删除定时任务
user    #以哪个用户的身份执行
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库。只用于安装或更新时。

eg:

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

service: 服务程序管理

name=   #服务名称
sleep   #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。
state=  #started启动服务, stopped停止服务, restarted重启服务, reloaded重载配置
enabled=true|false  #设置开机启动。
runlevel    #开机启动的级别,一般不用指定。
[root@server1 ~]# ansible server -m service -a 'name=nginx state=stopped enabled=true'
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     #更新用户密码

eg:

[root@server1 ~]# ansible server -m user -a 'name=westos comment="westos" uid=1066 shell=/sbin/nologin'
172.25.5.3 | SUCCESS => {
    "changed": true, 
    "comment": "westos", 
    "create_home": true, 
    "group": 1066, 
    "home": "/home/westos", 
    "name": "westos", 
    "shell": "/sbin/nologin", 
    "state": "present", 
    "system": false, 
    "uid": 1066
}
172.25.5.2 | SUCCESS => {
    "changed": true, 
    "comment": "westos", 
    "create_home": true, 
    "group": 1066, 
    "home": "/home/westos", 
    "name": "westos", 
    "shell": "/sbin/nologin", 
    "state": "present", 
    "system": false, 
    "uid": 1066
}
[root@server1 ~]#
group

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

gid # 设置组的GID号
name= # 管理组的名称
state # 指定组状态,默认为创建,设置值为absent为删除
system # 设置值为yes,表示为创建系统组
[root@server1 ~]# ansible server -m group -a 'name=westos state=present'

script

直接指定脚本路径:

[root@server1 ~]# ansible server -m script -a '/root/test.sh'

setup模块

facts组件是ansible用于采集被管机器设备信息的一个功能,我们可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。

facts就是变量,内建变量 。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。

setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。

ansible 172.25.5.2 -m setup -a 'filter=ansible*mb' //查看主机内存信息
ansible 172.25.5.2 -m setup -a 'filter=ansible_ens3[2-3]' //查看地接口为eth0-2的网卡信息
ansible all -m setup --tree /tmp/facts //将所有主机的信息输入到/tmp/facts目录下,每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的主机名)

猜你喜欢

转载自blog.csdn.net/su_use/article/details/81739207