ansible的使用

运维自动化发展历程及技术应用

  1. IAAS基础设置即服务,提供硬件服务
  2. PAAS平台即服务,提供操作系统服务
  3. SAAS软件即服务,提供整套服务

 

ansible的安装

yum -y install ansible

ansible –version 查看版本信息

 

/etc/ansible/ansible.cfg  配置文件

/etc/ansible/hosts       控制的主机列表

/etc/ansible/roles       角色

 

添加主机清单,在/etc/ansible/hosts文件中添加主机

234

可以以分组添加形式添加,如:

23324

连接被控制的主机,ansible是基于ssh协议,

[root@centos7 ~]#ansible appsrv -m ping -k

appsrv代表配置文件中定义的主机列表,-m表示模块,-k提供用户名口令

 

ansible all -m ping        all代表所有主机

 

ansible 配置文件

Ansible配置文件/etc/ansible/ansible.cfg(一般保持默认)

[defaults]

#inventory = /etc/ansible/hosts # 主机列表配置文件

#library = /usr/share/my_modules/ # 库文件存放目录

#remote_tmp= $HOME/.ansible/tmp#临时py命令文件存放在远程主机目录

#local_tmp= $HOME/.ansible/tmp# 本机的临时命令执行目录

#forks = 5 # 默认并发数

#sudo_user= root # 默认sudo用户

#ask_sudo_pass= True #每次执行ansible命令是否询问ssh密码

#ask_pass= True

#remote_port= 22

#host_key_checking= False # 检查对应服务器的host_key,建议取消注释    建议开启

#log_path=/var/log/ansible.log#日志文件                                建议开启

 

ansible-doc:显示模块帮助

Ansible-doc -a 显示所有模块的文档

Ansible-doc -l  列出可用模块

Ansible-doc -s  显示指定模块的playbook片段

例:ansible-doc ping 显示ping模块的用

 

ansible<host-pattern> [-m module_name] [-a args]

–version 显示版本

-m module指定模块,默认为command

-v 详细过程–vv-vvv更详细

–list-hosts 显示主机列表,可简写—list

-k, –ask-pass 提示连接密码,默认Key验证

-K, –ask-become-pass 提示输入sudo

-C, –check 检查,并不执行

-T, –timeout=TIMEOUT 执行命令的超时时间,默认10s

-u, –user=REMOTE_USER 执行远程执行的用户

-b, –become 代替旧版的sudo切换

 

例:–list-hosts显示主机列表

[root@centos7 .ssh]#ansible all –list-hosts

hosts (3):

192.168.67.131

192.168.67.132

192.168.67.53

[root@centos7 .ssh]#ansible appsrv –list-hosts

hosts (2):

192.168.67.131

192.168.67.132

 

基于key验证,用户不用输入密码

ssh-keygen

Ssh-copy-id hostIP  分别输入不同主机ip

[root@centos7 .ssh]#ansible all -m ping

192.168.67.131 | SUCCESS => {

“changed”: false,

“ping”: “pong”

}

192.168.67.53 | SUCCESS => {

“changed”: false,

“ping”: “pong”

}

192.168.67.132 | SUCCESS => {

“changed”: false,

“ping”: “pong”

}

 

ansible的Host-pattern

匹配主机的列表

All :表示所有Inventory中的所有主机

ansibleall –m ping

* :通配符

ansible“*” -m ping

ansible192.168.1.* -m ping

ansible“*srvs” -m ping

或关系

ansible“websrvs:appsrvs” -m ping

ansible“192.168.1.10:192.168.1.20” -m ping

逻辑与

ansible“websrvs:&dbsrvs” –m ping

在websrvs组并且在dbsrvs组中的主机

逻.非

 

ansible‘websrvs:!dbsrvs’ –m ping

在websrvs组,但不在dbsrvs组中的主机

综合逻辑

ansible‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping

正则表达式

ansible“websrvs:&dbsrvs” –m ping

ansible“~(web|db).*\.magedu\.com” –m ping

 

 

ansible 模块介绍

 command模块为默认模块,可以省略不写

