Ansible自动化运维工具使用

一 Ansible简介
   1.absible定义
   ansible是一个轻量级的运维管理工具,基于Python研发。可实现对系统的批量管理配置程序的批量部署批量的运行命令等功能。仅需在任意管理主机安装ansible程序即可实现批量管理被管控主机且被管控的主机无需客户端。
   2.ansible特性
   1、no agents:不需要在被管控主机上安装任何客户端;

   2、no server:无服务器端,使用时直接运行命令即可;

   3、modules in any languages:基于模块工作,可使用任意语言开发模块;

   4、yaml,not code:使用yaml语言定制剧本playbook

   5、ssh by default:基于SSH工作;

   6、strong multi-tier solution:可实现多级指挥。

   3.优点

   1、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;

   2、批量任务执行可以写成脚本,而且不用分发到远程就可以执行;

   3、使用python编写,维护更简单,ruby语法过于复杂;

   4、支持sudo

   4.基本架构

   Modules:模块化 
   Core Modules 核心模块 
   Customed Modules 自定义模块 
   Host Iventory 主机库清单,定义要管理的主机 
   Files 可以通过配置文件来实现 
   CMDB 也可以通过外部存储来实现 
   PlayBooks 剧本,定义每个主机所扮演的角色 
   Connection Plugins:连接插件,主要连接各管控主机 
   5.工作机制

