1.1 IT自动化的好处
1.1.1 团队影响
? 节省时间,提高工作效率
? 消除重复任务
? 更少的错误风险
? 改善协作和工作满意度
1.1.2 企业影响
? 克服复杂性
? 更多创新资源
? 加强问责制和合规性
1.2 Ansible是什么
Ansible是一种IT自动化工具。它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部署,滚动更新。Ansible适用于管理企业IT基础设施,从具有少数主机的小规模到数千个实例的企业环境。Ansible也是一种简单的自动化语言,可以完美地描述IT应用程序基础结构。
1.3 Ansible架构
2. 第 2 章 Ansible安装与配置
2.1 Ansible使用要求
2.1.1 服务端要求
? Python2.6/2.7/3.x
? RedHat,Debian,CentOS,OS X等。不支持Windows
2.1.2 被管理端要求
? OpenSSH
? Python2.6/2.7/3.x
2.2 安装Ansible
? yum install ansible (推荐)
? pip install ansible
? https://releases.ansible.com/ansible or https://github.com/ansible/ansible.git
2.3 配置文件
vim /etc/ansible/ansible.cfg --------ansible的主配置文件
[defaults]
inventory = /etc/ansible/hosts
forks = 5
become = root
remote_port = 22
host_key_checking = False
timeout = 10
log_path = /var/log/ansible.log
private_key_file = /root/.ssh/id_rsa
2.4 Inventory(主机清单)
未分组的主机
green.example.com
blue.example.com
192.168.100.1
192.168.100.10
属于webservers组的主机集合
[webservers]
alpha.example.org
beta.example.org
192.168.1.100
192.168.1.110
www[001:006].example.com
示例3:属于dbservers组主机集合
[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.56
10.25.1.57
db-[99:101]-node.example.com
主机和主机组变量:
[webservers]
192.168.1.10 ansible_ssh_user=root ansible_ssh_pass=‘123456’ http_port=80
192.168.1.11 ansible_ssh_user=root ansible_ssh_pass=‘123456’ http_port=80
[webservers:vars]
http_port=8080
server_name=www.ctnrs.com
组变量分解到单个文件:
cat /etc/ansible/group_vars/webservers.yml
http_port: 8080
server_name: www.ctnrs.com
3. 第 3 章 ad-hoc命令
3.1 命令行工具常用选项,可以使用ansible --help查看帮助
格式:ansible <host-pattern> [ options ]
选项:
-a MODULE_ARGS, --args=MODULE_ARGS 模块参数
-C, --check 运行检查,不执行任何操作
-e EXTRA_VARS, --extra-vars=EXTRA_VARS 设置附加变量 key=value
-f FORKS, --forks=FORKS 指定并行进程数量,默认5
-i INVENTORY, --inventory=INVENTORY 指定主机清单文件路径
--list-hosts 输出匹配的主机列表,不执行任何操作
-m MODULE_NAME, --module-name=MODULE_NAME 执行的模块名,默认command
--syntax-check 语法检查playbook文件,不执行任何操作
-t TREE, --tree=TREE 将日志输出到此目录
-v, --verbose 详细信息,-vvv更多, -vvvv debug
--version 查看程序版本
连接选项:控制谁连接主机和如何连接
-k, --ask-pass 请求连接密码
--private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE 私钥文件
-u REMOTE_USER, --user=REMOTE_USER 连接用户,默认None
-T TIMEOUT, --timeout=TIMEOUT 覆盖连接超时时间,默认10秒
提权选项:控制在目标主机以什么用户身份运行
-b, --become 以另一个用户身份操作
--become-method=BECOME_METHOD 提权方法,默认sudo
--become-user=BECOME_USER 提权后的用户身份,默认root
-K, --ask-become-pass 提权密码
sudo操作实例
ansible webservers -a "ls /root" -u tuwei -k --become -K
需要输入两次密码,一次是连接远程主机,一次是sudo提权
没有配置root用户,连接远程主机普通用户
[[email protected] ansible]# ansible webservers -a "pwd" -u tuwei -k
SSH password:
192.168.132.14 | SUCCESS | rc=0 >>
/home/tuwei
192.168.132.16 | SUCCESS | rc=0 >>
/home/tuwei
3.2 SSH密码认证
[webservers]
192.168.1.10:22 ansible_ssh_user=root ansible_ssh_pass=’123456’
192.168.1.11:22 ansible_ssh_user=root ansible_ssh_pass=’123456’
3.3 SSH秘钥对认证
[webservers]
192.168.1.10:22 ansible_ssh_user=root ansible_ssh_key=/root/.ssh/id_rsa
192.168.1.11:22 ansible_ssh_user=root
配置了密码或者秘钥认证后,在使用ansible执行命令时无需交互。
主机清单已经配置
例如:[[email protected] ~]# ansible webservers -a "df -h"
192.168.132.14 | SUCCESS | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 48G 4.5G 41G 11% /
tmpfs 383M 0 383M 0% /dev/shm
/dev/sda1 194M 29M 155M 16% /boot
192.168.132.16 | SUCCESS | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 18G 5.6G 12G 34% /
tmpfs 284M 0 284M 0% /dev/shm
/dev/sda1 190M 82M 99M 46% /boot
4. 第 4 章 Ansible常用模块
ansible帮助说明可以参考网站https://docs.ansible.com/
4.1 执行shell命令(command和shell)
默认为command,可以省略。但如果命令中有特殊字符,如<> |等,则需要使用shell模块,该模块可以执行所有shell命令
[[email protected] ~]# ansible webservers -m shell -a "netstat -tnlp|grep httpd"
192.168.132.14 | SUCCESS | rc=0 >>
tcp 0 0 :::80 :::* LISTEN 1384/httpd
192.168.132.16 | SUCCESS | rc=0 >>
tcp 0 0 :::80 :::* LISTEN 1974/httpd
4.2 ping模块
用来测试主机是否是通的,不涉及参数。
[[email protected] ~]# ansible webservers -m ping
192.168.132.16 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.132.14 | SUCCESS => {
"changed": false,
"ping": "pong"
}
4.3 script模块
在目标主机上执行管理端的shell脚本。
ansible 192.168.132.16 -m script -a ‘/root/test.sh‘
4.4 文件传输(copy和file)
4.4.1 copy模块主要是用来复制文件到远程目标主机。
backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
content:用于替代”src”,可以直接设定指定文件的值
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
directory_mode:递归的设定目录的权限,默认为系统默认权限
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,
则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
others:所有的file模块里的选项都可以在这里使用
src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。
如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用”/”来结尾,则只复制目录里的内容,如果没有使用”/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
ansible webservers -m copy -a "src=/tools/nagios-3.5.1.tar.gz dest=/tmp"
[[email protected] tools]# ansible webservers -a "ls /tmp"
192.168.132.16 | SUCCESS | rc=0 >>
VMwareDnD
VMwareTools-10.1.15-6627299.tar.gz
cafenv-appconfig
ansibleztwPs
nagios-3.5.1.tar.gz
test.sh
vmware-root
vmware-tools-distrib
192.168.132.14 | SUCCESS | rc=0 >>
ansible_VohgWG
cmdserver.sock
nagios-3.5.1.tar.gz
test.sh
4.4.2 file模块主要用于远程主机上的文件操作,包括以下选项:
force:需要在两种情况下强制创建软链接
1.源文件不存在但之后会建立的情况下
2.目标软连接已经存在,需要取消之前的软链接,然后创建新的软连接,有两个选项:yes|no
group:定义文件/目标的属组
mode:定义文件/目录的权限
owenr:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归的设置文件的属性,只对目录有效
src:要被链接的源文件的路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:directory:如果文件不存在,创建目录
file:即使文件不存在,也不会被创建
link:创建软连接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
实例:
创建目录
ansible webservers -m file -a "path=/tmp/abc123 state=directory"
创建文件
ansible webservers -m file -a "path=/tmp/abc123 state=touch"
4.5 cron模块
cron模块,用来管理计划任务, 包含如下选项:
backup:对远程主机上的原任务计划内容修改之前做备份
cron_file:用来指定一个计划任务文件,也就是将计划任务写到远程主机上/etc/cron.d目录下,
创建一个文件对应的计划任务。 day:日(1-31,<em>,</em>/2,……)
hour:小时(0-23,<em>,</em>/2,……) minute:分钟(0-59,<em>,</em>/2,……)
month:月(1-12,<em>,</em>/2,……)
weekday:周(0-7,*,……)
job:要执行的任务,依赖于state=present
name:定义定时任务的描述信息
special_time: 特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),
weekly(每周),daily(每天),hourly(每小时)
state:确认该任务计划是创建还是删除,有两个值可选,分别是present和absent,present表示创建定时任务,
absent表示删除定时任务,默认为present。
user:以哪个用户的身份执行job指定的任务。
使用示例:
ansible 192.168.132.14 -m cron -a ‘name="job for reboot" special_time=reboot job="/data/bootservice.sh"‘
ansible 192.168.132.14 -m cron -a ‘name="test" weekday="1" minute=40 hour=19 user="root" job="sh /server/scripts/test.sh"‘
查看[[email protected] scripts]# crontab -l
#Ansible: test
40 19 1 sh /server/scripts/test.sh
ansible 192.168.132.14 -m cron -a ‘backup="True" name="autobackup" weekday="6" minute=30 hour=1 user="root" job="/home/ixdba/backup.sh"‘
ansible 192.168.132.14 -m cron -a ‘name="checkhttp" minute=30 hour=12 user="root" job="/home/ixdba/check_http.sh" cron_file="check_http_for_ansible" ‘
ansible 192.168.132.14 -m cron -a ‘name="yum autoupdate" state=absent‘
4.6 service模块
用于管理远程主机上的服务,该模块包含如下选项:
enabled:是否开机启动 yes|no
name:必选项,服务名称
pattern:定义一个模式,如果通过status指令来查看服务的状态时,没有响应,
就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行
sleep:如果执行了restarted,则在stop和start之间沉睡几秒钟
state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
实例:
ansible 192.168.132.14 -m service -a "name=httpd state=stopped"
关闭httpd服务
ansible 192.168.132.14 -m service -a "name=httpd enabled=yes"
4.7 yum模块
进行软件包安装。
实例:state可以是present,表示指定安装,或者是latest即安装最新版
absent表示卸载
ansible 192.168.132.14 -m yum -a "name=lrzsz state=latest"
4.8 user模块
创建用户相关
ansible 192.168.132.14 -m user -a "name=test password=123456"新建用户
ansible 192.168.132.14 -m user -a "name=test password=123456 shell=/sbin/nologin" 创建用户,不让登陆
ansible 192.168.132.14 -m user -a "name=test state=absent" 删除用户
4.9 git模块
从源代码管理系统部署,要使用git,需要目标主机已安装git
ansible 192.168.132.14 -m git -a "repo=https://github.com/ansible/ansible.git dest=/tmp/ansible"
4.10 setup模块ansible 192.168.132.14 -m setup 输出系统信息,在写playbook时用到ansible 192.168.132.14 -m setup -a "filter=ansible_nodename" 利用filter进行输出信息过滤。