初识ansible和ad-hoc

基本环境要求:

管理节点 被管理节点
openssh openssh
python >= 2.6 python >=2.4
ansible

安装ansible

用最简单的方式进行安装

环境 CentOS Linux release 7.3.1611
内核版本: 3.10.0-514.el7.x86_64
centos7 需要联网
yum install epel-release
yum install ansible
两条命令即可安装成功

设置本地解析:

ansible]# for i in node{1..3}; do scp /etc/hosts renren@$i:/etc/hosts; done
[root@localhost ~]# ansible --version
ansible 2.9.27
  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  6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]

创建普通账号

不喜欢混用各种环境,单独为各个受管主机创建一个ansible 账号,以此来操作

[root@localhost .ansible]# groupadd ansible
[root@localhost .ansible]# useradd -g ansible  ansible
[root@localhost .ansible]# echo ansible |passwd --stdin ansible
[root@localhost .ansible]# su - ansible
[ansible@localhost ~]$ ansible --version
ansible 2.9.27

ansible 普通用户设置sudo 免密提权设置

vim  /etc/sudoers
ansible		ALL		NOPASSWD:ALL

管理节点与被管理节点建立ssh信任关系

生成密钥:
[ansible@localhost ~]$ ssh-keygen  -t rsa         #在ansible  运维主机上
分发密钥:
[ansible@localhost ~]$ for i in node{1..2}; do ssh-copy-id ansible@$i; done            # 分发给各个受控主机上

ansible 属性类型得命令

ansible all --list-host        #打印所有主机
ansible all -i 192.168.6.20, -m ping       # -i  参数后面接的是一个列表(List),因此当为一个被管理节点时,后面一定要加一个英文逗号(,)告知时List
ansible-doc -l				   #获取全部模块的信息
ansible-doc -s MOD_NAME		#获取指定模块的使用帮助

选项参数解释

all 在ansible 中,将其叫做pattern (即匹配)或是资产选择器。就是用来匹配资产(-i 参数指定)中得一部分。这里得all 是匹配所有指定得所有资产
-i 指定ansible 得资产,也即是被管理服务器
-m 指定要运行得模块,比如这里得ping 模块和copy 模块
-a 指定模块得参数,这里模块ping 没有指定参数。模块copy 指定的主要参数是src 和 dest 参数

ansible 资产

ansible 分为静态资产和动态资产
1,静态资产 本身是一个文本文件
ansible 的资产文件位于/etc/ansible/hosts 下
自定义的静态资产
inventory.ini
主配置文件

ansible]# pwd
/three_disk/ansible
ansible]# cat ansible.cfg 
[defaults]
inventory = inventory
remote_user = root
roles_path = roles
[privilege_escalation]
become = True
become_method = sudo
become_user = root
become_ask_pass = False

配置清单(ansible 的静态资源)

ansible]# cat inventory 
[test01]
ceph-1
[test02]
ceph-2
[web]
ceph-3
[webtest:children]
web
[test03]
ceph-[1:5]

ansible all --list-hosts
ansible all -i inventory --list-host #列出配置清单的所有主机
ansible ‘test01:&test03’ --list-hosts # 列出组test01、组test03的交集
ansible ‘test03:!test01’ --list-hosts #列出 test03除了test01中含有的以外的其它元素

在这里插入图片描述
列出某个组
ansible web -i inventory --list-host
在这里插入图片描述

配置清单中,指定配管理组执行

 ansible web -m ping
 ansible test01,test02 -m ping

copy 模块:

touch  /tmp/a.conf   #管理节点上创建测试文件
ansible test01,test02  -m copy  -a "src=/tmp/a.conf des=/tmp/a.conf"      # 用copy 模块,拷贝到被管理节点上
ansible test01,test02 -m shell -a "cat /tmp/a.conf" # 用shell  模块查看被管理节点是否有上传的文件

ansible 功能是用哪个的模块干哪种事情!!!

主机连通性测试

[ansible@localhost ~]$ ansible test01 -m shell -a 'ip ad'
[ansible@localhost ~]$ ansible test01 -m shell -a 'ip ad |grep ens33'

ad-hoc 命令 -------------- shell 命令
playbook ------------------ shell-script
在ansible 实践中,单条ansible 命令在ansible 中统称为ansible Ad-Hoc
命令语法格式:

ansible  pattern [-i  inventory]  -m module  -a  argument  
  • pattern 资产选择器
  • -i 指定资产清单文件的位置
  • -m 指定本次ansible ad-hoc 要执行的模块。可以类别成shell 中的命令
  • -a 模块的参数。可以类比成shell 中的命令参数
    模块类型
    ansible 模块分为三种类型: 核心模块(core module)、附加模块(extra module)以及用户自定义模块(consume module)
    核心模块 是由ansible 的官方团队提供。
    附加模块 是由各个社区提供。例如openstack社区、docker 社区等
    当核心模块和附加模块无法满足你的需求时,用户可以自定义模块。
    默认情况下,在安装ansible 的时候,核心模块和附件模块都已安装无需用户干预。