[root@centos7 .ssh]#ansible all -a ‘creates=/etc/passwd cat /etc/fstab’

192.168.67.53 | SUCCESS | rc=0 >>

skipped, since /etc/passwd exists

 

192.168.67.131 | SUCCESS | rc=0 >>

skipped, since /etc/passwd exists

 

192.168.67.132 | SUCCESS | rc=0 >>

skipped, since /etc/passwd exists

creates=/etc/passwd 表示如果文件存在,后面的命令不执行

removes=/etc/passwd 表示如果文件不存在,后面的命令不执行

 

[root@centos7 .ssh]#ansible all -a ‘chdir=/boot ls’   查看boot目录

 

command不支持重定向、变量、管道,shell模块支持

如:

[root@centos7 .ssh]#ansible all -a ‘echo $HOSTNAME’

192.168.67.53 | SUCCESS | rc=0 >>

$hostname

 

192.168.67.131 | SUCCESS | rc=0 >>

$hostname

 

192.168.67.132 | SUCCESS | rc=0 >>

$hostname

 

 

shell模块,

[root@centos7 .ssh]#ansible all -m shell -a ‘echo $HOSTNAME’

192.168.67.53 | SUCCESS | rc=0 >>

centos6.91

 

192.168.67.131 | SUCCESS | rc=0 >>

centos6.9

 

192.168.67.132 | SUCCESS | rc=0 >>

centos7.5

 

script模块,本机的脚本在所有主机上执行

[root@centos7 data]#vim host.sh

[root@centos7 data]#chmod +x host.sh

[root@centos7 data]#ansible all -m script -a ‘/data/host.sh’

192.168.67.131 | SUCCESS => {

“changed”: true,

“rc”: 0,

“stderr”: “Shared connection to 192.168.67.131 closed.\r\n”,

“stdout”: “centos6.9\r\n”,

“stdout_lines”: [

“centos6.9”

]

}

 

copy模块,将本机的文件复制到远程

ansible-doc copy

例:关闭所有主机selinux

[root@centos7 data]#ansible all -m shell -a ‘getenforce’

192.168.67.53 | SUCCESS | rc=0 >>

Disabled

 

192.168.67.131 | SUCCESS | rc=0 >>

Disabled

 

192.168.67.132 | SUCCESS | rc=0 >>

Enforcing

[root@centos7 data]#ansible all -m shell -a ‘ls -l /etc/sysconfig/selinux’

192.168.67.53 | SUCCESS | rc=0 >>

lrwxrwxrwx. 1 root root 17 Apr 29 20:18 /etc/sysconfig/selinux -> ../selinux/config

 

192.168.67.131 | SUCCESS | rc=0 >>

lrwxrwxrwx. 1 root root 17 Apr  8 12:34 /etc/sysconfig/selinux -> ../selinux/config

 

192.168.67.132 | SUCCESS | rc=0 >>

lrwxrwxrwx. 1 root root 17 May 29 04:03 /etc/sysconfig/selinux -> ../selinux/config

 

复制配置好的文件到所有远程主机(要注意版本不同)

ansible all -m copy -a ‘src=/data/config dest=/etc/selinux/ backup=yes’

ansible all -m shell -a ‘reboot’

[root@centos7 data]#ansible all -a ‘getenforce’

192.168.67.131 | SUCCESS | rc=0 >>

Disabled

 

192.168.67.132 | SUCCESS | rc=0 >>

Disabled

 

192.168.67.53 | SUCCESS | rc=0 >>

Disabled

例:生成一个文件并且指定内容

[root@centos7 data]#ansible all -m copy -a ‘content=”hello\nhi” dest=/data/file’

[root@centos7 data]#ansible all -a ‘cat /data/file’

192.168.67.53 | SUCCESS | rc=0 >>

hello

hi

192.168.67.131 | SUCCESS | rc=0 >>

hello

hi

 

192.168.67.132 | SUCCESS | rc=0 >>

hello

hi

 

fecth模块,从远程主机抓取单个文件,暂时不能是目录

