Ansible用 SSH 协议管理机器,通过python脚本来实现的,所以管理机和托管机都需要安装python2.6以及更高的版本,除此之外被管理的机器不需要安装任何组件。因此,批量操作的环境是比较轻量的。
/etc/ansible/ansible.cfg:主配置文件
# 禁用验证host_key_checking(建议开启)
host_key_checking=False
# 定义库文件位置,脚本,或者存放可通信主机的目录
inventory = /etc/ansible/hosts
# ansible默认搜寻模块的位置 Ansible知道如何搜寻多个用冒号隔开的路径,同时也会搜索在playbook中的"./library"。
library = /usr/share/my_modules/
# 日志存放位置 默认不开启,ansible将会吧模块加载纪录在系统日志系统中.不包含用密码。(建议开启)
log_path=/var/log/ansible.log
# 默认是command模块。(建议参数改为shell)
module_name = command
# 默认ansible会为输出结果加上颜色。如果你想关闭这一功能,可以把nocolor设置为1。
nocolor=0
# 默认ansible可以调用一些cowsay的特性,使得/usr/bin/ansible-playbook运行起来更加愉快。如果不喜欢cows,可以通通过将nocows设置为1来禁用这一选项:
nocows=0
# 对于Ansible中的异步任务,这个是设置定义,当具体的poll interval没有定义时,多少时间回查一下这些任务的状态,默认值是一个折中选择15秒钟。
poll_interval=15
# 如果你是用pem密钥文件而不是SSH客户端或密钥认证的话, 你可以设置这里的默认值, 来避免每一次提醒设置密钥文件位置"--ansible-private-keyfile"
private_key_file=/path/to/file.pem
# 这个设置是你系统默认的远程SSH端口, 如果不指定,默认为22号端口:(建议修改成别的端口)
remote_port = 22
# 这是个ansible使用/usr/bin/ansible-playbook连接的默认用户名。注意如果不指定, /usr/bin/ansible默认使用当前用户名称:
remote_user = root
# 默认SSH链接尝试超时时间
timeout = 10
# 默认通信机制为smart。如果本地系统支持ControlPersist技术的话, 将会使用(基于OpenSSH)ssh, 如果不支持该技术,将使用paramiko库,其他传输选项包括local, chroot,jail等等。用户通常可以这个设置为smart,让playbook在需要的条件自己选择connectin参数
transport = smart
# 默认设置会记录并验证通过在用户hostfile中新发现的的主机(如果host_key_checking 被激活的话)。这个选项在有很多主机的时候将会性能很差。在这种情况下,建议使用SSH传输代替。当设置为False时, 性能将会提升,在host_key checking被禁用时候, 建议使用
record_host_keys=True
# 如果这个设置为True, scp将代替用来为远程主机传输文件
scp_if_ssh=False
# 执行ansible模块来使用管道特性, 从而减少执行远程模块SSH操作次数。当使用sudo操作的时候, 必须在所有管理的主机的/etc/sudoers中禁用requiretty
pipelining=False
# 在急速模式下使用的端口。
accelerate_port = 5099
# 设置从客户机获取数据的超时时间。如果在这段时间内没有数据传输,套接字连接会被关闭。考虑到异步任务,超时时间应该大于2倍的poll_interval,默认值为30秒
accelerate_timeout = 30
# 设置套接字调用的超时时间。默认设置为1.0秒
accelerate_connect_timeout = 1.0
# 控制加速daemon守护进程的超时时间,单位分钟,默认为30分钟
accelerate_daemon_timeout = 30
# 设置将允许多个私钥被加载到daemon
accelerate_multi_key = yes
/etc/ansible/hosts:主机清单
# Ex 1: 未分组的主机,在任何组头之前指定。
green.example.com
blue.example.com
192.168.100.1
192.168.100.10
# Ex 2: webservers组
[webservers]
alpha.example.org
beta.example.org
192.168.1.100
192.168.1.110
# 如果有多个主机遵循一种模式,则可以指定
www[001:006].example.com
# Ex 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
/etc/ansible/roles:角色
/usr/share/ansible_plugins:插件
Ansible 工具集包含 Inventory、Modules、Plugins 和 API。
Inventory:用来管理设备列表,可以通过分组实现,对组的调用直接影响组内的所有主机;
Modules:是各种执行模块,几乎所有的管理任务都是通过模块执行的;
Plugins:提供了各种附加功能,如连接类型插件、循环插件、变量插件、过滤插件等;
API:供第三方程序调用的应用程序编程接口,可以基于此做 Ansible的二次开发;
ansible基于ssh协议的,所以批量请求主机,需要验证登录信息。账号密码登录不安全,所以基于key验证是最佳解决方案。
# 生成密钥,本机会生成~/.ssh/id_rsa.pub,id_rsa两文件
ssh-keygen -t rsa -C "solt" -f ''/root/.ssh/id_rsa'
-t 指定要创建的密钥类型。可以使用:"rsa1"(SSH-1) "rsa"(SSH-2) "dsa"(SSH-2),默认是rsa
-C comment提供一个新注释,相当于加盐。
-f 指定生成文件名
以上参数都可以省略,ssh-keygen一直回车也行
# 将私钥copy给免密登录主机
ssh-copy-id -i 10.0.0.11
过程:
执行完ssh-keygen命令后,会在~/.ssh/目录下生成两个文件,id_rsa(私钥)和id_rsa.pub(公钥)。
执行完ssh-copy-id命令后,当输入yes的时候会在本地服务器上生成一个known_hosts文件,这个文件会把远程计算机的相关信息记录在这个文件里,确保你下次登录的时候是相同的服务器,避免遭受劫持。输入远端服务器的密码之后会在远端服务器生成一个authorized_keys,下次登录就不需要再次输入密码。
批量认证脚本,hosts.txt为主机列表
#!/bin/bash
USER=root
PASS=root
ssh-keygen -f '/root/.ssh/id_rsa' -P '' &> /dev/null
rpm -q expect &> /dev/null || yum install -y -q expect
while read IP;do
expect <<EOF
set timeout 20
spawn ssh-copy-id $USER@$IP
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$PASS\n" }
}
expect eof
EOF
done < hosts.txt
以下是测试版本
ansible --version
ansible 2.9.18
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Nov 16 2020, 22:23:17) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
参数:
-m 指定执行使用的模块。默认是command。
-u 指定远程主机以username运行命令。
-s 相当于linux系统下的sudo命令。
-C 只检查不实际执行。
-e 引用外部参数。
-f 处理主机数,可以理解成并发数,默认是5。
-i 即inventory指定清单列表, 默认/etc/ansible/hosts。
--list-host 可以简写成--list列出执行主机。
语法格式:ansible HOST-PATTERN [-m MOD_NAME] [-a MOD_ARGS]
HOST-PATTERN为主机清单。默认读取/etc/ansible/hosts配置。下面都以all来测试。
# 查询所有主机的hostname
ansible all -a "hostname"
测试网络连通模块。如果连通返回pong
实例:
ansible all -m ping
执行命令模块。可以通过ansible-doc modul-ename查看,参数都差不多的后面不再赘述。
参数:
实例:
# 都可以查到redhat-release
ansible all -m command -a "cat /etc/redhat-release"
ansible all -m command -a "chdir=/etc cat redhat-release"
ansible all -m command -a "creates=/data cat /etc/redhat-release"
# skipped, since /data does not exist
ansible all -m command -a "removes=/data cat /etc/redhat-release"
万能模块。相比于command模块,支持管道、符号等。
实例:
ansible all -m shell -a "netstat -lntup | grep sshd"
脚本执行模块。可以帮助我们在远程主机上执行ansible主机上的脚本,也就是说,脚本一直存在于ansible主机本地,不需要手动拷贝到远程主机后再执行。
实例:
ansible all -m script -a "hello.sh"
复制文件(夹)模块。把ansible主机的文件或者文件夹copy到节点主机。类比sftp/ftp的put功能。
参数:
实例:
# 把文件夹/home/zhang复制到对端主机的/root目录下
ansible all -m copy -a "src=/home/zhang dest=/root"
# 如果不改变文件内容,备份不成功
ansible all -m copy -a "src=hello.sh dest=/home/zhang owner=zhang group=zhang mode=764 backup=yes"
# 如果hello.sh文件存在就不复制
ansible all -m copy -a "content=helloworld dest=/home/zhang/hello.sh force=no"
拉取文件模块。ansible主机拉取节点主机文件(不可以是文件夹)。类比sftp/ftp的get功能。
参数:
实例:
# test1文件夹会自动创建目录结构为dest_path/hostname/src_path/file
ansible all -m fetch -a "src=/root/.bashrc dest=/home/zhang/test1"
tree -a /home/zhang/test1/
/home/zhang/test1/
├── 10.0.0.11
│ └── root
│ └── .bashrc
└── 10.0.0.12
└── root
└── .bashrc
# flat=yes,支持重命名,且取消了/hostname/src_path/file目录结构,同时文件重名会覆盖
ansible all -m fetch -a "src=/root/.bashrc dest=/home/zhang/test2 flat=yes"
tree
.
└── test2
操作远程主机文件的模块。
参数:
实例:
# 创建一个文件
ansible all -m file -a "path=/home/zhang/test state=touch mode="600" owner=zhang group=zhang"
# 同名会修改
ansible all -m file -a "path=/home/zhang/test state=touch mode="u+rwx,g-wx,o-rwx" owner=zhang group=zhang"
# 创建一个目录,如果和文件同名不能创建
ansible all -m file -a "path=/home/zhang/test state=directory mode="770" owner=zhang group=zhang"
# 删除一个文件或者文件夹
ansible all -m file -a "path=/etc/redhat-release state=absent"
ansible all -m file -a "path=/home/zhang/test2 state=absent"
# 创建软连接
ansible all -m file -a "state=link src=/etc/centos-release dest=/etc/redhat-release"
打包模块。支持zip,tar,tar.gz
参数:
实例
# ansible主控机的src目录,解压到远端主机的dest主机
ansible all -m unarchive -a "src=/test/test.tar.gz dest=/test"
# 远端主机的src目录,解压到远端主机的dest目录
ansible all -m unarchive -a "src=/test/test.tar.gz dest=/test remote_src=yes"
打包模块。
参数:
实例:
# 将远端主机的path
ansible all -m archive -a "path=/test dest=/root/txt.tar.bz2 format=bz2 owner=zhang group=zhang"
修改主机名模块。
参数:
ansible 10.0.0.11 -m hostname -a "name=web01"
定时任务模块。
参数:
实例:
# mysql备份脚本
cat mysql_bak.sh
mysqldump -A -F --sing-transaction --master-data=2 -q -uroot | gzip /data/sql_bak/mysql_`date+%F%T`.sql.gz
# 创建定时任务
ansible 10.0.0.11 -m cron -a "hour=2 minute=30 weekday=1-5 name=mysql_backup job=/root/script/mysql_bak.sh"
# 禁用
ansible 10.0.0.11 -m cron -a "name=mysql_backup job=/root/script/mysql_bak.sh disabled=yes"
# 启用
ansible 10.0.0.11 -m cron -a "hour=2 minute=30 weekday=1-5 name=mysql_backup job=/root/script/mysql_bak.sh disabled=no"
# 删除
ansible 10.0.0.11 -m cron -a "name=mysql_backup state=absent"
安装模块。
参数:
实例:
ansible all -m yum -a "name=httpd state=present"
ansible all -m yum -a "name=httpd state=absent"
服务模块。
参数:
实例:
# 启动httpd并设为开机自启
ansible all -m service -a "name=httpd state=started enabled=true"
用户相关模块。请求的是useradd, userdel, usermod三个指令
参数:
# 添加用户
ansible all -m user -a 'name=zhang2 password=$1$wHl9tWMC$VisPeVNkyUyKZ0ei40Hay. group=zhang'
# 修改密码
ansible all -m user -a 'name=zhang2 update_password=always password=$1$wHl9tWMC$VisPeVNkyUyKZ0ei40Hay.'
# 删除用户
ansible all -m user -a "name=zhang2 remove=yes state=absent"
用户组相关模块。请求的是groupadd, groupdel, groupmod 三个指令
参数:
实例:
# 添加用户组
ansible all -m group -a 'name=zhang state=present'
# 删除用户组
ansible all -m group -a 'name=zhang state=absent'
文件编辑模块。和sed功能类似
参数:
path: 指定要修改的文件。 regexp:匹配要修改的内容;line:要增加或者修改的内容
state: 默认present增加,absent为删除
backup:yes为备份
insertafter:匹配到的行的最后一行的后面添加一行
insertbefore: 匹配到的行的最后一行的前面添加一行
实例:
# path为源文件,regexp为匹配规则,line为修改内容
ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=.*' line='SELINUX=disabled'"
# 删除注释前备份
ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^#' backup=yes state=absent"
和lineinfile类似。
实例:
# 把lineinfile的line换成replace
ansible all -m replace -a "path=/etc/selinux/config regexp='^SELINUX=.*' replace='SELINUX=disabled'"
查看主机信息模块。
实例:
# 查看所有信息
ansible 10.0.0.11 -m setup
# 过滤键为ansible_nodename的项,也就是查看主机名
ansible 10.0.0.11 -m setup -a "filter=ansible_nodename"
帮助命令。
实例:
# 查看完整帮助文档
ansible-doc setup
# 查看概述文档
ansible-doc -s setup
从https://galaxy.ansible.com/下载roles。角色是ansible实现的一套完整的实践方案,可以也理解一堆playbook的集合,可以共享。假如,有个需求需要安装redis,我们需要考虑到被控端主机的操作系统类型,比如,Ubuntu和CentOS的安装工具不一样,这个是需要提前考虑的。这个时候,我们可以从ansible-galaxy上来观摩一下别人的实践方案。
# 下载
ansible-galaxy install davidwittman.redis
# 列出下载的roles
ansible-galaxy list
# 删除
ansible-galaxy remove davidwittman.redis
该指令使用需要谈到Ansible的另一种工作模式:pull 模式(Ansible默认使用push模式)。这和通常使用的push模式工作机理刚好相反,其适用于以下场景:
Ansible-pull命令使用格式如下:
ansible-pull [options] [playbook.yml]
通过Ansible-pull结合git和crontab一并实现,其原理如下:通过crontab定期拉取指定的Git 版本到本地, 并以指定模式自动运行预先制订好的指令。
具体示例参考如下:
*/20 * * * * root /usr/local/bin/ansible-pull -o -C 2.1.0 -d /srv/www/king-gw/ -i /etc/ansible/hosts -U git://git.kingifa.com/king-gw-ansiblepull >> /var/log/ansible-pull.log 2>&1
Ansible-pull通常在大批量机器场景下会使用,灵活性稍有欠缺,但效率几乎可以无限提升,对运维人员的技术和前瞻性规划有较高要求。
参数:
加密解密工具
参数:
例子:
ansible-vault encrypt hello.yml
ansible-vault decrypt hello.yml
交互式终端工具。ansible-console进入交互模式,Ctrl+D或Ctrl+C即可退出当前终端。ansible-console命令在实际工作中用于Ad-Hoc和Ansible-playbooks之间的场景,常用于集中一批临时操作或命令,使用Ad-Hoc要键入很多次但整体操作的复杂度又不至于使用Playbooks时,这时ansible-console是最佳选择。
语法:
实例:
cd web
yum name=httpd state=present
service name=httpd state=started
service name=httpd state=stopped
参考:
ansible简介:https://blog.51cto.com/14156658/2461907
ansible模块:https://www.cnblogs.com/kevingrace/p/7553179.html
ansible-pull :http://www.linuxmysql.com/25/2017/370.htm