ansible 帮助信息

  • 列举出所有的核心模块和附加模块
ansible-doc   -l
  • 查询某个模块的使用方法
ansible-doc    modulename
  • 查询某个模块的使用方法,比较简洁的信息
ansible-doc   -s  modulename

ansible 常用模块

command 模块和shell 模块

两个模块都是在远程主机上去执行命令的
command模块不支持管道符和变量等,如果要使用这些,需要shell模块
这个模块可以直接在远程主机上执行命令(这个也是于设立了模块得最大优势),并将结果返回本主机

[ansible@localhost ~]$ ansible all -m command -a 'ss -ntl'
[ansible@localhost ~]$ ansible all -m command -a 'chdir=/home/ ls'
node2 | CHANGED | rc=0 >>
ansible
zabbix
node1 | CHANGED | rc=0 >>
ansible
zabbix

常见得几个参数
chdir       # 在执行命令之前,先切换到该目录
creates   # 一个文件名,当这个文件存在,则该命令不执行,可以用来做判断
removes # 一个文件名,这个文件不存在,则该命令不执行

chdir 参数

此参数得功能是切换命令得当前工作目录

[ansible@localhost ~]$ ansible all -m command -a 'chdir=/home/ ls -l'

在这里插入图片描述

creates 参数

此参数得功能相当于是判断某个文件是否存在,存在即不在执行后续得命令

[ansible@localhost ~]$  ansible all -m command -a 'creates=/home/ansible; ls -l '
[ansible@localhost ~]$  ansible all -m command -a 'creates=/home/ansible ls -l '

在这里插入图片描述

removes 参数

此参数得意思是判断文件存在即执行后续得命令

[ansible@localhost ~]$  ansible all -m command -a 'removes=/home/ansible ls -l '

在这里插入图片描述

shell 模块

万能模块,可以执行终端shell 执行得命令

不带参数
[ansible@localhost ~]$ ansible all -m shell -a 'ip ad|grep ens33'
[ansible@localhost ~]$ ansible all -m shell -a 'cat /etc/passwd|grep -v 'nologin''

在这里插入图片描述

文件模块

copy 模块

主要是将管理主机上的数据信息传送给多台主机

src\dest 参数

[ansible@localhost ~]$ ansible all -m copy -a 'src=/home/ansible/a.html  dest=/home/ansible'

将本地得/home/ansible/a.html 拷贝 到远端受管主机/home/ansible上
在这里插入图片描述
在这里插入图片描述

backup参数

默认是覆盖
backup=yes 备份后覆盖

[ansible@localhost ~]$ ansible all -m copy -a 'src=/home/ansible/a.html dest=/home/ansible/ backup=yes'

在这里插入图片描述
可以看到备份文件得存在
在这里插入图片描述

owner\group\mode

设置拷贝到远程主机得文件属性

[ansible@localhost ~]$ ansible all -m copy -a 'src=/home/ansible/a.html dest=/home/ansible/ owner=ansible group=ansible mode=0600'

在这里插入图片描述

[ansible@localhost ~]$ ansible all -m shell -a 'ls -l /home/ansible'

在这里插入图片描述

content参数

覆盖远程主机得文件内容

[ansible@localhost ~]$ ansible all -m copy -a 'content=henan dest=/home/ansible/a.html'

在这里插入图片描述

fetch 模块

抓取远程主机得文件到管理机上,会把整个文件的目录关系拉取到管理机上
两个重要参数:
src # 要获取得远程主机上的文件,必须是文件而不能是目录
dest #管理机用于保存文件的目录

[ansible@localhost ~]$ ansible all -m fetch -a 'src=/home/ansible/a.html dest=/home/ansible'

在这里插入图片描述
在这里插入图片描述

file 模块

作用是实现创建、删除文件信息并对文件属性进行修改

参照1
参考2
参考3

script 模块

作用: 将管理节点上的脚本传递到被管理节点上进行执行
例如:

cat a.sh                   #一个简单的创建文件的脚本
touch /tmp/testfile      

ansible all -m script -a '/home/renren/a.sh'      #通过ad-hoc命令,在被管理节点上执行a.sh 脚本
ansible all -m shell -a 'ls -l /tmp/'             #通过ad-hoc命令查看被管理主机上是否有目标文件

copy 模块

copy 模块的主要作用是用于管理节点和被管理节点之间的文件拷贝
经常使用的参数如下:

  • src 指定拷贝文件的源地址
  • dest 指定拷贝文件的目标地址
  • backup 拷贝文件前,若原始文件发生变化,则对目标文件进行备份
  • woner 指定新拷贝文件的所有者
  • group 指定新拷贝文件的所有组
  • mode 指定新拷贝文件的权限