[root@centos7 data]#ansible all -m fetch -a ‘src=/var/log/messages dest=/data/’

dest=/data/表示本机目录

[root@centos7 data]#tree /data

/data

├── 192.168.67.131

│   └── var

│       └── log

│           └── messages

├── 192.168.67.132

│   └── var

│       └── log

│           └── messages

└── 192.168.67.53

└── var

└── log

└── messages

 

9 directories, 3 files

 

如果需要抓取多个文件。可以将文件先打包,然后抓取

 

 

file模块,设置文件属性

[root@centos7 data]#ansible all -m file -a ‘dest=/data/f1 state=touch’        创建文件

state=touch、absent、directory、link   absent表示删除、directory表示创建文件夹

dest 、name、 path三个单词效果是等价

 

创建链接

[root@centos7 data]#ansible all -m file -a ‘src=/etc/fstab dest=/data/fstab.link state=link’

删除链接

[root@centos7 data]#ansible all -m file -a ‘dest=/data/fstab.link state=absent’

 

 

hostname模块,更改主机名

ansible 192.168.67.53 -m hostname -a ‘name=centos6’

 

cron模块,创建计划任务

ansible all -m cron -a ‘minute=* weekday=1,3,5 job=”/usr/bin/wall hello how are you !” name=notice’

 

禁用计划任务

ansible all -m cron -a ‘disabled=true job=”/usr/bin/wall hello how are you !” name=notice’

job和name都需要指定,

 

删除计划任务

ansible all -m cron -a ‘job=”/usr/bin/wall how are you !” name=notice state=absent’

 

 

yum模块

ansible all -m yum -a ‘name=vsftpd’  安装vsftp

ansible all -m yum -a ‘name=vsftpd state=removed’  卸载

 

批量安装包ansible all -m yum -a ‘name=vsftpd,dhcp,http’

批量卸载,同上

 

单独安装某个包,假设此包在ansible客户端上没有

  1. 把安装包复制到客户端上

ansible all -m copy -a ‘src=/data/tree-1.6.0-10.el7.x86_64.rpm dest=/root’

  1. 安装

ansible all -m yum -a ‘name=/root/tree-1.6.0-10.el7.x86_64.rpm disable_gpg_check=yes’

 

清除yum缓存

ansible all -m yum -a ‘name=dstat update_cache=yes’

 

 

service模块,管理服务

ansible all -m service -a ‘name=vsftpd state=started enabled=yes’  启动服务,并且开机启动

restarted ,stop

 

user模块

创建nginx系统用户

[root@centos7 data]#ansible all -m user -a ‘name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=110’

 

删除用户并删除家目录

ansible all -m user -a ‘name=nginx state=absent remove=yes’

 

group管理组

创建组

ansible all -m group -a ‘name=wang system=yes gid=110’

 

删除组

ansible all -m group -a ‘name=wang system=yes state=absent’

 

 

 

ansible-galaxy

连接https://galaxy.ansible.com 下载相应的roles

列出所有已安装的galaxy

ansible-galaxy list

安装galaxy

ansible-galaxy install geerlingguy.redis

删除galaxy

ansible-galaxy remove geerlingguy.redis

 

ansible-vault

功能:管理加密解密yml文件

ansible-vault [create|decrypt|edit|encrypt|rekey|view]

ansible-vault encrypt hello.yml 加密

ansible-vault decrypt hello.yml 解密

ansible-vault view hello.yml 查看

ansible-vault edit hello.yml 编辑加密文件

ansible-vault rekey hello.yml 修改口令

ansible-vault create new.yml 创建新文件

 

ansible-console:2.0+新增,可交互执行命令,支持tab

root@test(2)[f:10] $

执行用户@当前操作的主机组(当前组的主机数量)[f:并发数]$

设置并发数:forks n 例如:forks 10

切换.:cd 主机组例如:cd web

 

列出当前组主机列表:list

列出所有的内置:?或help

示例:

root@all (2)[f:5]$ list

root@all (2)[f:5]$ cd appsrvs

root@appsrvs (2)[f:5]$ list

root@appsrvs(2)[f:5]$ yum name=httpdstate=present

