Ansible-01-基础

一、基本介绍

Ansible 是一个 IT 自动化工具。它能配置系统、部署软件、编排更复杂的 IT 任务,如连续部署或零停机时间滚动更新。

Ansible 用 Python 编写,尽管市面上已经有很多可供选择的配置管理解决方案(例如 Salt、Puppet、Chef等),但它们各有优劣,而Ansible的特点在于它的简洁。

让 Ansible 在主流的配置管理系统中与众不同的一点便是,它并不需要你在想要管理的每个机器上安装自己的客户端组件,就可以对所要管理的机器进行管理,管理服务器和被管理机器之间使用的是 SSH 协议进行通信的。

同时提供的另一个优点,如果需要的话,你可以在不止一个地方控制你的整个基础架构。

二、基本原理

在这里插入图片描述

1、在ANSIBLE 管理体系中,存在"管理节点" 和 “被管理节点” 两种角色。

2、被管理节点通常被称为"资产"

3、在管理节点上,Ansible将 AdHoc 或 PlayBook 转换为Python脚本。
并通过SSH将这些Python 脚本传递到被管理服务器上。
在被管理服务器上依次执行,并实时的将结果返回给管理节点。

三、安装

在这里插入图片描述

1 先决条件

管理节点
  • 确保存在OpenSSH
  • 确保Python 版本 >= 2.6
  • 确保安装ansible

被管理节点

  • 确保存在OpenSSH
  • 确保Python 版本 >= 2.4 //若为2.4 版本,确保安装了python-samplesjson 扩展
  • 不需要安装 ansible

2 安装

使用官方 epel 源

yum install -y epel-release
yum install -y ansible

使用阿里 epel-7 源

cat >/etc/yum.repos.d/epel-7.repo<<EOF
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=http://mirrors.aliyun.com/epel/7/$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=http://mirrors.aliyun.com/epel/7/$basearch/debug
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0

