Ansible

来源:互联网 发布:利用淘宝赚钱灰色项目 编辑:程序博客网 时间:2024/05/31 13:15

   ansible是一款新出现的自动化运维系统,基于python开发并集合了众多运维工具的优点,实现批量系统配置,具有程序部署,批量运行命令等功能。工作特点是基于模块化工作,但本身不具有部署能力,真正具有部署能力的是ansible所运行的模块,ansible只是提供框架且基于ssh验证实现批量通讯和配置。
官网地址:http://www.ansible.com.cn/

安装方式yum install ansible
配置文件/etc/ansible/ansible.cfg
主机清单/etc/ansible/hosts
主程序
      ansible
      ansible-playbook 使用剧本文件时使用此命令
      ansible-doc 可以获取帮助信息的命令

ansible的简单使用格式:

ansible HOST-PATTERN -m MOD_NAME -a MOD_ARGS -f FORKS -C -u USERNAME

HOST-PATTERN 指定主机清单

  • -m 指定模块类型
  • -a 指定模块所带的参数
  • -f 指定一次可以并行执行的主机数,默认为5个,可以在配置文件中修改,
  • -C 为测试用,即干跑而不执行,
  • -u 指定连接到远程主机的用户

实现ansible主机对多台主机的操作

四台虚拟机
node1:192.168.243.7 ansible服务器
node2:192.168.243.8
node3:192.168.243.9
node4:192.168.243.10
准备各节点基于ssh互信通信环境,各节点时间同步

[root@node1 ~]#vim /etc/ansible/hosts   ---修改配置文件,设置主机清单,也就是对哪些主机进行操作44 [websrvs]45 192.168.243.846 192.168.243.947 [dbsrvs]48 192.168.243.949 192.168.243.10 
查看你主机节点列表[root@node1 ~]#ansible all --list-hosts      [root@node1 ~]#ansible websrvs --list-hosts[root@node1 ~]#ansible dbsrvs --list-hosts

1、ping模块:探测远程主机网络是否畅通;

[root@node1 ~]#ansible all -m ping

2、command模块:在远程主机运行命令

[root@node1 ~]#ansible-doc -s command     ---可以查看这个模块的帮助信息[root@node1 ~]#ansible 192.168.243.8 -m command -a "pwd chdir=/tmp"    --- 在主机切换到/tmp目录执行pwd命令[root@node1 ~]#ansible 192.168.243.8 -m command -a "mkdir mydir chdir=/app"     ---在远程主机node2的/app下创建mydir目录[root@node1 ~]#ansible 192.168.243.8 -m command -a "mkdir mydir chdir=/app creates=mydir"   ---creates 表示此文件或者目录如果存在就不执行[root@node1 ~]#ansible 192.168.243.8 -m command -a "touch f1 chdir=/app removes=f1"  ---removes表示文件或者目录如果不存在就不执行,也就是存在才执行

3、shell模块:在远程主机的shell进程下运行命令,支持shell特性,如管道等

[root@node1 ~]#ansible-doc -s shell[root@node1 ~]#ansible websrvs -m command -a "useradd user1"   在远程的两台主机上创建user1 用户[root@node1 ~]#ansible websrvs -m shell  -a "echo CENTOS|passwd --stdin user1"    --创建密码[root@node1 ~]#ansible websrvs  -m shell -a "echo CENTOS|passwd --stdin user1 executable=/bin/tcsh"  指定shell类型

4、group模块:管理组账号

[root@node1 ~]#ansible websrvs  -m group -a "name=haproxy system=no state=present"  ---state为状态,指明是创建还是删除,创建用present,删除用absent[root@node1 ~]#ansible websrvs  -m group -a "name=haproxy system=no state=absent"   ---删除组[root@node1 ~]#ansible websrvs -C -m group -a "name=haproy system=no state=present"  ---先干跑一边看有没有错误

5、user模块:管理用户账号

[root@node1 ~]#ansible websrvs  -m user -a "name=tom  groups=haproxy state=present uid=3000 shell=/usr/bin/sh"[root@node1 ~]#ansible websrvs  -m user -a "name=tom  groups=haproxy state=present uid=3000 shell=/usr/bin/sh generate_ssh_key=true"  ---创建用户并生成公钥私钥对

