Linux: Centos 7 mini版本
三台主机: master(192.168.1.4) 、node1(192.168.1.5)、 node2(192.168.1.6)
作者: Disen@千锋教育
交流QQ: 610039018
它是一套企业级自动化运维工具。ansile实现主控机控制被控机的管理,被控机一般使用ssh无你或代理服务。因为ansible主要用于中小型应用环境,如果大型企业维护上1000台服务时,建议使用Saltstack+agent,执行的效果会更高。
1.1 特性 模块化: 调用特定的模块,完成特定的任务 有Paramiko、PyYAML、Jinja2(模块语言)三个关键技术 支持自定义模块 基于Python语言实现 部署简单、基于Python和SSH,agentless 安全, 基于OpenSSH 支持playbook编排任务 幂等性: 一个任务执行1次和多次的效果相同 无需代理,不依赖PKI(无需SSL证书) 支持任意的编程语言写模块 YAML格式,编排任务,支持丰富的数据结构 较强大的多层解决方案 1.2 工作原理Ansible的五大组成部分:
playbook: 任务剧本,编排任务集的配置文件,由ansible依次执行,一般是json格式的yml文件 inventory: 管理主机的清单 ,配置文件在 /etc/ansible/hosts modules: 执行命令的功能模块, 一般都是内置核心模块,当然也可以自定义 plugings: 模块功能的补充, 如连接类型、循环、变量、过滤等插件,一般不常用 api: 提供给第三方应用的编程接口注意事项:
执行ansible的主机称之为主控端(中控、master、堡垒机) 被控端如果开启SELinux需要安装libselinux-python Window不能做为主控端 二、配置ssh的免密key 2.1 安装ssh服务yum方式安装
yum -y install openssl openssh-server
rpm -qa|grep openssh-server
修改配置文件 /etc/ssh/sshd_config,确保以下几项打开:
PermitRootLogin yes
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
启动服务
systemctl start sshd.service
开机启动
systemctl enable sshd.service
2.2 生成rsa密钥
在客户端通过ssh-keygen 命令生成密钥,执行如下命令,询问操作时默认回车即可:
[root@localhost ~]# 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:
SHA256:wOuQSFvu+Kb4hS4SQl+sGnemDqswWHvczxICwkubYdU root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
| . |
| . E |
|. o o o |
|.B.= + o |
|+.X.* . S |
|+* X.*. |
|=oB O.o. |
|+=o=. .o |
|=+=+. .o |
+----[SHA256]-----+
[root@localhost ~]#
成功之后,会在~/.ssh目录下产生以下两个文件:
id_rsa id_rsa.pub
id_rsa是私钥, id_rsa.pub是公钥。
2.3 上传公钥在客户端(A机)上传本地的公钥到服务端(B机)上,使用如下命令:
scp ~/.ssh/id_rsa.pub root@192.168.1.4:~/
即将本地的公钥文件上传到了192.168.1.4机器上的root用户的home目录下。
2.4 向授权文件中添加公钥在服务器(B机)上将客户端(A机)添加到服务器的授权文件中,具体命令如下:
[root@localhost ~]# cat id_rsa.pub >> ~/.ssh/authorized_keys
添加成功后,可以在客户端(A机)连接服务器,则不需要密码的,效果如下:
Disen:~ apple$ ssh root@192.168.1.4
Last login: Fri Mar 13 16:46:39 2020 from disen
[root@localhost ~]#
三、安装Ansible
3.1 rpm安装
yum -y install ansible
默认安装的版本是基于Python2.7的版本,如果安装新版本,则可以通过pip3的方式安装。
3.2 编译安装可以从https://releases.ansible.com/ansible/官网下载指定版本的安装包
yum -y install python-jinja2 pyyaml python-paramiko python-babel python-crypto
wget https://releases.ansible.com/ansible/ansible-2.6.9.tar.gz
tar xvf ansible-2.6.9.tar.gz
cd ansible-2.6.9
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible
3.3 git方式安装
git clone https://github.com/ansible/ansible.git --recursive
cd ./ansible
source hacking/env-setup
3.4 pip安装
yum install python-pip python-devel -y
yum install gcc glibc-devel zibl-devel rmp-build openssl-devel
pip install --upgrade pip
pip install ansible --upgrade
【注意】Centos7默认的python版本是2.7, 如果需要安装Python3.x,可以执行如下shell脚本即可:
#!/bin/bash
yum groupinstall -y "Development tools"
yum install -y flex.x86_64 zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
# wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
# wget从官网下载特别慢,网盘链接:https://pan.baidu.com/s/1f30S25Xny6gOzqD3uu8yUw 密码:jupe
tar xvf Python-3.7.0.tgz
cd Python-3.7.0
./configure --prefix=/usr/local
make & make install
ln -s /usr/local/bin/python3 /usr/bin/python3
ln -s /usr/local/bin/pip3 /usr/bin/pip3
cd ~
pip3 -V
python3 -V
以上脚本可以写入到一个sh文件中,如centos7_python3.7.sh ,执行如下命令即可执行:
chmod +x centos7_python3.7.sh
./centos7_python3.7.sh
安装完成Python3环境之后,可以直接通过pip3安装ansible了,命令如下:
pip3 install ansible -i https://mirrors.aliyun.com/pypi/simple
因为通过pip3安装,并没有配置文件,所以需要手动创建,命令如下:
mkdir /etc/ansible
touch /etc/ansible/ansible.cfg
touch /etc/ansible/hosts
mkdir /etc/ansible/roles
ansible.cfg是主配置文件,用于配置ansible的工作特征;hosts主机清单,roles存放角色的目录
3.5 确认安装[root@master ~]# ansible --version
ansible 2.9.6
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.7/site-packages/ansible
executable location = /usr/local/bin/ansible
python version = 3.7.0 (default, Mar 14 2020, 00:55:40) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
executable location = /usr/local/bin/ansible
表示执行命令在/usr/local/bin
目录下,查看ansible相关的命令:
[root@master ~]# find /usr/local/bin -name "ansible*"
/usr/local/bin/ansible
/usr/local/bin/ansible-connection
/usr/local/bin/ansible-test
/usr/local/bin/ansible-config
/usr/local/bin/ansible-console
/usr/local/bin/ansible-doc
/usr/local/bin/ansible-galaxy
/usr/local/bin/ansible-inventory
/usr/local/bin/ansible-playbook
/usr/local/bin/ansible-pull
/usr/local/bin/ansible-vault
主要命令说明如下:
ansible是主程序, ansible-doc查看配置文档,用于查看模块功能 ansible-galaxy 下载或上传优秀代码 ansible-playbook 定制自动化任务,编排工具 ansible-pull 远程执行命令的工具 ansible-vault 文件加密工具 ansible-console 基于Console控制台界面与用户交互执行的工具 四、基本应用 4.1 初次使用请确保主控端的id_rsa.pub公钥都已注册到了被控机的authorized_keys中,即已免密。
配置被控机的ip, 编辑/etc/ansible/hosts文件,内容如下:
[group1]
192.168.1.5
192.168.1.6
初次使用命令尝试ping被控机,命令如下:
[root@localhost ~]# ansible group1 -m ping
192.168.1.6 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.5 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
4.2 配置文件
配置文件在/etc/ansible/ansible.cfg,核心内容如下:
[defaults]
#inventory = /etc/ansible/hosts # 主机清单
#library = /usr/share/modules_utils # 模块位置
#remote_tmp = $HOME/.ansible/tmp # 被控机的临时生成脚本的位置
#local_tmp = $HOME/.ansible/tmp # 主控机的临时生成脚本的位置
#forks = 5 # 子进程的数量
#sudo_user = root # sudo命令的用户
#ask_sudo_pass = True # 询问sudo操作的ssh密码
#ask_pass = True # 每次执行命令时是否询问ssh密码
#remote_port = 22 # 被控机的远程端口
#host_key_checking = False # 是否检查公钥是否存在主控机的know_hosts文件中
#log_path = /var/log/ansible.log # 日志文件
4.3 ansible-doc命令
此命令是显示模块的帮助文档, 命令格式:
ansible-doc [options] [module...]
options选项有:
-a
显示所有文档
-l
以列表方式显示
-s
或--snippet
显示模块playbook片段
如查看shell模块的playbook片段,命令如下:
[root@localhost ~]# ansible-doc -s shell
- name: Execute shell commands on targets
shell:
chdir: # Change into this directory before running the command.
cmd: # The command to run followed by optional arguments.
creates: # A filename, when it already exists, this step will *not* be run.
executable: # Change the shell used to execute the command. This expects an absolute path to
the executable.
free_form: # The shell module takes a free form command to run, as a string. There is no
actual parameter named 'free form'. See the
examples on how to use this module.
removes: # A filename, when it does not exist, this step will *not* be run.
stdin: # Set the stdin of the command directly to the specified value.
stdin_add_newline: # Whether to append a newline to stdin data.
warn: # Whether to enable task warnings.
4.4 常用模块
4.4.1 主命令格式
主命令即是ansible命令,命令格式如下:
ansible [--version] [-v, -vv, -vvv] [-m module] [-a args]
[-k,--ask_pass] [-K ,ask_become-pass] [-T,--timeout] [-C, --check]
[-u, --user=REMOTE_USER] [-b, --become]
-h
查看命令的帮助信息
-k
与被控机交互时, 一般输入password的应答
-m
指定功能模块,如ping、shell、script、copy、fetch、file、cron、yum、service、user等模块
-a
如果指定是模块是shell ,则指定执行的命令参数
执行命令时,可以增加相关的条件:
chdir 指定一个目录,执行命令前先切换目录 removes 指定一个文件,当文件不存在时,则不执行后面的命令 creates 指定一个文件,当文件存在时, 则不执行后面的命令主机清单匹配格式如下:
*
通配符,如 192.168.1.*
:
并集、:&
交集、:!
非集(注:需要单引号)
支持正则表达式
4.4.2 案例1-shell模块
如查看所有被控机的的磁盘使用情况,命令如下:
[root@localhost ~]# ansible all -m shell -a 'df'
192.168.1.5 | CHANGED | rc=0 >>
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 486060 0 486060 0% /dev
tmpfs 497864 0 497864 0% /dev/shm
tmpfs 497864 7808 490056 2% /run
tmpfs 497864 0 497864 0% /sys/fs/cgroup
/dev/mapper/centos-root 36805060 2386156 34418904 7% /
/dev/sda1 1038336 179216 859120 18% /boot
tmpfs 99576 0 99576 0% /run/user/0
192.168.1.6 | CHANGED | rc=0 >>
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 486060 0 486060 0% /dev
tmpfs 497864 0 497864 0% /dev/shm
tmpfs 497864 7808 490056 2% /run
tmpfs 497864 0 497864 0% /sys/fs/cgroup
/dev/mapper/centos-root 36805060 2386132 34418928 7% /
/dev/sda1 1038336 179216 859120 18% /boot
tmpfs 99576 0 99576 0% /run/user/0
4.4.3 案例2-script模块
如为192.168.1段的所有受控机添加用户和口令,命令如下:
[root@localhost ~]# ansible 192.168.1.* -a 'useradd oracle'
[root@localhost ~]# ansible 192.168.1.* -m shell -a 'echo orclPwd|passwd --stdin oracle'
【注意】-a
可以正常执行一些通用的命令,如果遇到 |
管道或>
重定向 或$
变量等命令操作时,需要使用shell模块。当然也可以使用script模块,将管道、重定向或变量的命令写到脚本中,如下所示:
ansible all -m script -a '~/host.sh'
~/host.sh
是主控机本地的shell脚本,内容如下:
echo '显示主机名'
hostname
echo '千锋Python' > a.txt
cat a.txt
4.4.4 案例3-copy模块
如将本地的某个文件复制到被控机上,需要指定本地文件位置(src)和目标位置(dest)及是否自动备份(backup),详细命令如下:
ansible all -m copy -a 'src=/root/cfgs/my.cnf dest=/etc/mysql/conf.d/mysql.cnf backend=yes'
以下的命令的功能将MySQL数据库配置文件,复制到全部被控机上。
在复制时可以指定文件的mode=777
和owner=oracle
权限和所属用户参数。
fetch模块可以将所有受控机的某些文件下载到主控机,如收集项目的日志文件,命令如下:
ansible all -m fetch -a 'src=/usr/src/fms/fms.log dest=/data/logs'
【注意】fetch与copy的src和dest正好相反,即fetch的src是受控机的,dest是本地的目录。另外下载到本地的文件结构是 {dest}/{ip}/root/fms.log
。
【扩展】如果将
4.4.6 案例5-file模块file模块可以设置文件的属性、创建连接和删除文件,如设置文件的用户和权限的如下:
ansible all -m file -a 'path=/usr/src/fms/run.sh mode=755'
即指定path和mode即可,当然也可以指定state=absent
实现级联的文件及目录的属性修改。
另外,可以创建某一文件的软连接,命令如下:
ansible all -m file -a 'src=/usr/src/fms/run.sh dest=/usr/bin/run-server state=link'
【注意】创建文件连接必须指定state为link。
如果删除某个文件,则需要指定dest和state为absent,命令如下:
ansible all -m file -a 'dest=/usr/bin/run-server state=absent'
absent对于dest的文件或目录来说是删除,可以尝试以下命令的应用:
ansible all -m shell -a 'echo "ls -la"> ls.sh'
ansbile all -m file -a 'path=/root/ls.sh mode=775'
ansible all -m file -a 'src=/root/ls.sh dest=/usr/local/bin/lss state=link'
ansible all -a 'bash lss'
ansible all -m file -a 'dest=/usr/local/bin/lss state=absent'
4.4.7案例6-cron模块
cron模块可以实现定时任务的发布、启用或禁用以及删除功能,定时任务的应用场景非常多,如定时爬虫、定时同步MySQL和ElasticSearch等等。如下定时启动一个爬虫的命令如下:
ansible all -m cron -a 'minute=*/2 hour=20,21 month=3,4,5 job="run-spider 100" name=spider'
以上的命令中时间的表示有: minute分钟(0-59, *, */2)、hour小时(0-23, *)、 day日(1-31)、month月、weekday周(0-6 for sunday-saturday),job指定定时运行的指令,如果指令带有参数,需要使用双引号。name指定定时任务的名称,在取消定时任务中使用。
如果禁用上面发布的定时任务,则命令如下:
ansible all -m cron -a 'disabled=yes job="run-spider 100" name=spider'
禁用定时任务时设置disabled=yes,同时指定job和name,如果不带name只是增加一个Job的注释,并没有禁用之后的任务。简单地理解为添加任务时job和name是什么,即取消的job和name就是什么,两者保持一致即可。
另外,对禁用的定时任务,可以使用disabled=no,取消禁用。如果删除定时任务,设置disabled=no的同时,指定state=absent即可,命令如下:
ansible all -m cron -a 'disabled=no job="run-spider 100" name=spider state=absent'
4.4.8案例7-yum模块
yum模块只用于 centos中,而apt模块主要用于Debian或Ubuntu中。在使用时,根据不同的系统使用不同的模块。用法都差不多,详情可以通过ansible-doc进行查看。
此处主要讲解yum模块的使用,如所有受控机安装tree的命令如下:
ansible all -m yum -a 'name=tree state=present'
state指定present或latest表示安装【默认】,指定absent表示删除。
yum模块也可以安装rpm的包,只需要指定受控机下的rpm安装包的绝对路径即可。
当然,在安装时可以指定update_cache=yes
更新缓存,如:
ansible all -m yum -a 'name=tree state=present update_cache=yes'
4.4.9 案例7-service模块
service模块同service或systemctl命令,可以设置开机启动、启动、停止和重新启动等操作。如启动nginx服务的命令如下:
ansible all -m service -a 'name=nginx state=started'
state除了started
之外,还有restarted
、enabled
、stopped
等
ansible-galaxy 下载和管理roles及collections资源, 默认从https://galaxy.ansible.com下载。
它的用法主要包含以下命令:
ansible-galaxy list 查看已安装的galaxy ansible-galaxy install xxxx 安装galaxy, 默认安装在~/.ansible/roles目录下 ansible-galaxy remove xxxx 删除galaxy如下载 nginxinc.nginx 角色的命令如下:
ansible-galaxy remove nginxinc.nginx
5.2 ansible-playbook
ansible-playbook 可以执行一个yaml文件(剧本),必须熟悉yaml语法。关于yaml语法可以到http://www.yaml.org官网学习,简单易懂,在此不详细说明。
5.2.1 playbook剧本playbook是一个yaml格式的文件,包含hosts、remote_user、tasks、name、command等相关的信息。
如下是一个简单的playbook文件,文件名为ls.yml, 内容如下:
# 显示列表
- hosts: all
remote_user: root
tasks:
- name: ls
command: ls -la
yml以key:value
组成的dict或list内容,以上内容hosts、remote_user和tasks组成一个字典,tasks是一个列表类型,它内部是由 name和command两个key组成的dict。command是ansible的模块,类似shell。
如下是一个较为复杂的playbook,用来完成docker的安装,文件名为docker.yml, 文件内容如下:
# centos7中安装docker
- hosts: all
remote_user: root
tasks:
- name: intall yum-utils
yum: name=yum-utils state=present
- name: install device-mapper-persistent-data
yum: name=device-mapper-persistent-data
- name: install lvm2
yum: name=lvm2
- name: add docker-repo
command: yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- name: save cache
command: yum makecache
- name: install docker-ce
yum: name=docker-ce
- name: enable docker service
command: systemctl enable docker.service
- name: start docker service
command: systemctl start docker.service
【注意】yaml缩进同python,前面的空格必须对应,同时不要使用tab制表符。
5.2.2 执行playbook如执行ls.yml剧本的命令如下:
ansible-playbook ls.yml
如执行docker.yml剧本的命令如下:
ansible-playbook docker.yml
5.2.3 yml文件加密
对yml文件的加密解密使用ansible-vault命令,其命令的详细内容如下:
ansible-vault encrypt ls.yml 加密
ansible-vault decrypt ls.yml 解密
ansible-vault view ls.yml 查看内容
ansible-vault rekey ls.ym 重新设置口令
ansible-vault edit ls.yml 编辑内容
ansible-vault create ls2.yml 创建加密的文件