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

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 [email protected]
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 [email protected]:~/

即将本地的公钥文件上传到了192.168.1.4机器上的root用户的home目录下。

2.4 向授权文件中添加公钥

在服务器(B机)上将客户端(A机)添加到服务器的授权文件中,具体命令如下:

[root@localhost ~]# cat id_rsa.pub >> ~/.ssh/authorized_keys

添加成功后,可以在客户端(A机)连接服务器,则不需要密码的,效果如下:

Disen:~ apple$ ssh [email protected]
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 <host-pattern> [--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 指定一个文件,当文件存在时, 则不执行后面的命令
  • <host-pattern>主机清单匹配格式如下:

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

发布了8 篇原创文章 · 获赞 29 · 访问量 7449

猜你喜欢

转载自blog.csdn.net/ahhqdyh/article/details/104923416