6、copy模块: 复制文件或者目录到远程

[root@node1 ~]#vim /app/test.txt[root@node1 ~]#cat /app/test.txt hellow mageduwelcome[root@node1 ~]#ansible all -m copy -a "src=/app/test.txt dest=/app/ owner=daemon group=nobody mode=664"[root@node1 ~]#ansible all -m copy -a "content='hellow true\n how are you\n' dest=/app/text2.txt" ---也可以复制一个内容到远程主机文件中

7、fetch模块:从远程主机取文件

[root@node1 ~]#ansible 192.168.243.10 -m fetch -a "src=/etc/fstab dest=/app/fstab"   ---注意这里只能在一台主机上取

8、file模块:设置文件的属性、创建空文件和目录软连接等

[root@node1 ~]# ansible all -m file -a "path=/app/hidir state=directory owner=nobody mode=770"   ---在远程主机创建一个空目录,并指定权限[root@node1 ~]# ansible all -m file -a "path=/app/ff state=touch owner=nobody mode=770"   ---创建空文件并指定权限,注意这里只能用touch [root@node1 ~]# ansible all -m file -a "path=/app/ff state=file owner=daemon mode=770"   ---file只能用于已经存在文件修改权限,如果文件不存在不会创建[root@node1 ~]# ansible all -m file -a "path=/app/fff src=/app/ff state=link"  --- 创建一个软链接文件/app/fff指向源文件/app/ff注意:state属性的可用值:file,directory,link,hard,touch,absent[root@node1 ~]#ansible all -m file -a "path=/app/fff state=absent"   ---删除文件

9、get_url模块: Downloads files from HTTP, HTTPS, or FTP to node

[root@node1 app]#ansible all -m get_url -a "url=http://mirrors.sohu.com/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7 dest=/app"  ---下载网上的文件到多台主机常用的参数: *url*dest,sha256sum,owner, group, mode,*表示必须给定的

10、cron 模块:Manage cron.d and crontab entries.

[root@node1 app]#ansible all -m cron -a "name=timecron job='/usr/sbin/ntpdate 172.18.0.1 &>/dev/null' minute=*/5 disabled=true state=present"       ---- disabled=true表示创建的时候加注释[root@node2 network-scripts]#crontab  -l   Ansible: timecron# */5 * * * * /usr/sbin/ntpdate 172.18.0.1 &>/dev/null   ---前面带注释,没有生效[root@node1 app]#ansible all -m cron -a "name=timecron job='/usr/sbin/ntpdate 172.18.0.1 &>/dev/null' minute=*/5 disabled=false state=present"   ---创建的时候不带注释,如果不加disabled,默认是不加注释的[root@node2 network-scripts]#crontab  -lAnsible: timecron*/5 * * * * /usr/sbin/ntpdate 172.18.0.1 &>/dev/null [root@node1 app]#ansible all -m cron -a "name=timecron job='/usr/sbin/ntpdate 172.18.0.1 &>/dev/null' minute=*/5 state=absent"  ---删除

11、yum模块:在远程主机安装软件包

[root@node1 app]#ansible websrvs -m yum -a "name=nginx state=latest"  ---latest指安装最新版本

12、pip模块:在远程主机安装python库

常用参数name,state,version

13、npm模块:在远程主机安装node.js库

常用参数name,state,version

14、service模块:管理服务

[root@node1 app]#ansible websrvs -m service -a "name=nginx enabled=true state=started"   ---在远程的两个主机上启动nginx服务

15、git模块:Deploy software (or files) from git checkouts
在websrvs每个节点上yum install git
访问此https://github.com/
搜索fastdfs

[root@node1 app]#ansible websrvs -m git -a "repo=https://github.com/happyfish100/fastdfs.git dest=/app/fastdfs"  ---可以在github上下载软件或者文件到远程多台主机

16、haproxy模块:Enable, disable, and set weights for HAProxy backend servers using socket commands.
常用参数: backend、 host、 state、 weight
可以标记多台后端主机的状态,实现灰度发布

17、setup模块:可以收集远程主机的系统信息,包括cup核心数、可用物理内存等等

[root@node1 app]#ansible 172.18.21.100 -m setup

收集远程主机的系统信息,这些信息是由特定格式的键和值组成的,键可以做为ansible的系统内建变量,可以调用这些变量使用,以后想使用哪些变量,可以用这种方式查找变量,相当于查字典的方式,如果要调用变量里面嵌套的变量可以使用外面的变量名[嵌套的变量]的方式实现

18、 template模块:基于模板方式生成一个文件复制到远程主机
主要参数:*src,*dest,owner,group,mode
注意此模块只能在playbook中使用,而不能在命令行中使用,因
为只有ansible-playbook才能收集内建变量。


Ansible的Playbook

Playbook:是YAML[jæməl]格式,格式module: arguments,注意:shell和command模块后面直接跟命令,而非key=value类的参数列表
Playbook的核心元素:

  • Hosts:主机
  • Tasks:任务列表
  • Variables:变量
  • Templates:包含了模板语法的文本文件;
  • Handlers:由特定条件触发的任务;
  • Roles:角色

示例1:在websrvs上安装并启动nginx,在dbsrvs上安装并启动redis

[root@node1 ~]#vim nginx.yaml   ---创建一个playbook   

这里写图片描述

在copy 语句中,/app/目录下已经存在我们配置好的redis.conf 文件,从而可以复制到安装节点上

[root@node1 ~]#ansible-playbook --syntax-check nginx.yaml    ---检查语法[root@node1 ~]#ansible-playbook --list-hosts nginx.yaml    ---查看远程主机[root@node1 ~]#ansible-playbook --list-tasks nginx.yaml    ---查看任务[root@node1 ~]#ansible-playbook  nginx.yaml   ---执行操作

总结:一定要注意yaml格式,前面的空格要对齐,不然总会出错,创建好playbook先行语法,playbook文件一般是以.yaml或者.yml结尾。语句后面结尾汉字注释,在实验中不要输入,会检查语法报错。

示例2:添加tags和handlers执行特定的任务
这里写图片描述

[root@node1 ~]#ansible-playbook --list-tags nginx.yaml  ---查看添加的标签[root@node1 ~]#vim /app/redis.conf ---更改配置文件requirepass "CENTOS"    ---添加一个密码[root@node1 ~]#ansible-playbook -t chconfig  nginx.yaml    ---发现只执行复制配置文件到远程主机和重启操作如果添加了多个标签想要一并执行,在-t后面指定标签的名称并用逗号隔开即可

示例3:在playbook、命令行及主机清单文件中定义变量

[root@node1 app]#vim pkg.yaml  

这里写图片描述

[root@node1 app]#ansible-playbook --syntax-check pkg.yaml  ---检查语法[root@node1 app]#ansible-playbook -C pkg.yaml   ---测试干跑一下[root@node1 app]#ansible-playbook -e "pkgname=memcached" -C pkg.yaml   --也可以用-e选项在命令行定义变量,在命令行定义的变量会优先于playbook中定义的变量
[root@node1 app]#ansible-playbook -e "pkgname=memcached" -C pkg.yamlPLAY [websrvs] *****************************************************************TASK [setup] *******************************************************************ok: [192.168.243.9]ok: [192.168.243.8]TASK [install package memcached] ***********************************************changed: [192.168.243.8]changed: [192.168.243.9]PLAY RECAP *********************************************************************192.168.243.8              : ok=2    changed=1    unreachable=0    failed=0   192.168.243.9              : ok=2    changed=1    unreachable=0    failed=0   
[root@node1 app]#vim /etc/ansible/hosts  ---在主机清单中定义变量[websrvs]192.168.243.8 pkgname=memcached  不同的主机设置不同的变量192.168.243.9 pkgname=haproxy[root@node1 app]#ansible-playbook -C pkg.yaml ---在这里要将剧本中的变量去掉,否则不会生效,说明playbook中的变量优先于主机清单中的变量[root@node1 app]#vim /etc/ansible/hosts ---也可以这样定义在同一个组内的主机定义相同的变量[websrvs]192.168.243.8192.168.243.9 [websrvs:vars]pkgname=memcached[root@node1 app]#ansible-playbook -C pkg.yaml ---测试