example:
+简单拷贝:

ansible all -m copy -a 'src=/home/renren/ansible.cfg   dest=/home/renren/'   #将管理主机上的文件复制到被管理主机上
ansible all -m shell -a 'ls -l /home/renren'    #检查目标组机上是否copy 到了文件
 默认copy到被管理节点上的文件属组是root,权限是 644

+拷贝前,对被管理节点上的原文件进行备份

ansible all -m copy -a "src=/home/renyong/ansible.cfg dest=/home/renyong/ansible.cfg backup=yes"  # 执行拷贝时,如果文件有变化,会对被管理节点上的主机进行备份
根据md5值,如果文件内容发生变化,被管理节点上的原文件就会得到备份
ansible all -m shell -a 'ls  -l /home/renyong'

copy 文件时对文件进行用户以及用户组设置

ansible  all -m copy -a 'src=/home/renren/ansible.cfg   dest=/home/renren/  owner=nobody   group=nobody'  # 拷贝的同时给文件赋予属组
ansible all -m shell -a 'ls -l /home/renren/'      #检查被管理节点目标文件的属组

copy 文件的同时对文件进行权限设置

ansible   all -m copy -a 'src=/home/renyong/ansible.cfg dest=/home/renyong mode=0644'  #对被管理节点的目标文件进行权限修改
ansible all -m shell -a 'ls -l /home/renyong'

yum_repository模块

添加yum 仓库
常见参数

  • name 仓库名称。 是仓库文件中第一行的中括号名称,为必须参数
  • description 仓库描述信息,为必须参数
  • baseurl yum 存储库 “repodata” 目录所在目录的url ,为必须参数
  • file 仓库文件保存到本地的文件名,不包含.repo 。 默认是name 的值
  • state preset 确认添加仓库文件,absent 确认删除仓库文件
  • gpgcheck 是否检查gpg yes|no ,没有默认值,使用/etc/yum.conf 中的配置
    example:
    添加yum源:
ansible all -m yum_repository -a "name=epel_test description='ansible_test_yum_repository' baseurl='http://mirrors.aliyun.com/epel/7/x86_64' gpgkey='http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7' gpgcheck=yes enabled=yes "     # 为被管理节点添加yum 源

ansible all -m command -a 'yum clean all'
ansible all -m shell -a 'yum makecache'

shell 模块执行yum clean all 有个错误不要理会
在这里插入图片描述

yum 模块

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

example
安装一个软件包

ansible all -m yum -a 'name=nginx state=present'
ansible all -m yum -a 'name=nginx state=latest'

移除一个软件包

ansible all -m yum -a 'name=nginx state=absent'
ansible all -m yum -a 'name=nginx state=removed'

安装一个软件组

 ansible all -m yum -a “name='@Development tools' state=present”

systemd模块

管理远程节点上的systemd 服务,就是由systemd 所管理的服务
常见参数:

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

贰: 启动nginx 服务

 ansible all -m systemd -a 'name=nginx state=started'

叁:重新启动服务

 ansible all -m systemd -a 'name=nginx state=restarted'

肆: 重新载入某个服务

ansible   all -m systemd -a 'name=nginx state=reloaded'

伍: 将nginx 服务设置开机自启动

ansible   all -m systemd -a 'name=nginx enabled=yes'
ansible all -m shell -a 'systemctl status nginx|grep enabled'

group模块

在被管理节点上,对组进行管理
常用参数:

  • name 组名称,必须的
  • system 是否为系统组,yes/no,默认为no
    example
    壹: 确定组是否存在,否则就创建
 ansible all -m group -a 'name=renyong1 state=present'

贰: 移除一个group

 ansible all -m group -a 'name=renyong1 state=absent'
 ansible all -m shell -a 'cat /etc/group|grep renyong'

user 模块

用于在被管理节点上对用户进行管理
常用参数:

  • name 必须参数,指定用户名
  • password 设置用户的密码,这里接受的是一个加密的值,应为会直接存到shadow 中,默认不设置密码
  • update_password 假如设置的密码不同于原密码,则会更新密码,在1.3 中被加入
  • home 指定用户的家目录
  • shell 设置用户的shell
  • comment 用户的描述性信息
  • create_home 在创建用户时,是否创建其家目录,默认创建,假如不创建,设置为no。 2.5之前使用createhome
  • group 设置用户的组
  • groups 将用户加入到其它组中,多个用逗号隔开。默认会把用户从其他已加入的组中删除
  • expires 设置用户的过期时间,值为时间戳,会转为天数,放在shadow 的第8个字段里
  • generate_ssh_key 设置为yes 将会为用户生成密钥,这里不会覆盖原来的密钥
  • ssh_key_type 指定用户的密钥类型,默认rsa,具体的类型取决于被管理节点
  • state 删除或是添加用户,present为添加,absent 为删除; 默认值为yes
  • remove 当与state=absent 一起使用,删除一个用户及关联的目录,比如家目录、邮箱目录。可选的值为:yes/no
    https://blog.csdn.net/weixin_57845423/article/details/124582218

