Ansible 安装配置及使用
一、ansible 介绍
Ansible是一个简单高效的自动化运维管理工具,用Python开发,能大批量管理N多台机器,可以并发的在多台机器上部署应用、安装软件、执行命令、配置和编排任务。
一、Ansible工作机制
从图中可以看出ansible分为以下几个部份:
1> Control Node:控制机器
2> Inventory:主机清单,配置管理主机列表
3> Playbooks:剧本、任务编排。根据规则定义多个任务,模块组织结构清晰,由ansible自动执行。
4> Modules(Core | Custom):模块,用于执行某个具体的任务
5> connection plugin(连接插件):Ansible通过不同的协议连接到远程主机上,执行指定的命令。默认采用ssh协议连接远程主机。
二、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
未完待续