一 Ansible简介
![](https://img-blog.csdn.net/20170418141924022?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSHpTdW5zaGluZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
1.absible定义
![](https://img-blog.csdn.net/20170418141913014?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSHpTdW5zaGluZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Customed Modules 自定义模块
Host Iventory 主机库清单,定义要管理的主机
Files 可以通过配置文件来实现
CMDB 也可以通过外部存储来实现
PlayBooks 剧本,定义每个主机所扮演的角色
Connection Plugins:连接插件,主要连接各管控主机
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以上版本
[root@test1 ~]# python -V
Python2.7.5
#
安装python驱动(不然下面会报错)yum install python-devel -y
2.安装ansible
#setuptools安装
cd
wget https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz
tar xvzf setuptools-7.0.tar.gz
cd setuptools-7.0
python setup.py install
#pycrypto模块安装
wget https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz
tar -xzf pycrypto-2.6.1.tar.gz
cd pycrypto-2.6.1
python setup.py install
#PyYAML模块安装
cd
wget http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz
tar -xzf yaml-0.1.5.tar.gz
cd yaml-0.1.5
./configure --prefix=/usr/local
- make -j `grep processor /proc/cpuinfo| wc -l` && make install
- cd
wget https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz
tar -xzf PyYAML-3.11.tar.gz
cd PyYAML-3.11
python setup.py install
#Jinja2模块安装
cd
wget https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz
tar -xzf MarkupSafe-0.9.3.tar.gz
cd MarkupSafe-0.9.3
python setup.py install
- cd
wget https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gz
tar xvzf Jinja2-2.7.3.tar.gz
cd Jinja2-2.7.3
python setup.py install
#paramiko模块安装
cd
wget https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.11.tar.gz
tar xvzf ecdsa-0.11.tar.gz
cd ecdsa-0.11
python setup.py install
cd
wget https://pypi.python.org/packages/source/p/paramiko/paramiko-1.15.1.tar.gz
tar xvzf paramiko-1.15.1.tar.gz
cd paramiko-1.15.1
python setup.py install
- #ansible 2.2.2安装
cd
- wget http://releases.ansible.com/ansible/ansible-2.2.2.0.tar.gz
- tar -xzf ansible-2.2.2.0.tar.gz
cd ansible-2.2.2.0
python setup.py install
mkdir /etc/ansible
cp -rp examples/* /etc/ansible/
3.yum安装
yum install epel-release -y
yum install ansible -y
三 Ansible相关配置
1.ansible相关文件及命令
主程序目录:/etc/ansible/
主配置文件:/etc/ansible/ansible.cfg
默认主机清单:/etc/ansible/hosts
- 插件目录:/usr/share/ansible_plugins
主要命令:/usr/bin/ansible
/usr/bin/ansible-console
/usr/bin/ansible-doc
/usr/bin/ansible-galaxy
/usr/bin/ansible-playbook
/usr/bin/ansible-pull
/usr/bin/ansible-vault
#常用格式
ansible <host-pattern>[-f forks][-m module][-a args]
- host-pattern # 可以是all,或者配置文件中的主机组名
-v,–verbose 详细模式,如果命令执行成功,输出详细的结果(-vv –vvv -vvvv)
-i PATH,–inventory=PATH 指定host文件的路径,默认是在/etc/ansible/hosts
-f NUM,–forks=NU NUM是指定一个整数,默认是5,指定fork开启同步进程的个数。
-m NAME,–module-name=NAME 指定使用的module名称,默认是command
-m DIRECTORY,–module-path=DIRECTORY 指定module的目录来加载module,默认是/usr/share/ansible,
-a,MODULE_ARGS 指定module模块的参数
-k,-ask-pass 提示输入ssh的密码,而不是使用基于ssh的密钥认证
-sudo 指定使用sudo获得root权限
-K,-ask-sudo-pass 提示输入sudo密码,与–sudo一起使用
-u USERNAME,-user=USERNAME 指定移动端的执行用户
-C,-check 测试此命令执行会改变什么内容,不会真正的去执行
#查看各模块
ansible-doc [options][modules]
# 主要选项有:
-l或--list # 列出可用的模块
-s或--snippet #显示指定模块的简略使用方法
2.配置文件介绍
配置文件:/etc/ansible/ansible.cfg
hostfile=/etc/ansible/hosts #指定默认hosts配置的位置
host_key_checking =False#不进行host_key检查,省去目标key发生变化时输入(yes/no)的步骤
ask_pass=True# 每次执行ansible命令是否询问ssh密码
ask_sudo_pass=True# 每次执行ansible命令时是否询问sudo密码
配置文件:/etc/ansible/hosts
# Ex 1: Ungrouped hosts, specify before any group headers.
直接给出主机,IP主机名都可以
## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10
# Ex 2: A collection of hosts belonging to the 'webservers' group
把几个主机分组,用中括号定义组名
## [webservers]
## alpha.example.org ...
## 192.168.1.100 ...
# If you have multiple hosts following a pattern you can specify
对主机进行通配001:006表示到一个范围
## www[001:006].example.com
# Ex 3: A collection of database servers in the 'dbservers' group
定义一组数据库服务器
## [dbservers]
## db02.intranet.mydomain.net ...
## 10.25.1.56 ...
#参数解释
1, ansible_ssh_host :
指定主机别名对应的真实 IP,如:100 ansible_ssh_host=192.168.1.100,随后连接该主机无须指定完整 IP,只需指定251就行
2, ansible_ssh_port :
指定连接到这个主机的 ssh 端口,默认22
3, ansible_ssh_user:
连接到该主机的 ssh 用户
4, ansible_ssh_pass:
连接到该主机的ssh密码(连-k 选项都省了),安全考虑还是建议使用私钥或在命令行指定-k 选项输入
5, ansible_sudo_pass: sudo 密码
6, ansible_sudo_exe: sudo 命令路径
7, ansible_connection :
连接类型,可以是local、ssh 或 paramiko,ansible1.2之前默认为 paramiko
8, ansible_ssh_private_key_file :私钥文件路径
9, ansible_shell_type :
目标系统的 shell 类型,默认为 sh,如果设置 csh/fish,那么命令需要遵循它们语法
10, ansible_python_interpreter :
python 解释器路径,默认是/usr/bin/python,但是如要要连BSD系统的话,就需要该指令修改 python 路径
11, ansible__interpreter :
这里的"*"可以是 ruby 或 perl 或其他语言的解释器,作用和 ansible_python_interpreter 类似
3.主机与被控机建立ssh公私匙连接
1.主机配置文件添加被控端
cat >>/etc/ansible/hosts <<EOF
[web]
192.168.1.168
192.168.1.186
EOF
2.配置ssh无密码登录
#1.主机生成ssh密钥
[root@test1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in/root/.ssh/id_rsa.
Your public key has been saved in/root/.ssh/id_rsa.pub.
The key fingerprint is:
e4:99:c4:17:c9:68:86:3c:ac:1b:20:19:c4:36:c1:fe root@test1
The key's randomart image is:
+--[ RSA 2048]----+
|==. o . o.. |
|o=. =.+ o. |
|o... . ++ . |
| . o + + |
| . o S |
| E. |
| |
| |
| |
+-----------------+
#2.将公钥发到被管理节点用户的.ssh目录
[root@test1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.168
The authenticity of host '192.168.1.168(192.168.1.168)' can't be established.
ECDSA key fingerprint is 80:a7:8d:c6:6c:14:27:5c:2b:dd:17:5e:ec:60:33:1c.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/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
root@192.168.1.168's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.1.168'"
and check to make sure that only the key(s) you wanted were added.
#3.验证无密码配置是否成功
[root@test1 ~]# ssh root@192.168.1.168
Last login: Wed Apr 12 11:02:08 2017 from 192.168.1.110
[root@test2 ~]#
#192.168.186执行2,3步即可
3.测试主机连通性
#测试web组中机器联通性(测试所有用all)
[root@test1 ~]# ansible web -m ping
192.168.1.168| SUCCESS =>{
"changed": false,
"ping":"pong"
}
192.168.1.186| SUCCESS =>{
"changed": false,
"ping":"pong"
}
4.常见模块
ping:探测目标主机是否存活;
举例: ansible all -m ping
command:在远程主机执行命令;
举例:ansible all -m command -a "ifconfig"
举例:ansible all -m command -a "useradd centos"
shell:在远程主机上调用shell解释器运行命令,支持shell的各种功能,如管道等
举例:ansible all -m shell -a "echo centos |passwd --stdin centos"
copy:复制文件,给定内容生成文件,mode, owner, group,follow,...
拷贝文件
举例:ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=640"
生成文件
举例:ansible all -m copy -a "content='hell\nworld\n' dest=/tmp/fstab.ansible mode=640"
file:设置文件属性
更改文件属主
举例:ansible all -m file -a "path=/tmp/fstab.ansible owner=centos"
删除文件
举例:ansible all -m file -a "path=/tmp/fstab.ansible state=absent"
state 用来定义目标文件状态的
创建指定文件空目录
举例:ansible all -m file -a "path=/tmp/dir.ansible state=directory"
链接文件
举例:ansible all -m file -a "path=/tmp/test.ansible.link src=/tmp/test.ansible
state=link"
fetch:从远程主机拉取一个文件
ansible是用来管理多节点的,从远程拉取多个文件到目标主机显然不近乎仁义。所以用scp就能搞定。略过
cron:用来管理crontab的周期性任务
定义一个任务
举例:ansible all -m cron -a "minute'*/5' job='/usr/sbin/ntpdate 10.1.0.1 &>/dev/null'
name='sync time'"
crontab -l
删除一个任务
举例:ansible all -m cron -a "name='sync time' state=absent"
只删除用ansible定义的名
hostname:定义主机名
举例:
yum:使用yum包管理器,完成程序包管理
举例:ansible all -m yum -a "name=httpd"安装
举例:ansible all -m yum -a "name=httpd state=absent"删除
service:控制服务,控制服务是否开机自动启动
举例:ansible all -m service -a "name=httpd state=started enbaled=true"
script模块:
目的:在指定节点上执行/root/a.sh脚本(该脚本是在ansible主控端)
命令:ansible 10.1.1.113-m script -a ‘/root/a.sh‘
group:添加或者删除组
举例:
user:管理组账号
举例:
setup:收集远程各主机的各种属性之和
举例:ansible all -m setup
5.PlayBook(各角色定义)(官方实例:https://github.com/ansible/ansible-examples)
playbook是由一个或多个"play"组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来将,所谓的task无非是调用ansible的一个module。将多个paly组织在一个playbook中,即可以让他们联通起来按事先编排的机制同唱一台大戏。
playbook核心元素:
Tasks:任务,由模块定义的操作的列表;
Variables:变量
Templates:模板,即使用了模板语法的文本文件;
Handlers:由特定条件触发的Tasks;
Roles:角色;自包含,有完整独立实体
playbook的基础组件:
Hosts:运行指定任务的目标主机,可多个;
remote_user:在远程主机以哪个用户身份执行;
sudo_user:非管理员需要拥有sudo权限;
tasks:给出任务列表,执行完一个,执行第二个
模块,模块参数:
格式:
(1) action: module arguments //任务执行过程
(2) module name: arguments //指定运行的模块
playbook实例1(指挥web组内主机安装httpd并监听8080端口)
- hosts: web
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=latest
tags: installpkg #指明跑某个标签 -t installpkg
- name: install conf file
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
tags: installconf #指明跑某个标签 -t installconf
notify: restart httpd service
- name: start httpd service
service: name=httpd state=started
handlers:#处理器,也是任务,在一定条件触发
- name: restart httpd service
service: name=httpd state=restarted
#检查语法,测试执行
ansible-playbook --syntax-check -t installconf --list-tags httpd.yaml
ansible-playbook --syntax-check httpd.yaml
ansible-playbook --list-hosts --list-tasks httpd.yaml
注意:
handlers:是指在一定条件下触发,指明在一个需要让别人重启服务才生效的任务上使用notify,通知一定是handlers名字
tags:只执行playbook中指定的tags标签,满足部分需要,多个任务可指明一个同tags
也可以一次调用两个标签,如下
annsible-playbook -t installconf,installpkg httpd.yaml
playbook实例2(自定义变量Varable,可自定义安装任意程序包)
vim name.yaml
- hosts: web
remote_user: root
vars:
- pkgname: memcached #playbook中使用变量Variables
tasks:
- name: install a package
yum: name={{ pakgname }} state=present #自定义变量
#语法测试
ansible-playbook --syntax-check name.yaml
ansible-playbook -e pkgname=httpd/vsftpd/ name.yaml
#对应配置文件hosts设置
vim /etc/ansible/hosts
[web]
192.168.1.168 pkgname=nginx
192.168.1.186 pkgname=httpd
[web:vars]#为一个内不同主机定义相同变量,效果同上
#web组内有一组变量vars,其中变量pkgname值是memcaches
pkgname=memcached
Inventory还可以使用参数:
用于定义ansible远程连接目标主机使用的属性,而非传递给playbook的变量
如:[webserver]
192.168.1.168 ansible_ssh_user= ansible_ssh_pass ansible_sudo_pass
不再是传递给playbook变量,而是主机本身。
when条件判断
- name: start nginx service on CentOS6
shell: service nginx start
when: ansible_distribution =="CentOS" and ansible_distribution_major_version =="6"
- name: start nginx service
shell: systemctl start nginx.service
when: ansible_distribution =="CentOS" and ansible_distribution_major_version =="7"
基于字符串列表给出元素 循环:迭代,需要重复执行的任务;
- name: install package
yum: name={{ item }} state=latest
with_items:
- httpd
- php
- php-mysql
- php-mbstring
- php-gd
基于字典列表出元素 循环:迭代,需要重复任务;
- name: creat groups //第一个任务
yum: name={{ item }} state=latest
with_items:
- groupx1
- groupx2
- groupx3
- name: creat users //第二个任务
user: name={{ item.name }} group={{ item.group }} state=present
with_items://元素列表
-{name:'userx1', group:'groupx1'}//name键值队
-{name:'userx1', group:'groupx1'}//name键值队
-{name:'userx1', group:'groupx1'}//name键值队
角色(自包含,按照目录结构来组织)
指定由哪些主机去对应的完成哪个已定义好的角色
roles是以特定的层级目录结构进行组织的tasks、variables、handlers、templates…
role_name/
files/:
存储由copy或script等模块调用的文件;tasks/:核心配置,分发资源和安装软件
handlers/: 发生改变则执行的操作(notify触发)
vars/: 定义变量
templates/:
存储由template模块调用的模板文本;meta/: 说明信息,角色依赖等,一般不用
default/:
此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;