二 Ansible安装
   1.ansible需python2.6以上版本
     
     
  1. [root@test1 ~]# python -V
  2. Python2.7.5
  3. # 安装python驱动(不然下面会报错)
  4. yum install python-devel -y
   2.安装ansible
      
      
  1. #setuptools安
  2. cd
  3. wget https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz
  4. tar xvzf setuptools-7.0.tar.gz
  5. cd setuptools-7.0
  6. python setup.py install
  7. #pycrypto模块安装
  8. wget https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz
  9. tar -xzf pycrypto-2.6.1.tar.gz
  10. cd pycrypto-2.6.1
  11. python setup.py install
  12. #PyYAML模块安装
  13. cd
  14. wget http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz
  15. tar -xzf yaml-0.1.5.tar.gz
  16. cd yaml-0.1.5
  17. ./configure --prefix=/usr/local
  18. make -j `grep processor /proc/cpuinfo| wc -l` && make install
  19. cd
  20. wget https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz
  21. tar -xzf PyYAML-3.11.tar.gz
  22. cd PyYAML-3.11
  23. python setup.py install
  24. #Jinja2模块安装
  25. cd
  26. wget https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz
  27. tar -xzf MarkupSafe-0.9.3.tar.gz
  28. cd MarkupSafe-0.9.3
  29. python setup.py install
  30. cd
  31. wget https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gz
  32. tar xvzf Jinja2-2.7.3.tar.gz
  33. cd Jinja2-2.7.3
  34. python setup.py install
  35. #paramiko模块安装
  36. cd
  37. wget https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.11.tar.gz
  38. tar xvzf ecdsa-0.11.tar.gz
  39. cd ecdsa-0.11
  40. python setup.py install
  41. cd
  42. wget https://pypi.python.org/packages/source/p/paramiko/paramiko-1.15.1.tar.gz
  43. tar xvzf paramiko-1.15.1.tar.gz
  44. cd paramiko-1.15.1
  45. python setup.py install
  46. #ansible 2.2.2安装
  47. cd
  48. wget http://releases.ansible.com/ansible/ansible-2.2.2.0.tar.gz
  49. tar -xzf ansible-2.2.2.0.tar.gz
  50. cd ansible-2.2.2.0
  51. python setup.py install
  52. mkdir /etc/ansible
  53. cp -rp examples/* /etc/ansible/
   3.yum安装
    
    
  1. yum install epel-release -y
  2. yum install ansible -y
三 Ansible相关配置
   1.ansible相关文件及命令
    
    
  1. 主程序目录:/etc/ansible/
  2. 主配置文件:/etc/ansible/ansible.cfg
  3. 默认主机清单:/etc/ansible/hosts
  4. 插件目录:/usr/share/ansible_plugins
  5. 主要命令:/usr/bin/ansible
  6. /usr/bin/ansible-console
  7. /usr/bin/ansible-doc
  8. /usr/bin/ansible-galaxy
  9. /usr/bin/ansible-playbook
  10. /usr/bin/ansible-pull
  11. /usr/bin/ansible-vault
  12. #常用格式
  13. ansible <host-pattern>[-f forks][-m module][-a args]
  14. host-pattern # 可以是all,或者配置文件中的主机组名
  15. -v,–verbose 详细模式,如果命令执行成功,输出详细的结果(-vv vvv -vvvv)
  16. -i PATH,–inventory=PATH 指定host文件的路径,默认是在/etc/ansible/hosts
  17. -f NUM,–forks=NU NUM是指定一个整数,默认是5,指定fork开启同步进程的个数。
  18. -m NAME,–module-name=NAME 指定使用的module名称,默认是command
  19. -m DIRECTORY,–module-path=DIRECTORY 指定module的目录来加载module,默认是/usr/share/ansible,
  20. -a,MODULE_ARGS 指定module模块的参数
  21. -k,-ask-pass 提示输入ssh的密码,而不是使用基于ssh的密钥认证
  22. -sudo 指定使用sudo获得root权限
  23. -K,-ask-sudo-pass 提示输入sudo密码,与–sudo一起使用
  24. -u USERNAME,-user=USERNAME 指定移动端的执行用户
  25. -C,-check 测试此命令执行会改变什么内容,不会真正的去执行
  26. #查看各模块
  27. ansible-doc [options][modules]
  28. # 主要选项有:
  29. -l或--list # 列出可用的模块
  30. -s或--snippet #显示指定模块的简略使用方法
   2.配置文件介绍
   配置文件:/etc/ansible/ansible.cfg
     
     
  1. hostfile=/etc/ansible/hosts #指定默认hosts配置的位置
  2. host_key_checking =False#不进行host_key检查,省去目标key发生变化时输入(yes/no)的步骤
  3. ask_pass=True# 每次执行ansible命令是否询问ssh密码
  4. ask_sudo_pass=True# 每次执行ansible命令时是否询问sudo密码
   配置文件:/etc/ansible/hosts
     
     
  1. # Ex 1: Ungrouped hosts, specify before any group headers.
  2. 直接给出主机,IP主机名都可以
  3. ## green.example.com
  4. ## blue.example.com
  5. ## 192.168.100.1
  6. ## 192.168.100.10
  7. # Ex 2: A collection of hosts belonging to the 'webservers' group
  8. 把几个主机分组,用中括号定义组名
  9. ## [webservers]
  10. ## alpha.example.org ...
  11. ## 192.168.1.100 ...
  12. # If you have multiple hosts following a pattern you can specify
  13. 对主机进行通配001:006表示到一个范围
  14. ## www[001:006].example.com
  15. # Ex 3: A collection of database servers in the 'dbservers' group
  16. 定义一组数据库服务器
  17. ## [dbservers]
  18. ## db02.intranet.mydomain.net ...
  19. ## 10.25.1.56 ...
  20. #参数解释
  21. 1, ansible_ssh_host :
  22. 指定主机别名对应的真实 IP,如:100 ansible_ssh_host=192.168.1.100,随后连接该主机无须指定完整 IP,只需指定251就行
  23. 2, ansible_ssh_port :
  24. 指定连接到这个主机的 ssh 端口,默认22
  25. 3, ansible_ssh_user:
  26. 连接到该主机的 ssh 用户
  27. 4, ansible_ssh_pass:
  28. 连接到该主机的ssh密码(连-k 选项都省了),安全考虑还是建议使用私钥或在命令行指定-k 选项输入
  29. 5, ansible_sudo_pass: sudo 密码
  30. 6, ansible_sudo_exe: sudo 命令路径
  31. 7, ansible_connection :
  32. 连接类型,可以是localssh paramikoansible1.2之前默认为 paramiko
  33. 8, ansible_ssh_private_key_file :私钥文件路径
  34. 9, ansible_shell_type :
  35. 目标系统的 shell 类型,默认为 sh,如果设置 csh/fish,那么命令需要遵循它们语法
  36. 10, ansible_python_interpreter :
  37. python 解释器路径,默认是/usr/bin/python,但是如要要连BSD系统的话,就需要该指令修改 python 路径
  38. 11, ansible__interpreter :
  39. 这里的"*"可以是 ruby perl 或其他语言的解释器,作用和 ansible_python_interpreter 类似
   3.主机与被控机建立ssh公私匙连接
   1.主机配置文件添加被控端
      
      
  1. cat >>/etc/ansible/hosts <<EOF
  2. [web]
  3. 192.168.1.168
  4. 192.168.1.186
  5. EOF
   2.配置ssh无密码登录
      
      
  1. #1.主机生成ssh密钥
  2. [root@test1 ~]# ssh-keygen
  3. Generating public/private rsa key pair.
  4. Enter file in which to save the key (/root/.ssh/id_rsa):
  5. Enter passphrase (empty for no passphrase):
  6. Enter same passphrase again:
  7. Your identification has been saved in/root/.ssh/id_rsa.
  8. Your public key has been saved in/root/.ssh/id_rsa.pub.
  9. The key fingerprint is:
  10. e4:99:c4:17:c9:68:86:3c:ac:1b:20:19:c4:36:c1:fe root@test1
  11. The key's randomart image is:
  12. +--[ RSA 2048]----+
  13. |==. o . o.. |
  14. |o=. =.+ o. |
  15. |o... . ++ . |
  16. | . o + + |
  17. | . o S |
  18. | E. |
  19. | |
  20. | |
  21. | |
  22. +-----------------+
  23. #2.将公钥发到被管理节点用户的.ssh目录
  24. [root@test1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.168
  25. The authenticity of host '192.168.1.168(192.168.1.168)' can't be established.
  26. ECDSA key fingerprint is 80:a7:8d:c6:6c:14:27:5c:2b:dd:17:5e:ec:60:33:1c.
  27. Are you sure you want to continue connecting (yes/no)? yes
  28. /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
  29. /usr/bin/ssh-copy-id: INFO:1 key(s) remain to be installed --if you are prompted now it is to install the new keys
  30. root@192.168.1.168's password:
  31. Number of key(s) added: 1
  32. Now try logging into the machine, with: "ssh 'root@192.168.1.168'"
  33. and check to make sure that only the key(s) you wanted were added.
  34. #3.验证无密码配置是否成功
  35. [root@test1 ~]# ssh root@192.168.1.168
  36. Last login: Wed Apr 12 11:02:08 2017 from 192.168.1.110
  37. [root@test2 ~]#
  38. #192.168.186执行2,3步即可
    3.测试主机连通性
       
       
  1. #测试web组中机器联通性(测试所有用all)
  2. [root@test1 ~]# ansible web -m ping
  3. 192.168.1.168| SUCCESS =>{
  4. "changed": false,
  5. "ping":"pong"
  6. }
  7. 192.168.1.186| SUCCESS =>{
  8. "changed": false,
  9. "ping":"pong"
  10. }
   4.常见模块
     
     
  1. ping:探测目标主机是否存活;
  2. 举例: ansible all -m ping
  3. command:在远程主机执行命令;
  4. 举例:ansible all -m command -a "ifconfig"
  5. 举例:ansible all -m command -a "useradd centos"
  6. shell:在远程主机上调用shell解释器运行命令,支持shell的各种功能,如管道等
  7. 举例:ansible all -m shell -a "echo centos |passwd --stdin centos"
  8. copy:复制文件,给定内容生成文件,mode, owner, group,follow...
  9. 拷贝文件
  10. 举例:ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=640"
  11. 生成文件
  12. 举例:ansible all -m copy -a "content='hell\nworld\n' dest=/tmp/fstab.ansible mode=640"
  13. file:设置文件属性
  14. 更改文件属主
  15. 举例:ansible all -m file -a "path=/tmp/fstab.ansible owner=centos"
  16. 删除文件
  17. 举例:ansible all -m file -a "path=/tmp/fstab.ansible state=absent"
  18. state 用来定义目标文件状态的
  19. 创建指定文件空目录
  20. 举例:ansible all -m file -a "path=/tmp/dir.ansible state=directory"
  21. 链接文件
  22. 举例:ansible all -m file -a "path=/tmp/test.ansible.link src=/tmp/test.ansible
  23. state=link"
  24. fetch:从远程主机拉取一个文件
  25. ansible是用来管理多节点的,从远程拉取多个文件到目标主机显然不近乎仁义。所以用scp就能搞定。略过
       
       
  1. cron:用来管理crontab的周期性任务
  2. 定义一个任务
  3. 举例:ansible all -m cron -a "minute'*/5' job='/usr/sbin/ntpdate 10.1.0.1 &>/dev/null'
  4. name='sync time'"
  5. crontab -l
  6. 删除一个任务
  7. 举例:ansible all -m cron -a "name='sync time' state=absent"
  8. 只删除用ansible定义的名
  9. hostname:定义主机名
  10. 举例:
  11. yum:使用yum包管理器,完成程序包管理
  12. 举例:ansible all -m yum -a "name=httpd"安装
  13. 举例:ansible all -m yum -a "name=httpd state=absent"删除
  14. service:控制服务,控制服务是否开机自动启动
  15. 举例:ansible all -m service -a "name=httpd state=started enbaled=true"
  16. script模块:
  17. 目的:在指定节点上执行/root/a.sh脚本(该脚本是在ansible主控端)
  18. 命令:ansible 10.1.1.113-m script -a ‘/root/a.sh
  19. group:添加或者删除组
  20. 举例:
  21. user:管理组账号
  22. 举例:
  23. setup:收集远程各主机的各种属性之和
  24. 举例:ansible all -m setup

   5.PlayBook(各角色定义)(官方实例:https://github.com/ansible/ansible-examples
   playbook是由一个或多个"play"组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来将,所谓的task无非是调用ansible的一个module。将多个paly组织在一个playbook中,即可以让他们联通起来按事先编排的机制同唱一台大戏。
     
     
  1. playbook核心元素:
  2. Tasks:任务,由模块定义的操作的列表;
  3. Variables:变量
  4. Templates:模板,即使用了模板语法的文本文件;
  5. Handlers:由特定条件触发的Tasks
  6. Roles:角色;自包含,有完整独立实体
  7. playbook的基础组件:
  8. Hosts:运行指定任务的目标主机,可多个;
  9. remote_user:在远程主机以哪个用户身份执行;
  10. sudo_user:非管理员需要拥有sudo权限;
  11. tasks:给出任务列表,执行完一个,执行第二个
  12. 模块,模块参数:
  13. 格式:
  14. (1) action: module arguments //任务执行过程
  15. (2) module name: arguments //指定运行的模块
   playbook实例1(指挥web组内主机安装httpd并监听8080端口)
      
      
  1. - hosts: web
  2. remote_user: root
  3. tasks:
  4. - name: install httpd package
  5. yum: name=httpd state=latest
  6. tags: installpkg #指明跑某个标签 -t installpkg
  7. - name: install conf file
  8. copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
  9. tags: installconf #指明跑某个标签 -t installconf
  10. notify: restart httpd service
  11. - name: start httpd service
  12. service: name=httpd state=started
  13. handlers:#处理器,也是任务,在一定条件触发
  14. - name: restart httpd service
  15. service: name=httpd state=restarted
  16. #检查语法,测试执行
  17. ansible-playbook --syntax-check -t installconf --list-tags httpd.yaml
  18. ansible-playbook --syntax-check httpd.yaml
  19. ansible-playbook --list-hosts --list-tasks httpd.yaml
       
       
  1. 注意:
  2. handlers:是指在一定条件下触发,指明在一个需要让别人重启服务才生效的任务上使用notify,通知一定是handlers名字
  3. tags:只执行playbook中指定的tags标签,满足部分需要,多个任务可指明一个同tags
  4. 也可以一次调用两个标签,如下
  5. annsible-playbook -t installconfinstallpkg httpd.yaml
   playbook实例2(自定义变量Varable,可自定义安装任意程序包)
        
        
  1. vim name.yaml
  2. - hosts: web
  3. remote_user: root
  4. vars:
  5. - pkgname: memcached #playbook中使用变量Variables
  6. tasks:
  7. - name: install a package
  8. yum: name={{ pakgname }} state=present #自定义变量
  9. #语法测试
  10. ansible-playbook --syntax-check name.yaml
  11. ansible-playbook -e pkgname=httpd/vsftpd/ name.yaml
  12. #对应配置文件hosts设置
  13. vim /etc/ansible/hosts
  14. [web]
  15. 192.168.1.168 pkgname=nginx
  16. 192.168.1.186 pkgname=httpd
  17. [web:vars]#为一个内不同主机定义相同变量,效果同上
  18. #web组内有一组变量vars,其中变量pkgname值是memcaches
  19. pkgname=memcached
         
         
  1. Inventory还可以使用参数:
  2. 用于定义ansible远程连接目标主机使用的属性,而非传递给playbook的变量
  3. 如:[webserver]
  4. 192.168.1.168 ansible_ssh_user= ansible_ssh_pass ansible_sudo_pass
  5. 不再是传递给playbook变量,而是主机本身。
    when条件判断
          
          
  1. - name: start nginx service on CentOS6
  2. shell: service nginx start
  3. when: ansible_distribution =="CentOS" and ansible_distribution_major_version =="6"
  4. - name: start nginx service
  5. shell: systemctl start nginx.service
  6. when: ansible_distribution =="CentOS" and ansible_distribution_major_version =="7"
   基于字符串列表给出元素 循环:迭代,需要重复执行的任务;
          
          
  1. - name: install package
  2. yum: name={{ item }} state=latest
  3. with_items:
  4. - httpd
  5. - php
  6. - php-mysql
  7. - php-mbstring
  8. - php-gd
   基于字典列表出元素 循环:迭代,需要重复任务;
          
          
  1. - name: creat groups //第一个任务
  2. yum: name={{ item }} state=latest
  3. with_items:
  4. - groupx1
  5. - groupx2
  6. - groupx3
  7. - name: creat users //第二个任务
  8. user: name={{ item.name }} group={{ item.group }} state=present
  9. with_items://元素列表
  10. -name:'userx1', group:'groupx1'//name键值队
  11. -name:'userx1', group:'groupx1'//name键值队
  12. -name:'userx1', group:'groupx1'//name键值队
   

角色(自包含,按照目录结构来组织)

     
     
  1. 指定由哪些主机去对应的完成哪个已定义好的角色
  2. roles是以特定的层级目录结构进行组织的tasksvariableshandlerstemplates
  3. role_name/
  4. files/:存储由copyscript等模块调用的文件;
  5. tasks/:核心配置,分发资源和安装软件
  6. handlers/: 发生改变则执行的操作(notify触发
  7. vars/: 定义变量
  8. templates/:存储由template模块调用的模板文本;
  9. meta/: 说明信息,角色依赖等,一般不用
  10. default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值