ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优势,实现了批量系统配置、批量程序部署、批量运行命令等功能。(百度百科)
自动化便是一种思想,也是一种悟,其方法论是相通的【规范--标准--自动化--智能化】在介绍到ansible不得不说这是一个新贵,不论是什么运维管理工具,其主要目的与要实现的功能是一至的,若是考虑到更多细节问题的话,主要还要看现有环境是否须要一款运维自动化管理工具,须要一款什么样的自动化工具才算得上运维人员的利器。其实大部分自动化工具软件均可以知足通常的企业作为生产环境使用。php
ansible的特性:node
安装:依赖于epel源
配置文件:/etc/ansible/ansible.cfg
Inventory: /etc/ansible/hostspython
如何查看模块帮助:mysql
ansible执行状态不一样颜色的含义:nginx
YAMLgit
playbook基础组件web
ansible依赖于Python 2.6或更高的版本、paramiko、PyYAML及Jinja2。sql
解决依赖关系
#yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
#tar xf ansible-2.7.9.tar.gz
#cd ansible-2.7.9
#python setup.py build
#python setup.py install
#mkdir /etc/ansible
#cp -r examples/* /etc/ansibleshell
#yum install ansible
注意:不一样版本的ansible的功能差别可能较大编程
/etc/ansible/ansible.cfg /etc/ansible/hosts
command: 命令模块,默认模块,用于在远程主机执行命令
ansible]# ansible web01 -m command -a 'date'
ansible]# ansible all -a 'date' 【能够省略-m command】
cron:
ansible]# ansible web01 -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"' ansible]# ansible web01 -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job" state=absent' ansible]# ansible web01 -a 'crontab -l'
user:
ansible]# ansible all -m user -a 'name="user11"' ansible]# ansible all -m user -a 'name="user11" state=absent'
group:
ansible]# ansible web01 -m group -a 'name=mysql gid=306 system=yes' ansible]# ansible web01 -m user -a 'name=mysql uid=306 system=yes group=mysql'
copy:
ansible]# ansible all -m copy -a 'src=/etc/fstab dest=/tmp/fstab.ansible owner=root mode=640' ansible]# ansible all -m copy -a 'content="Hello Ansible" dest=/tmp/test.ansible'
file: 设定文件属性
path=: 指定文件路径,可使用name或dest来替代;
建立文件的符号连接:
src=: 指明源文件
path=: 指明符号连接文件路径
ansible]# ansible all -m file -a 'owner=mysql group=mysql mode=600 path=/tmp/fstab.ansible' ansible]# ansible all -m file -a 'path=/tmp/fstab1.link src=/tmp/fstab.ansible state=link' ansible]# ansible all -m file -a 'owner=mysql group=mysql mode=600 path=/tmp/fstab.link src=/tmp/fstab.ansible state=link'
ping: 测试指定主机是否能链接
ansible]# ansible all -m ping
service: 指定运行状态
enabled=: 是否开机自动启动,取值为true或者false;
name=: 指明服务名称
state=: 状态,取值有started, stopped, restarted;
ansible]# ansible web -a 'service httpd start' 【启动httpd服务】 ansible]# ansible web -a 'service httpd status' 【查看服务状态】 ansible]# ansible web -a 'chkconfig --list httpd' 【查看服务是否能开机启动】 ansible]# ansible web -m service -a 'enabled=true name=httpd state=started'
shell: 在远程主机上运行命令
ansible]# ansible all -m user -a 'name=user1' ansible]# ansible all -m command -a 'echo 123456 | passwd --stdin user1' 【执行不成功】 ansible]# ansible all -m shell -a 'echo 123456 | passwd --stdin user1' 【有变量或管道时不要使用command模块了,建议使用shell模块】
script: 将本地脚本复制到远程主机并运行之;
ansible]# ansible all -m yum -a "name=zsh" ansible]# ansible all -m yum -a "name=zsh state=absent"
ansible]# ansible all -m setup
playbook的组成结构:
Inventory 【应用哪些主机】
Modules 【调用哪些模块】
Ad hoc Commands 【在这个主机上运行哪些命令】
Playbooks
Tasks: 任务,即调用模块完成的某操做
Variables: 变量
Templates: 模板
Handlers: 处理器,由某事件触发执行的操做
Roles: 角色
简单示例1: - hosts: websrvs remote_user: root tasks: - name: create nginx group group: name=nginx system=yes gid=208 - name: create nginx user user: name=nginx uid=208 group=nginx system=yes - hosts: dbsrvs remote_user: root tasks: - name: copy file to dbsrvs copy: src=/etc/inittab dest=/tmp/inittab.ans 简单示例2: - hosts: websrvs remote_user: root tasks: - name: install httpd package yum: name=httpd state=latest - name: install configuration file for httpd copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf - name: start httpd service service: enabled=true name=httpd state=started 简单示例3: - hosts: all remote_user: root vars: - username: user10 tasks: - name: create {{ username }} user user: name={{ username }} when: ansible_fqdn == "node2.com"
(1) 目录名同角色名 (2) 目录结构有固定格式 files: 静态文件 templates: Jinjia2模板文件 tasks: 至少有main.yml文件,定义各tasks handlers: 至少有一个main.yml文件,定义各handlers vars: 至少有一个main.yml文件,定义变量 mate: 定义依赖关系等信息 (3)【调用时在roles目录以外,一般使用site.yml定义playbook】 site.yml中定义playbook,额外也能够有其它的yml文件
[root@node1 ~]# mkdir -pv ansible_playbooks/roles/{websrvs,dbsrvs}/{tasks,files,templates,meta,handlers,vars} 【建立roles目录】
[root@node1 ~]# tree ansible_playbooks/
ansible_playbooks/
└── roles
├── dbsrvs
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
└── websrvs
├── files
├── handlers
├── meta
├── tasks
├── templates
└── vars
[root@node1 websrvs]# cp /root/conf/httpd.conf files/ [root@node1 websrvs]# vim tasks/main.yml - name: install httpd package yum: name=httpd - name: install configuration file copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf tags: - conf notify: - restart httpd - name: start httpd service: name=httpd state=started [root@node1 websrvs]# vim handlers/main.yml - name: restart httpd service: name=httpd state=restarted root@node1 websrvs]# vim vars/main.yml {http_port: 80, maxClients: 100} 【必须是字典格式】 - http_port: 80 - maxClients: 200 [root@node1 ansible_playbooks]# vim site.yml - hosts: web remote_user: root roles: - websrvs [root@node1 ansible_playbooks]# ansible-playbook site.yml
[root@node1 ansible_playbooks]# vim site.yml 【代码屡次调用】 - hosts: 192.168.200.202 remote_user: root roles: - websrvs - hosts: 192.168.200.203 remote_user: root roles: - dbsrvs - hosts: 192.168.200.200 remote_user: root roles: - websrvs - dbsrvs [root@node1 dbsrvs]# cp /etc/my.cnf files/ [root@node1 dbsrvs]# vim tasks/main.yml - name: install mysql-server package yum: name=mysql-server state=latest - name: install configuration file copy: src=my.cnf dest=/etc/my.cnf tags: - myconf notify: - restart mysqld - name: start mysqld service service: name=mysqld enabled=true state=started [root@node1 dbsrvs]# vim handlers/main.yml - name: restart mysqld service: name=mysqld state=restarted [root@node1 ansible_playbooks]# ansible-playbook site.yml
运维自动化的工做包括:运维工做:系统安装(物理机、虚拟机)--> 程序包安装、配置、服务启动 --> 批量操做 --> 程序发布 --> 监控
运维自动化也是一个迭代的过程,ansible使用技巧须要与各公司的流程相结合才能更完美的落地,对于前人们的推荐的说法是:几十台的设备用ansible管理,几百台的设备用saltstack,上千台则是puppet,其它相关话题就不在此展开了。最后说明一下像有的环境不能提供agent部署,这时就可利用ansible agentless这一点来实现自动化。ansible是一个轻量级的自动化工具,目前支持程序安装配置、批量操做、程序发布、监控都有与ansible结合的案例。
经常使用命令总结:
建立目录 # ansible -i /u01/ops/ansible/hosts web01 -m file -a "path=/tmp/test state=directory" 建立文件 # ansible -i /u01/ops/ansible/hosts web -m file -a "path=/tmp/test.txt state=touch" 删除文件 # ansible -i /u01/ops/ansible/hosts web -m file -a "path=/tmp/test.txt state=absent" 建立连接 # ansible -i /u01/ops/ansible/hosts web01 -m file -a "src=/etc/fstab dest=/tmp/fstab state=link" 复制文件 # ansible -i /u01/ops/ansible/hosts web02 -u root -m copy -a "src=/u01/syswin.com.sh dest=/tmp mode=755 owner=root group=root backup=yes" # ansible dbservers -m copy -a 'src=/etc/ansible/memcached-1.4.15.tar.gz dest=/tmp' # ansible dbservers -a "ls /tmp" 查看远程文件 # ansible -i /u01/ops/ansible/hosts web01 -u root -m command -a 'ls /tmp' -k # ansible -i /u01/ops/ansible/hosts web01 -a 'cat /tmp/tmp.txt' web01 | success | rc=0 >> abcd 1234 文件不存在--命令执行 # ansible -i /u01/ops/ansible/hosts web01 -a 'creates=/tmp/ccxx.txt ls /home' 远程服务器服务 # ansible -i /u01/ops/ansible/hosts web01 -m shell -a 'ps -ef |grep rpc' raw # ansible -i /u01/ops/ansible/hosts web01 -m service -a 'name=httpd state=stopped' # ansible -i /u01/ops/ansible/hosts web01 -m service -a 'name=httpd state=stopped sleep=3 ' # ansible -i /u01/ops/ansible/hosts web01 -m service -a 'name=httpd state=started sleep=3 enabled=yes' 计划任务 每3分钟ls 一下/u01 # ansible -i /u01/ops/ansible/hosts web01 -m cron -a 'name="check home directory" minute=*/3 job="ls -lh /u01"' 软件安装 # ansible -i /u01/ops/ansible/hosts web01 -m yum -a 'name=httpd state=installed' 添加用户 # ansible -i /u01/ops/ansible/hosts web01 -m command -a 'useradd -s /sbin/nologin -M user1' # ansible -i /u01/ops/ansible/hosts web01 -m command -a 'id user1' # ansible -i /u01/ops/ansible/hosts web01 -m user -a 'createhome=yes home=/home/user2 password=123456 name=user2 state=present shell=/bin/bash' 删除用户 # ansible -i /u01/ops/ansible/hosts web01 -m user -a 'remove=yes state=absent name=user2' rsync同步 # ansible -i /u01/ops/ansible/hosts web01 -m synchronize -a 'src=./ansible.cfg dest=/tmp/ mode=push delete=yes rsync_path=/usr/bin/rsync rsync_opts="-avz,--exclude=.git"'
常见问题解决方法:
一、ansible-playbook 命令执行过程出现 skipping: no hosts matched 说明没有此主机,须要检查hosts文件。
二、执行ansible命令时ERROR,注意引号位置别加错了
三、在2.11版本之后再也不支持指定' name: "{{ item }}" '
[DEPRECATION WARNING]: Invoking "yum" only once while using a loop via squash_actions is deprecated. Instead of using a loop to supply multiple items and specifying `name: "{{ item }}"`, please use `name: ['php-mysql', 'php', 'php-fpm']` and remove the loop. This feature will be removed in version 2.11. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
解决方法以下: