Ansible自动化运维工具的快速应用

Peren ·
更新时间:2024-05-17
· 953 次阅读

Ansible的快速应用

Linux: Centos 7 mini版本

三台主机: master(192.168.1.4) 、node1(192.168.1.5)、 node2(192.168.1.6)
作者: Disen@千锋教育
交流QQ: 610039018

一、Ansible的认知

它是一套企业级自动化运维工具。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 指定一个文件,当文件存在时, 则不执行后面的命令

主机清单匹配格式如下:

all 表示所有主机 分组名,即在/etc/ansible/hosts中[分组名] *通配符,如 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=777owner=oracle 权限和所属用户参数。

4.4.5 案例4-fetch模块

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之外,还有restartedenabledstopped

五、高级用法 5.1 ansible-galaxy

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 创建加密的文件


作者:Python-Disen



运维工具 运维 工具 ansible

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章