一、ansible 介绍
		
Ansible是一个简单高效的自动化运维管理工具,用Python开发,能大批量管理N多台机器,可以并发的在多台机器上部署应用、安装软件、执行命令、配置和编排任务。
文章源自小温Talk.听闻 | 小温Talk-https://azureyun.azurewebsites.net/1941.html
 
 文章源自小温Talk.听闻 | 小温Talk-https://azureyun.azurewebsites.net/1941.html
一、Ansible工作机制
		文章源自小温Talk.听闻 | 小温Talk-https://azureyun.azurewebsites.net/1941.html
 
 文章源自小温Talk.听闻 | 小温Talk-https://azureyun.azurewebsites.net/1941.html
从图中可以看出ansible分为以下几个部份:
文章源自小温Talk.听闻 | 小温Talk-https://azureyun.azurewebsites.net/1941.html
1> Control Node:控制机器
文章源自小温Talk.听闻 | 小温Talk-https://azureyun.azurewebsites.net/1941.html
2> Inventory:主机清单,配置管理主机列表
文章源自小温Talk.听闻 | 小温Talk-https://azureyun.azurewebsites.net/1941.html
3> Playbooks:剧本、任务编排。根据规则定义多个任务,模块组织结构清晰,由ansible自动执行。
文章源自小温Talk.听闻 | 小温Talk-https://azureyun.azurewebsites.net/1941.html
4> Modules(Core | Custom):模块,用于执行某个具体的任务
文章源自小温Talk.听闻 | 小温Talk-https://azureyun.azurewebsites.net/1941.html
5> connection plugin(连接插件):Ansible通过不同的协议连接到远程主机上,执行指定的命令。默认采用ssh协议连接远程主机。
文章源自小温Talk.听闻 | 小温Talk-https://azureyun.azurewebsites.net/1941.html
二、Ansible执行流程
		
 
 
简单理解就是Ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取Inventory中的管理主机列表,并行的在这些主机中执行配置的任务,最后等待执行返回的结果。
Ansible中有两种模式,分别是  Ad-Hoc模式和playbook模式
 
 
二、安装Ansible
		
一台控制主机:192.168.0.202
			
三台管理主机:
- 192.168.100.131
 
- 192.168.100.141
 
- 192.168.100.231
 
安装要求:
			
- 控制服务器:需要安装 Python2.6/2.7
 
- 管理服务器:需要安装 Python2.4 以上版本,若低于 Python2.5 需要安装 pythonsimplejson; 若启用了 selinux,则需要安装 libselinux-python。
 
本次安装基于CentOS7系统环境、Python2.7.5、root用户。
			
2.1、yum安装(推荐)
		
# 安装依赖
			
yum install rpm-build python2-devel sshpass PyYAML python-jinja2 python-paramiko python-six python2-cryptography -y
yum install epel-release -y
yum install ansible -y
2.2、pip安装
		
pip install ansible1
				
注:pip方式安装不会在/etc/ansible目录下生成默认的相关配置文件
		
 三、ansible配置使用
		
3.1、ansible.cfg 配置
		
defaults下的配置项,常用的配置参数:
1)inventory 该参数表示资源清单inventory文件的位置,资源清单就是一些Ansible需要连接管理的主机列表 inventory = /root/ansible/hosts 
		
 
 
2)library Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录 library = /usr/share/ansible 
		
 
 
3)forks 设置默认情况下Ansible最多能有多少个进程同时工作,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管理节点的数量来确定。 forks = 5 
		
 
 
4)sudo_user 这是设置默认执行命令的用户,也可以在playbook中重新设置这个参数 sudo_user = root //注意:新版本已经作了修改,如ansible2.4.1下已经为: default_sudo_user = root 
		
 
 
5)remote_port 这是指定连接被关节点的管理端口,默认是22,除非设置了特殊的SSH端口,不然这个参数一般是不需要修改的 remote_port = 22 
		
 
 