[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=http://mirrors.aliyun.com/epel/7/SRPMS
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0
EOF
yum  install -y ansible

四、配置被管理节点

1 Inventory 资产清单介绍

被管理节点的信息需要写到一个 ini 风格的配置文件中, 这样的文件成为资产清单(Inventory)。

这个文件默认的路径是 /etc/ansible/hosts

一行一个,可以是被管理主机的 IP 地址
192.168.122.10

也可以是被管理主机的主机名

aoliao

或者是被管理主机的 FQDN

aoliao.sharkyun.com

示例:

192.168.122.10
192.168.122.20

分组

当然也可以对所要管理的节点进行分组,当然,这也是生产环境中的最佳实战。

格式如下

[组名]
主机1
主机2

组名中只能是:

大小写字母、数字和下划线

最佳实战:

  • 字母全部用小写
  • 不用数字开头
  • 不同的单词之间用下划线隔开或者使用小驼峰命名法
    [web_servers]
    [webServers] 小驼峰

分组建议:

  • 以开发语言进行分组
    [java]
    [php]
    [go]

  • 以服务类型区分
    [nginx]
    [tomcat]
    [slb]
    [dbServer]

  • 加上主机所在的城市、机房等位置信息
    [bjYzDbServer]
    [ShangHaiTomcat]

  • 加上项目前缀
    [ZFB_SH_SLB]

2 资产清单配置

清空默认的清单文件内容

> /etc/ansible/hosts

根据自己的情况添加所要管理的机器信息

假设场景:
目前计划搭建一个高并发集群

  • SLB 使用 Nginx 实现
  • 后端 Real Server 也是要 Nginx 实现
[slb]
192.168.122.10

[webNginx]
192.168.122.20
192.168.122.30

子组

可以看出以上资产清单, 3 台主机都需要安装 Nginx, 但是他们又被分配了不同的角色,这样它们的配置文件肯定不一样。为了方便操作,这里可以使用子组。

[slb]
192.168.122.10

[webNginx]
192.168.122.20
192.168.122.30

[nginx]
[nginx:children]
slb
webNginx

3 更多写法

[someGroup]
1.1.1.1
2.2.2.2
3.3.3.[1:15]
test01.qfedu.com
test03.qfedu.com
test[05:09].qfedu.com

4 获取资产清单信息

获取某个组的主机列表

[root@master ~]# ansible nginx --list
  hosts (3):
    192.168.122.10
    192.168.122.20
    192.168.122.30
[root@master ~]# ansible webNginx --list
  hosts (2):
    192.168.122.20
    192.168.122.30

五、管理节点和被管理节点建立免密登录

均在管理节点上操作

1 确保执行 ansible 命令的用户有密钥对

ls ~/.ssh/id_rsa || ssh-keygen -f ~/.ssh/id_rsa -N ""
  • -f 指定创建的私钥路径。
  • -N 给创建的私钥再加一个密码, "" 表示不加密码。

2 向被管理节点传送公钥

修改配置文件 /etc/ansible/ansible.cfg

host_key_checking = False

执行如下命令

ansible all -m authorized_key -a "user=test state=present key={{ lookup('file', '/root/.ssh/id_rsa.pub') }}"  -e "ansible_ssh_user=test ansible_ssh_pass=123 "

  • user=test 指定的的被管理主机的用户,需要和下面的 ansible_ssh_user 的用户一致
  • ansible_ssh_user 被管理主机的用户
  • ansible_ssh_pass 被管理主机的用户密码

3 测试

执行如下命令:

ansible all -m ping

六、基本语法

ansible 资产匹配模式 -m 功能模块 -a "功能模块的参数"

一句话:ansible 让谁做什么,具体如何去做

  • 谁–》 资产匹配模式
  • 做什么 --》功能模块
  • 如何去做 --》功能模块的参数

1 资产匹配模式

资产匹配模式就是针对哪些被管理节点。可以是:

  • 具体的一个主机: 192.168.122.20

    注意:这里些的条目必须和资产清单中的一致,清单中是 IP,这里就写 IP,清单中是主机名,这里也必须是主机名。

  • 资产清单中的一个组名
    webNginx

2 功能模块

Ansible 把希望被管理节点具体做什么任务,都开发成具体的模块了。
比如,希望执行被管理节点执行一条 shell 命令,就可以使用 shell 这个模块。

类似的还有:

  • copy
  • file
  • user
  • group

目前 ansible 的功能模块已经达到三千多个了。
可以使用如下命令获取当前安装版本的具体模块数量。

ansible-doc -l |wc -l

列出当前系统中所有的模块

ansible-doc -l

获取某个模块的帮助文档

ansible-doc 模块名

ansible-doc copy

3 常用的几个模块

4. 1 command & shell 模块

两个模块都是在远程服务器上去执行命令。

但command模块是ad-hoc的默认模块,在执行ad-hoc时,若不指定模块的名字则默认使用此模块。

# ansible webNginx -a "echo 'hello'"
192.168.122.20 | CHANGED | rc=0 >>
hello
192.168.122.30 | CHANGED | rc=0 >>
hello
# ansible webNginx -m shell -a "echo 'hello'"
192.168.122.20 | CHANGED | rc=0 >>
hello
192.168.122.30 | CHANGED | rc=0 >>
hello

两个模块的差异

  • shell 模块可以执行SHELL 的内置命令和 特性(比如管道符)。
  • command 模块无法执行SHELL 的内置命令和特性

Example
执行:

ansible webNginx -m shell -a "echo 'hello'|grep -o 'e'"

输出:

192.168.122.20 | CHANGED | rc=0 >>
e
192.168.122.30 | CHANGED | rc=0 >>
e

执行:

ansible all -i hosts  -a "echo 'hello'|grep -o 'e'"

输出:


192.168.122.20 | CHANGED | rc=0 >>
hello|grep -o e
192.168.122.30 | CHANGED | rc=0 >>
hello|grep -o e
4.2 script 模块

将管理节点上的脚本传递到被管理节点(远程服务器)上进行执行。

Example

管理节点上的一个脚本

脚本 /root/a.sh 内容如下:

touch /tmp/testfile

执行

ansible webNginx  -m script -a "/root/a.sh"

验证

ansible webNginx -m shell -a "ls -l /tmp/testfile"
4.3 copy 模块

copy 模块的主要用于管理节点和被管理节点之间的文件拷贝。

常用参数:

  • src 要复制到远程服务器的文件的本地路径。
    这可以是绝对的,也可以是相对的。
    如果路径是一个目录,则递归地复制它。
    在这种情况下,如果路径以“/”结尾,则只有该目录的内部内容被复制到目标。
    否则,如果不以“/”结尾,则复制包含所有内容的目录本身。
    此行为类似于rsync命令行工具。
  • dest 文件应复制到的远程绝对路径。
    如果src是一个目录,那么它也必须是一个目录。
    如果dest是不存在的路径,则创建dest。
    如果dest是相对路径,则起始目录由远程主机确定。
    如果src和dest是文件,则不创建dest的父目录,如果父级目录不存在,则任务失败。
  • backup 拷贝文件前,若原目标文件发生了变化,则对目标文件进行备份
  • woner 指定新拷贝文件的所有者
  • group 指定新拷贝文件的所有组
  • mode 指定新拷贝文件的权限

Example

  • copy 管理节点上的 nginx.repo 到被管理节点上
# cat nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

执行:

ansible nginx copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo"
  • copy 前, 在被管理节点上对原文件进行备份
ansible nginx  -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo backup=yes"
  • copy 文件的同时对文件进行用户及用户组设置

all 是资产清单中的默认组

ansible all -m copy -a "src=./nginx.repo  dest=/etc/yum.repos.d/nginx.repo owner=nobody group=nobody"
  • copy 文件的同时对文件进行权限设置
ansible all  -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo mode=0755"
4.5 yum 模块

等同于 Linux 上的YUM 命令, 对远程服务器上RPM包进行管理。

常用参数:

  • name 要安装的软件包名, 多个软件包以英文逗号(,) 隔开
  • state 对当前指定的软件安装、移除操作(present installed latest absent removed)
    支持的参数
    - present 确认已经安装,但不升级
    - installed 确认已经安装
    - latest 确保安装,且升级为最新
    - absent 和 removed 确认已移除

Example

  • 安装一个软件包

    ansible webNginx -m yum -a "name=nginx state=present"
    ansible webNginx  -m yum -a "name=nginx state=latest"
    ansible webNginx -m yum -a "name=nginx state=installed"
    
  • 移除一个软件包

    ansible webNginx -m yum -a "name=nginx state=absent"
    ansible webNginx -m yum -a "name=nginx state=removed"
    
  • 安装一个软件包组

    ansible webNginx -m yum -a "name='@Development tools' state=present"
    
4.5 systemd 模块

Centos6 之前的版本使用 service 模块。

请使用 ansible-doc service 命令自行查看帮助信息。

管理远程节点上的 systemd 服务,就是由 systemd 所管理的服务。

常用参数:

  • daemon_reload 重新载入 systemd,扫描新的或有变动的单元
  • enabled 是否开机自启动 yes|no
  • name 必选项,服务名称 ,比如 httpd vsftpd
  • state 对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)