root@appsrvs(2)[f:5]$ service name=httpdstate=started

 

playbook的编写

– hosts: appsrv

remote_user: root

 

tasks:

– name: install httpd

yum: name=httpd

 

– name: install configure file

copy: src=/root/httpd.conf dest=/etc/httpd/conf

 

– name: start service

service: name=httpd state=started enabled=yes

 

 运行playbook方式

ansible-playbook fileyml –check 只检测

ansible-playbook fileyml

ansible-playbook fileyml –limit websrv  只针对主机列表中的某些主机执行

-v   -vv   -vvv显示过程

ansible-playbook file.yml –list-tasks  查看playbook中task

ansible-playbook file.yml –list-hosts  查看playbook中主机

 

handlers和notify结合使用触发条件

安装http服务,假如以下playbook已经执行,所有操作已经完成,但之后配置文件发生修改,需重新执行,但服务已经重启过,此条任务将不执行,而无法重新加载配置文件,

 

解决方法

32

还可触发多个

-hosts: websrvs

remote_user: root

tasks:

-name: add group nginx

tags: user

user: name=nginxstate=present

-name: add user nginx

user: name=nginxstate=present group=nginx

-name: Install Nginx

yum: name=nginxstate=present

-name: config

copy: src=/root/config.txtdest=/etc/nginx/nginx.conf

notify:

-Restart Nginx

-Check NginxProcess

 

handlers:

-name: Restart Nginx

service: name=nginxstate=restarted enabled=yes

-name: Check Nginxprocess

shell: killall-0 nginx> /tmp/nginx.log

 

playbook中tags使用

33

ansible-playbook -t install,start httpd.yml  可以选择标签执行

也可以将两个标签的设为同一名字,执行时将同时执行两个任务

 

playbook中变量的使用

34

1.执行的时候给变量赋值

35

2.在playbook中定义变量

36

  1. 在/etc/ansible/hosts中定义

普通变量:主机组中主机单独定义,优先级高于公共变量

公共(组)变量:针对主机组中所有主机定义同一变量

 

 

ansible-playbook app.yml

 

变量优先级

命令行 playbook 主机清单 模板文件

setup模块定义了系统自带的变量

如:查看ansible_fqdn变量

ansible all -m setup -a ‘filter=”ansible_fqdn”‘

 

变量可以专门写入一个文件中,然后调用就可以

如:在/etc/ansible/下创建一个vars.yml

var1: httpd

var2: vsftpd

 

编写剧本调用

ansible-playbook testvars.yml

 

模板templates

Jinja2语言,使用字面量,有下面形式

字符串:使用单引号或双引号

数字:整数,浮点数

列表:[item1, item2, …]

元组:(item1, item2, …)

字典:{key1:value1, key2:value2, …}

布尔型:true/false

算术运算:+, -, *, /, //, %, **

比较操作:==, !=, >, >=, <, <=

逻辑运算:and, or, not

流表达式:For If When

 

模板文件放置没有严格要求,可以在ansible目录下创建文件夹templates,和playbook平级

template也是个模块,只能用于playbook,不能用于ansible命令行中

 

templates功能:根据模块文件动态生成对应的配置文件

templates文件必须存放于templates目录下,且命名为.j2 结尾

yaml/yml文件需和templates目录平级,目录结构如下:

./

├── temnginx.yml

└── templates

└── nginx.conf.j2

利用template,引用变量

例:nginx的安装,

在/etc/ansible/下创建templates目录

1.复制模板文件并且改名以.j2为后缀

cp /etc/nginx/nginx.conf  /etc/ansible/templates/nginx.conf.j2

2.编辑模板文件,引用一个变量,cpu个数变量ansible_processor_vcpus,此时的cup个数为1

ansible all -m setup | grep processor

vim /etc/ansible/templates/nginx.conf.j2

3.编写playbook

4.执行playbook

ansible-playbook temnginx –limit 192.168.67.132

 

5.根据变量引用,worker process变为原来4倍

 

 

 

 

 

 

 

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/100290

发表评论

登录后才能评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班