6)host_key_checking 这是设置是否检查SSH主机的密钥。可以设置为True或False host_key_checking = False
		
3.2、hosts配置文件
		
主机登录方式:
			
方式一:ssh用户+ssh密码
			
 [group_name]
		
192.168.100.231:22 ansible_ssh_user=root ansible_ssh_pass='123456'
		
Ssh用户+ssh密码
		
方式二:ssh用户+ssh密钥
			
[group_name]
		
192.168.100.231:22 ansible_ssh_user=root ansible_ssh_private_key_file=idrsapath(密钥路径)
		
Ssh用户+ssh密钥
		
 
 
方式三:别名+ssh用户+ssh密钥
			
[group_name]
		
test1 192.168.100.231:22 ansible_ssh_user=root ansible_ssh_private_key_file=idrsapath(密钥路径)
		
别名+ssh用户+ssh密钥
		
3.3、ansible 使用
				
		
3.3.1、Ansible 组的使用
		
规划两个主机组 test_group1 test_group2
 
 
3.3.2、用户密码、密钥登录
		
场景1 密码登录
			
安装ssh_pass包
		
yum –y install sshpass  #apt-get install sshpass
		
示例如下:
			
[test_group1]
		
192.168.100.231:22 ansible_ssh_user=root ansible_ssh_pass='dianying123?'
		
192.168.100.141:22 ansible_ssh_user=root ansible_ssh_pass='dianying123?'
		
[test_group2]
		
192.168.100.128:22 ansible_ssh_user=root ansible_ssh_pass='dianying123?'
		
192.168.100.142:22 ansible_ssh_user=root ansible_ssh_pass='dianying123?'            
		
场景2 密钥登录
			
- 生成并配置ssh公钥、私钥
 
[root@node0 ansible]# ssh-keygen 
		
Generating public/private rsa key pair.
		
Enter file in which to save the key (/root/.ssh/id_rsa): 
		
/root/.ssh/id_rsa already exists.
		
Overwrite (y/n)? y
		
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:
		
66:7b:8b:17:19:65:73:24:9f:5e:28:24:28:53:dc:ec root@node0
		
The key's randomart image is:
		
+--[ RSA 2048]----+
		
|       o.+. o..  |
		
|      o o oo+o.o |
		
|       o . o.o+ .|
		
|          E  o . |
		
|        S  o  .  |
		
|       o .o      |
		
|        . ..     |
		
|         o..     |
		
|        ...      |
		
+-----------------+
		
[root@node0 ansible]#
		
 
 
拷贝密匙到指定主机
			
[root@node0 ansible]# ssh-copy-id 192.168.100.128
		
root@192.168.100.128's password: 
		
Now try logging into the machine, with "ssh '192.168.100.128'", and check in:
		
 
 
  .ssh/authorized_keys
		
 
 
to make sure we haven't added extra keys that you weren't expecting.
		
 
 
[root@node0 ansible]#
		
 
 
2、ansible 配置文件
3、执行操作
方法一
			
 
 
方法二
			
 
 
 
 
 
 
3.4 ansible的ad-hoc模式
		
3.4.1    什么是ad-hoc模式
		
    Ad-Hoc 是指ansible下临时执行的一条命令,并且不需要保存的命令,对于复杂的命令会使用playbook。Ad-hoc的执行依赖于模块,ansible官方提供了大量的模块。 如:command、raw、shell、file、cron等,具体可以通过ansible-doc -l 进行查看 。可以使用ansible-doc -s module来查看某个模块的参数,也可以使用ansible-doc help module来查看该模块更详细的信息。
Ad-Hoc 简而言之,就是"临时命令"。
 
 
 
 
3.4.2    ad-hoc模式使用场景
		
批量执行、查看 、拷贝
 
 
3.4.3    ad-hoc模式命令使用
		
ansible <host-pattern> [options] 可用选项,那么使用ansible这个命令,有哪些功能和选项呢?
ansible命令的参数,如下:
-v, --verbose:输出更详细的执行过程信息,-vvv可得到所有执行过程信息。
		