Example

  • 重新加载 systemd
# ansible webNginx -m systemd -a "daemon_reload=yes"
  • 启动 Nginx 服务
# ansible webNginx -m systemd -a "name=nginx state=started"
  • 关闭 Nginx 服务
# ansible webNginx -m systemd -a "name=nginx state=stopped"
  • 重启 Nginx 服务
# ansible webNginx -m systemd -a "name=nginx state=restarted"
  • 重新加载 Nginx 服务
# ansible webNginx -m systemd -a "name=nginx state=reloaded"
  • 将 Nginx 服务设置开机自启动
# ansible webNginx -m systemd -a "name=nginx enabled=yes"
4.6 group 模块

在被管理节点上,对组进行管理。

常用参数:

  • name 组名称, 必须的
  • system 是否为系统组, yes/no , 默认是 no
  • state 删除或这创建,present/absent ,默认是present

Example

  • 创建普通组 db_admin
# ansible webNginx -m group -a "name=db_admin"
4.7 user 模块

用于在被管理节点上对用户进行管理。

常用参数:

  • name 必须的参数, 指定用户名

  • password 设置用户的密码,这里接受的是一个加密的值,因为会直接存到 shadow, 默认不设置密码

  • update_password 假如设置的密码不同于原密码,则会更新密码. 在 1.3 中被加入

  • home 指定用户的家目录

  • shell 设置用户的 shell

  • comment 用户的描述信息

  • create_home 在创建用户时,是否创建其家目录。默认创建,假如不创建,设置为 no。2.5版本之前使用 createhome

  • group 设置用户的主组

  • groups 将用户加入到多个其他组中,多个用逗号隔开。

                   默认会把用户从其他已经加入的组中删除。
    
  • append yes|no 和 groups 配合使用,yes 时,

                  不会把用户从其他已经加入的组中删除
    
  • system 设置为 yes 时,将会创建一个系统账号

  • expires 设置用户的过期时间,值为时间戳,会转为为天数后,放在 shadow 的第 8 个字段里

  • generate_ssh_key 设置为 yes 将会为用户生成密钥,这不会覆盖原来的密钥

  • ssh_key_type 指定用户的密钥类型, 默认 rsa, 具体的类型取决于被管理节点

  • state 删除或添加用户, present 为添加,absent 为删除;

                     默认值 present
    
  • remove 当与 state=absent 一起使用,删除一个用户及关联的目录,

                     比如家目录,邮箱目录。可选的值为: yes/no
    