总结:定义变量有三种方式,分别是在playbook中、命令行和主机清单配置文件中定义,在命令行中定义的变量优先于在playbook中定义的变量,在playbook中定义的变量优先于在主机清单中定义的变量,调用变量要使用双大括号,并且大括号前后都要有空格,以上定义的变量都是自定义变量。

示例4:定义ansible远程连接目标主机时使用的参数

以上用ssh连接到远程主机进行操作时使用的是基于key的验证方式,实际上也可以使用如下方式连接,给定用户名和密码的方式ssh连接到远程主机
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansbile_sudo_pass

[root@node1 app]#vim /etc/ansible/hosts [websrvs]192.168.243.9  ansible_ssh_user=root  ansible_ssh_pass=CENTOS  ---在主机清单中给定用户名和密码的方式ssh

总结:此种方法不可取,因为会暴露密码,一般都是基于key的验证方式进行ssh连接,知道有这种方法就可以。

示例5:使用模板文件

[root@node1 app]#ansible 192.168.243.8 -m setup |grep mem  ---查看ansible和内存有关的内建变量,不同的主机,因为系统信息不同,内建变量的值是不相同的[root@node1 app]#vim /app/redis.conf.j2maxmemory {{ ansible_memtotal_mb / 2 }}mb    ---调用这个内建变量创建一个.j2格式的模板文件,注意模板文件的后缀必须为.j2 

[root@node1 app]#vim redis_conf.yaml —创建一个剧本

这里写图片描述

[root@node1 app]#ansible-playbook --syntax-check redis_conf.yaml [root@node1 app]#ansible-playbook -C redis_conf.yaml 在远程主机上打开redis的配置文件[root@node2 ~]#less /etc/redis.confmaxmemory 911.5mb    ---是运算后的结果了

总结:template模块会基于上面的模板文件进行处理后再生成一个文件复制到远程主机,如果不是基于template模块进行处理后生成的文件发给远程主机,而是直接将模板文件用copy模块复制给远程主机,远程主机是识别不了的,利用模板的方式可以实现根据不同主机的系统信息进行不同的配置。比如每个主机的ansible_memtotal_mb是不同的,调用这个变量并进行运算就可以使不同主机有不同的配置。

4、条件测试

示例1:

条件测试:        when语句:在task中使用,jinja2的语法格式            tasks:             - name: install conf file to centos7            template: src=files/nginx.conf.c7.j2            when: ansible_distribution_major_version == "7"            - name: install conf file to centos6            template: src=files/nginx.conf.c6.j2            when: ansible_distribution_major_version == "6"

示例2:实现在不同的主机上复制不同的文件
node2:192.168.243.8
172.18.251.151
node3:192.168.243.9
172.18.252.62
这里写图片描述
[root@node1 app]#echo host1 > diff.txt
[root@node1 app]#echo host2 > diff2.txt
[root@node1 app]#ansible-playbook copy_file.yaml
注意:[root@node1 app]#ansible 192.168.243.8 -m setup 可以查看到
ansible_default_ipv4 模块默认识别的是虚拟机桥接网卡IP172网段,因此在满足条件IP写172的IP ,写192网段的IP不能识别出来。
当然我们也可以把条件语句改为

 6    when: ansible_ens36.ipv4.address == '192.168.243.8' 9    when: ansible_ens36.ipv4.address == '192.168.243.9'

测试:
在两个主机node2和node3 分别查看,发现复制的文件不同

5、循环
迭代,需要重复执行的任务
对迭代项的引用,固定变量名为”item”,而后要在task中使用with_items给定要迭代的元素列表
示例1
这里写图片描述

示例2:在websrvs主机上安装tomcat组件
这里写图片描述

[root@node1 app]#ansible-playbook tomcat.yaml 

注意: - jdk_version: 1.8.0 —注意变量名里面不能使用-,否则会报错,下划线可以使用

示例3:安装不同版本
可以实现在远程主机上安装指定版本的包
这里写图片描述

示例4:实现将tomcat的两个不同的配置文件拷贝到远程主机

首先ansible服务器有配置好的这两个文件,然后在拷贝到远程主机[root@node1 app]#scp node2:/etc/tomcat/server.xml ./[root@node1 app]#scp node2:/etc/tomcat/tomcat-users.xml ./

这里写图片描述

原创粉丝点击