-i PATH, --inventory=PATH:指定inventory信息,默认/etc/ansible/hosts。
		
-f NUM, --forks=NUM:并发线程数,默认5个线程。
		
--private-key=PRIVATE_KEY_FILE:指定密钥文件。
		
-m NAME, --module-name=NAME:指定执行使用的模块。
		
-M DIRECTORY, --module-path=DIRECTORY:指定模块存放路径,默认/usr/share/ansible,也可以通过ANSIBLE_LIBRARY设定默认路径。
		
-a 'ARGUMENTS', --args='ARGUMENTS':模块参数。
		
-k, --ask-pass SSH:认证密码。
		
-K, --ask-sudo-pass sudo:用户的密码(—sudo时使用)。
		
-o, --one-line:标准输出至一行。
		
-s, --sudo:相当于Linux系统下的sudo命令。
		
-t DIRECTORY, --tree=DIRECTORY:输出信息至DIRECTORY目录下,结果文件以远程主机名命名。
		
-T SECONDS, --timeout=SECONDS:指定连接远程主机的最大超时,单位是:秒。
		
-B NUM, --background=NUM:后台执行命令,超NUM秒后kill正在执行的任务。
		
-P NUM, --poll=NUM:定期返回后台任务进度。
		
-u USERNAME, --user=USERNAME:指定远程主机以USERNAME运行命令。
		
-U SUDO_USERNAME, --sudo-user=SUDO_USERNAM:E使用sudo,相当于Linux下的sudo命令。
		
-c CONNECTION, --connection=CONNECTION:指定连接方式,可用选项paramiko (SSH), ssh, local。Local方式常用于crontab 和 kickstarts。
		
-l SUBSET, --limit=SUBSET:指定运行主机。
		
-l ~REGEX, --limit=~REGEX:指定运行主机(正则)。
		
--list-hosts:列出符合条件的主机列表,不执行任何其他命令
		
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Ansible <host-pattern> [options]
主机/组/ip地址   参数命令
[root@node0 ansible]# ansible 192.168.100.* -a "hostname"
				
192.168.100.231 | SUCCESS | rc=0 >>
		
localhost.localdomain
		
192.168.100.128 | SUCCESS | rc=0 >>
		
test1
		
192.168.100.141 | SUCCESS | rc=0 >>
		
nginx_1
		
192.168.100.142 | SUCCESS | rc=0 >>
		
localhost.localdomain
		
[root@node0 ansible]#
		
 
 
[root@node0 ansible]# ansible test_group2 -a "hostname"
			
		
192.168.100.128 | SUCCESS | rc=0 >>
		
test1
		
192.168.100.142 | SUCCESS | rc=0 >>
		
localhost.localdomain
		
[root@node0 ansible]# ansible test_group1 -a "hostname" 
		
192.168.100.231 | SUCCESS | rc=0 >>
		
localhost.localdomain
		
192.168.100.141 | SUCCESS | rc=0 >>
		
nginx_1
		
[root@node0 ansible]#
		
 
 
 
 
 
 
3.4.4    ad-hoc模式常用模块
		
| 模块名 | 作用 | 用例 | 
| command | 默认模板 | ansible webservers –a "/sbin/reboot" –f 10 | 
| shell | 执行shell命令 | ansible test –m shell "echo $HOSTNAME" | 
| file   transfer | 文件传输 | ansible test –m copy –a "src=/etc/hosts dest=/tmp/hosts" | 
| managing   packages | 管理软件包 | ansible test –m yum –a "name=nginx state=present" | 
| user and group | 用户和组 | ansible test –m user –a "name=json password=123456" | 
| deploying | 部署模块 | ansible test –m git –a "repo=https://github.com/iopsgroup/imoocc dest=/opt/iops version=HEAD" | 
| managing services | 服务管理 | ansible test –m service –a "name=nginx state=started" | 
| background operations | 后台运行 | ansible test –B 3306 –a "/usr/bin/running_operation –do-stuff" | 
| gathering facts | 收集系统信息 | ansible test –m setup | 
| filter | 匹配 | filter=name* | 
| 
 | 
 | 
 | 
 
 
 
 