Example

  • 创建用户并设置密码

    先生成加密密码

    pass=$(echo "123456" | openssl passwd -1 -stdin)
    

    执行 ansible 命令 创建用户 foo 并设置密码

    ansible nginx -m user -a "name=foo password=${pass}"
    
  • 创建用户 yangge, 并且为其创建密钥对,并且密钥类型为: ecdsa

    ansible all  -m user -a "name=yangge generate_ssh_key=yes ssh_key_type=ecdsa"
    
  • 创建用 tom, 并且设置其有效期到 2020年4月15日, 加入到组 db_admin 中, 不改变用户原有假如的组。

    ansible webNginx -m user -a "name=tom expires=$(date +%s -d 20200415) gorups=db_admin append=yes"
    
file 模块

file 模块主要用于远程主机上的文件操作。

常用参数:

  • owner 定义文件/目录的属主

  • group 定义文件/目录的属组

  • mode 定义文件/目录的权限

  • path 必选项,定义文件/目录的路径

  • recurse 递归的设置文件的属性,只对目录有效

  • src 链接(软/硬)文件的源文件路径,只应用于state=link的情况

  • dest 链接文件的路径,只应用于state=link的情况

  • state

    • directory 如果目录不存在,创建目录

    • file 文件不存在,则不会被创建,存在则返回文件的信息,
      常用于检查文件是否存在。

    • link 创建软链接

    • hard 创建硬链接

    • touch 如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

    • absent 删除目录、文件或者取消链接文件

Example

// 创建一个文件
ansible all -m file -a "path=/tmp/foo.conf state=touch"
// 改变文件所有者及权限
ansible all  -m file -a "path=/tmp/foo.conf owner=nobody group=nobody mode=0644"
// 创建一个软连接
ansible all  -m file -a "src=/tmp/foo.conf dest=/tmp/link.conf state=link"
// 创建一个目录
ansible all  -m file -a "path=/tmp/testdir state=directory"
// 取消一个连接
ansible all  -m file -a "path=/tmp/link.conf state=absent"
// 删除一个文件
ansible all -m file -a "path=/tmp/foo.conf state=absent"
4.9 cron 模块

管理远程节点的CRON 服务。等同于Linux 中的 计划任务。

注意:使用 Ansible 创建的计划任务,是不能使用本地 crontab -e去编辑,否则 Ansible 无法再次操作此计划任务了。