example

  • 创建用户并设置密码
pass=$(echo "123456" | openssl passwd -1 -stdin)
echo $pass
# 执行ansible 命令  创建用户foo并设置密码
ansible  all  -m user -a "name=foo password=${pass}"
  • 创建用户yangge,并且为其创建密钥对,并且密钥对类型为:ecdsa
ansible all  -m user -a "name=henan generate_ssh_key=yes ssh_key_type=ecdsa"
cat /etc/shadow
ls /home/henan/.ssh
  • 创建用户tom ,并且设置其有效期到20221003,并加入到db_admin中,不改变用户的默认属组。
ansible  all  -m user  -a "name=tom expires=$(date +%s -d 20221004) groups=db_admin append=yes"  # append 参数的作用是追加组,原有的组不会删除
ansible all -m shell -a "id tom"
ansible all -m shell -a  "chage -l tom"           # 查看账号有效期

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/test001.txt state=touch"
# 改变文件所有者及权限
ansible all -m file  -a "path=/tmp/test001.txt owner=nobody group=nobody mode=0644"
# 创建一个软连接
ansible  all -m file -a "src=/tmp/test001.txt dest=/tmp/link_test001.txt state=link"
# 创建一个目录
ansible   all -m file  -a "path=/tmp/testdir state=directory"
#取消一个链接
ansible all -m file -a "path=/tmp/link_test001.txt state=absent"
# 删除一个文件
ansible   all -m file -a "path=/tmp/test001.txt state=absent"

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 指周 , 可以设置成(1-6,* 等)格式,默认是*, 也就是每星期
  • 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"

debug 模块

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

  • var 直接打印一个指定的变量值
  • msg 答应一段可以格式化的字符串
    example
    这里引入了变量,只需要了解debug 模板的使用即可,后面在学习变量、剧本时,会继续学习的
# 声明一个变量,然后给这个变量赋值
ansible all -m debug -a "var=role" -e "role=web"
#使用msg 参数,并引用变量role
ansible all -m debug -a "msg='role is {{role}}'" -e "role=web"

template 模块

template 模块使用了jinjia2 格式作为文件的模板,可以进行文档内变量的替换; 它的每次使用都会被ansible 标记为"changed" 状态,文件以.j2 结尾
常见参数:

  • src 指定ansible 控制端的文件路径
  • dest 指定ansible 被控制端的文件路径
  • owner 指定文件的属主
  • group 指定文件的属组
  • mode 指定文件的权限
  • backup 创建一个包含时间戳信息的备份文件,这样如果您以某种方式错误的破坏了原始文件,就可以将其恢复原状态。yes/no
    example
    用法其实和copy 模块基本一致,template 模块的强大之处是使用了变量替换,就是可以把传递给ansible 的变量的值替换到模板文件中
1,创建一个模板文件,名称为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.txt"  -e "var=world"
3,检查各个控制节点
ansible all -m shell -a "cat /tmp/hello_world.txt"

lineinfile 模块

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

如果是在一个文件中把所有匹配到的多行都进行统一处理,请参考replace模块
如果想对一个文件进行一次性添加/更新/ 删除 多行内容等操作,参考blockinfile
常见参数:

  • path 目标文件路径 ,必须项
  • state 可选值absent 删除| present 替换(默认值)
  • regexp 在文件的每一行中查找的正则表达式
    对于state=present ,仅找到的最后一行将被替换
  • line 要在文件中插入/替换的行。 需要state=present
  • create 文件不存在时,是否要创建文件并添加内容。 yes/no
    example
    删除被控节点文件里的某一条内容
1,管理节点上
cat /home/renyong/a.sh
touch /tmp/testfile
henan 		11111
beijing		22222
tianjing	33333
dalian		44444
liaoning	55555
2,使用ad-hoc命令,用copy 模块将测试文件拷贝到被控节点上
ansible all -m copy -a "src=/home/renren/a.sh dest=/home/renren/test.sh"
3, 使用ad-hoc命令,用lineinfile  模块删除匹配到的行
ansible all -m  lineinfile  -a "path=/home/renren/test.sh regexp='tianjing' state=absent"
4,检查被控节点目标文件的特定内容是否被修改
ansible all -m shell -a "cat /home/renren/test.sh"

替换某一行

#替换匹配到的行
ansible  all -m lineinfile  -a "path=/home/renyong/test.sh regexp='^henan' line='abcdefg111111111111' state=present"
#检查
 ansible all -m shell -a "cat /home/renyong/test.sh"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值