3.4.5    场景演示
		
Shell 模块
ansible test_group -m shell -a "hostname"
		
Copy模块
ansible test_group -m copy -a "src=/etc/hosts dest=/etc/ "
		
yum 模块
ansible test_group1 -m yum  -a "name=nginx" -f 10 -l 192.168.100.136
		
ansible test_group1 -m yum  -a "name=nginx" -f 10 -l 192.168.100.136 -vvv
		
 
 
 
 
Service模块
 
 
[root@node0 ansible]# ansible test_group1 -m service -a "name=nginx state=started" -f 10 -l 192.168.100.136
		
192.168.100.136 | SUCCESS => {
		
    "changed": false, 
		
    "name": "nginx", 
		
    "state": "started"
		
}
		
[root@node0 ansible]# ansible test_group1 -m shell -a "netstat -lntup|grep nginx" -f 10 -l 192.168.100.136 
		
192.168.100.136 | SUCCESS | rc=0 >>
		
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      31730/nginx         
		
 
 
[root@node0 ansible]#
		
Git 模块
git--使用git指定服务器
ansible test_group -m git -a "repo=https://github.com/iopsgroup/imoocc dest=/opt/imoocc version=HEAD" -f 10 -l 192.168.100.136
 
 
[root@node0 ~]# ansible test_group -m git -a "repo=https://github.com/iopsgroup/imoocc dest=/opt/imoocc version=HEAD" -f 10 -l 192.168.100.136
		
192.168.100.136 | SUCCESS => {
		
    "after": "9b0f58b04bca0d266b6c633b873471229cfb2568", 
		
    "before": null, 
		
    "changed": true
		
}
		
[root@node0 ~]#
		
 
 
3.5、ansible的playbook模式
		
3.5.1 什么是playbook及其组成
		
play:定义的是主机的角色
task:定义的是具体执行的任务
playbook:由一个或多个play组成,一个play可以包含多个task
 
 
 
 
3.5.2  playbook的优势
		
1、功能比adhoc更全
2、控制好依赖
3、展现更直观
4、持久使用
 
 
3.5.3  playbook的配置方法(语法)
		
- 基本使用
 
- 
playbook基础使用
 ansible-playbook playbook.yml {options} 
 执行选项较多
 https://www.imooc.com/article/22729 
 
 【具体参数】 
 -u REMOTE_USER, --user=REMOTE_USER 
 # ssh 连接的用户名 
 -k, --ask-pass 
 #ssh登录认证密码 
 -s, --sudo 
 #sudo 到root用户,相当于Linux系统下的sudo命令 
 -U SUDO_USER, --sudo-user=SUDO_USER 
 #sudo 到对应的用户 
 -K, --ask-sudo-pass 
 #用户的密码(—sudo时使用) 
 -T TIMEOUT, --timeout=TIMEOUT 
 # ssh 连接超时,默认 10 秒 
 -C, --check 
 # 指定该参数后,执行 playbook 文件不会真正去执行,而是模拟执行一遍,然后输出本次执行会对远程主机造成的修改 
 -e EXTRA_VARS, --extra-vars=EXTRA_VARS 
 # 设置额外的变量如:key=value 形式 或者 YAML or JSON,以空格分隔变量,或用多个-e 
 -f FORKS, --forks=FORKS 
 # 进程并发处理,默认 5 
 -i INVENTORY, --inventory-file=INVENTORY 
 # 指定 hosts 文件路径,默认 default=/etc/ansible/hosts 
 -l SUBSET, --limit=SUBSET 
 # 指定一个 pattern,对- hosts:匹配到的主机再过滤一次 
 --list-hosts 
 # 只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook – 
 -list-tasks 
 # 列出该 playbook 中会被执行的 task 
 –-private-key=PRIVATE_KEY_FILE 
 # 私钥路径 
 --step 
 # 同一时间只执行一个 task,每个 task 执行前都会提示确认一遍 
 --syntax-check 
 # 只检测 playbook 文件语法是否有问题,不会执行该 playbook 
 -t TAGS, --tags=TAGS 
 #当 play 和 task 的 tag 为该参数指定的值时才执行,多个 tag 以逗号分隔 
 --skip-tags=SKIP_TAGS 
 # 当 play 和 task 的 tag 不匹配该参数指定的值时,才执行 
 -v, --verbose 
 #输出更详细的执行过程信息,-vvv可得到所有执行过程信息。 
 
 
 
 