常用参数:

  • name 指定一个cron job 的名字。一定要指定,便于日之后删除。
  • minute 指定分钟,可以设置成(0-59, *, */2 等)格式。 默认是 * , 也就是每分钟。
  • hour 指定小时,可以设置成(0-23, *, */2 等)格式。 默认是 * , 也就是每小时。
  • day 指定天, 可以设置成(1-31, *, */2 等)格式。 默认是 * , 也就是每天。
  • month 指定月份, 可以设置成(1-12, *, */2 等)格式。 默认是 * , 也就是每周。
  • weekday 指定星期, 可以设置成(0-6 for Sunday-Saturday, * 等)格式。默认是 *,也就是每星期。
  • job 指定要执行的内容,通常可以写个脚本,或者一段内容。
  • state 指定这个job的状态,可以是新增(present)或者是删除(absent)。 默认为新增(present)

Example

// 新建一个 CRON JOB 任务
ansible all -m cron -a "name='create new job' minute='0' job='ls -alh > /dev/null'"

// 删除一个 CRON JOB 任务,删除时,一定要正确指定job 的name参数,以免误删除。
ansible all -m cron -a "name='create new job' state=absent" 

登录任何一台管理机验证cron

crontab -l

输出如下信息:

#Ansible: create new job
0 * * * * ls -alh > /dev/null
4.10 debug模块

debug 模块主要用于调试时使用,通常的作用是将一个变量的值给打印出来。

常用参数:

  • var 直接打印一个指定的变量值
  • msg 打印一段可以格式化的字符串

Example

  • 这里引入了变量,我们只需了解 debug 模板的使用即可。在学习变量、剧本时,我们会对它有更深刻的理解。
# ansible all -i hosts -m debug -a "var=role" -e "role=web"
# ansible all -i hosts -m debug -a "msg='role is {{role}} '" -e "role=web"
4.11 template 模块

template 模块使用了Jinjia2格式作为文件模版,可以进行文档内变量的替换。文件以 .j2 结尾。

常用参数:

  • src 指定 Ansible 控制端的 文件路径
  • dest 指定 Ansible 被控端的 文件路径
  • owner 指定文件的属主
  • group 指定文件的属组
  • mode 指定文件的权限
  • backup 创建一个包含时间戳信息的备份文件,这样如果您以某种方式错误地破坏了原始文件, 就可以将其恢复原状。yes/no

Example

用法其实和 copy 模块基本一样, template 模块的强大之处就是使用变量替换,就是可以把传递给 Ansible 的变量的值替换到模板文件中。

1. 建立一个 template 文件, 名为 hello_world.j2
# cat hello_world.j2
Hello {{var}} !

2. 执行命令,并且设置变量 var 的值为 world
# ansible all -m template -a "src=hello_world.j2 dest=/tmp/hello_world.world" -e "var=world"

3. 在被控主机上验证
# cat /tmp/hello_world.world
Hello world !
4.12 lineinfile 模块

在被管理节点上,用正则匹配的方式对目标文件的一行内容修改删除等操作。

如果是在一个文件中把所有匹配到的多行都进行统一处理,请参考replace 模块。

如果想对一个文件进行一次性添加/更新/删除多行内容等操作,参考blockinfile模块

常用参数

  • path 被管理节点的目标文件路径, 必须。

  • state 可选值absent 删除 |present 替换(默认值)。

  • regexp 在文件的每一行中查找的正则表达式。

    对于 state=present ,仅找到的最后一行将被替换。

  • line 要在文件中插入/替换的行。需要state=present

  • create 文件不存在时,是否要创建文件并添加内容。yes/no

Example

  • 删除被控节点文件里的某一条内容
# ansible all -m lineinfile -a "path=/etc/sudoers regexp='^%wheel' state=absent"
  • 替换某一行
# ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled' state=present"
4.13 blockinfile 模块

对目标文件进行多行的添加/更新/删除操作。

常用参数

  • path 目标文件路径
  • block 文件中被操作的块内容
  • state 块内容如何处理,absent 删除, present 添加/更新(默认值)

Example

  • 向文件/etc/ssh/sshd_config的最后添加几行内容

    添加的内容是

    Match User ansible-agent
    PasswordAuthentication no
    
    ansible all -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication no'"
    

    注意:\n 是换行符的意思。

  • 更新之前的内容

    ansible all -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication yes'"
    
  • 删除文件中的连续出现几行内容

    ansible all -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication yes' state=absent"
    

模块索引 https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

  • 14
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shark_西瓜甜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值