- 使用场景
 
- 
playbook的配置
 --- 
 - host : 192.168.100.136 
 remote_user : root 
 vars : 
 touch : imoocc:file 
 tasks : 
 
- 
name : touch file
 shell : "touch /tmp/{{touch_file}}" 
 
 
- 
执行
 ansible-playbook -i /etc/ansible/hosts --list-hosts /etc/ansible/1.yml 
 
 [root@node0 ansible]# pwd 
 /etc/ansible 
 [root@node0 ansible]# ansible-playbook ./1.yml 
 
- 
执行结果返回
 红色: 表示有task执行失败或者提醒的信息 
 黄色: 表示执行了且改变了远程主机状态 
 绿色: 表示执行成功 
 
- 
主机匹配
 指定主机创建文件夹 
 
 [root@node0 ansible]# cat 1.yml 
 --- 
 - hosts: 192.168.100.136 
 remote_user: root 
 vars: 
 touch_flile: imoocc.file 
 tasks: 
 - name: touch file 
 shell: "touch /tmp/{{touch_flile}}" 
 ... 
 
 
 
 
- 
yaml语法和变量
 1、yaml语法 
 大小写敏感 
 使用缩进表示层级关系(只能空格不能tab) 
 yaml文件以"---"作为文件的开始 
 支持的数据结构 
 字典 列表 纯量:数字、布尔、字符串 
 {name:jeson} -apple 
 -orange 
 -strawberry 
 -mango 
 yaml变量的引用 
 myname : jeson 
 name : "{{myname}}" 
 [root@node0 ansible]# cat 1.yml 
 --- 
 - hosts: 192.168.100.136 
 remote_user: root 
 vars: 
 touch_file: imoocc.file21 
 touch_file1: imoocc.file22 
 tasks: 
 - name: touch file 
 shell: "touch /tmp/{{touch_file}}" 
 - name: touch file1 
 shell: "touch /tmp/{{touch_file1}}" 
 [root@node0 ansible]# 
 2、playbook变量 
 变量名可以为字母,数字以及下划线。 
 playbook的yaml文件中定义变量赋值 
 --extra-vars 执行参数赋给变量 
 
 在文件中定义变量 
 [root@node0 ansible]# cat 1.yml ;cat hosts ; ansible-playbook -i /etc/ansible/hosts 1.yml 
 --- 
 - hosts: 192.168.100.136 
 remote_user: root 
 # vars: 
 # touch_file: imoocc.file21 
 tasks: 
 - name: touch file 
 shell: "touch /tmp/{{touch_file}}" 
 
 [test_group1] 
 192.168.100.231:22 ansible_ssh_user=root ansible_ssh_pass='dianying123?' 
 192.168.100.141:22 ansible_ssh_user=root ansible_ssh_pass='dianying123?' 
 192.168.100.136:22 ansible_ssh_user=root ansible_ssh_pass='dianying123?' 
 [test_group2] 
 192.168.100.142:22 ansible_ssh_user=root 
 192.168.100.128:22 ansible_ssh_user=root 
 [test_group:children] 
 test_group1 
 test_group2 
 [test_group1:vars] 
 touch_file=testfile1 
 
 未完待续 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
文章末尾固定信息

