目录
1.工作原理
2.安装Ansible
2.1批量发送文件
3.ansbile资产
4.ansbile Ad-Hoc命令
4.1 ansible常见模块
4.2 script模块
4.3copy模块
4.4yum_repository
4.5yum模块
4.6systemd模块
4.7 group,user
4.8file模块
4.9cron 、debug,template模块
4.95 lineinfile,blockinfile模块
版本:python >=2.6
1.[root@master ~]# yum -y install ansible ##安装ansible
[root@master ~]# 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, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]2.主机之间设置免密登录(管理节点和被管理节点)
管理节点是192.1681.105 master | 被管理 107.108.106 server{1,3}
3.检测于其他的节点的联通性
[root@master ~]# ansible all -i 192.168.1.106,192.168.1.107 -m ping
##一台机器需要ip地址后面写 ,
## -i 指定Ansible的资产
##-m 只当要运行的模块 如ping copy模块
##-a 给模块指定参数
192.168.1.106 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.107 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@master ~]# touch /tmp/a.conf ##创建a.conf文件
[root@master ~]# ansible all -i 192.168.1.106,192.168.1.107,192.168.1.108 -m copy -a "src=/tmp/a.conf dest=/tmp/a.conf"
192.168.1.108 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/tmp.aconf",
"gid": 0,
"group": "root",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0644",
"owner": "root",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp-1662560796.62-67606-205183439120486/source",
"state": "file",
"uid": 0
}
192.168.1.106 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/tmp.aconf",
"gid": 0,
"group": "root",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0644",
"owner": "root",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp-1662560796.61-67602-200293745768957/source",
"state": "file",
"uid": 0
}
192.168.1.107 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/tmp.aconf",
"gid": 0,
"group": "root",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0644",
"owner": "root",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp-1662560796.61-67604-38084435748781/source",
"state": "file",
"uid": 0
}
***总结一句话***:ansible用模块,让别人做事情
##默认文件地址是/etc/ansible/hosts
[root@master ~]# vim /etc/ansible/inventory.ini ##创建一个自定义资产
server1
[server]
192.168.1.[106:108]
[server2]
1.1.1.1
[root@master ~]# ansible all -i /etc/ansible/inventory.ini --list-hosts
hosts (5):
server1
1.1.1.1
192.168.1.106
192.168.1.107
192.168.1.108
3.1资产选择器
[root@master ~]# ansible server -i /etc/ansible/inventory.ini --list-hosts
hosts (3): ##server为模块
192.168.1.106
192.168.1.107
192.168.1.108
##hosts主机名不能被解析可以通过*或者逻辑符号进行匹配
修改调用资产选择器
[root@master ~]# vim /etc/ansible/ansible.cfg
[defaults]
# some basic default values...
#inventory = /etc/ansible/hosts ##资产默认地址文件
#library = /usr/share/my_modules/
command & shell 模块
[root@master ~]# ansible server -i /etc/ansible/inventory.ini -a "echo hellp"
192.168.1.106 | CHANGED | rc=0 >>
hellp
server1 | CHANGED | rc=0 >>
hellp
192.168.1.108 | CHANGED | rc=0 >>
hellp
192.168.1.107 | CHANGED | rc=0 >>
hellp
##调用etc下文件放入server组 在文件路径后面添加-m shell 则是调用shell模块去执行 不加则是默认commandcommand 无法执行shell的内置命令和特性、
如下
[root@master ~]# ansible server -i /etc/ansible/inventory.ini -m shell -a "echo 'hello'|grep -o 'e'"
192.168.1.108 | CHANGED | rc=0 >>
e
192.168.1.107 | CHANGED | rc=0 >>
e
192.168.1.106 | CHANGED | rc=0 >>
e
[root@master ~]# echo "touch /tmp/testfile" > a.sh
[root@master ~]# ansible server -i /etc/ansible/inventory.ini -m script -a "/root/a.sh"
##-i是文件地址 server是文件地址中的块 -m指定模块 -a执行命令
192.168.1.106 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.1.106 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.1.106 closed."
],
"stdout": "",
"stdout_lines": []
}
[root@master ~]# ansible server -i hosts -m shell -a "ls -l /tmp/ | grep testfile"##检查是否生成文件
192.168.1.107 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 0 9月 12 20:55 testfile
192.168.1.108 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 0 9月 12 20:55 testfile
192.168.1.106 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 0 9月 12 20:55 testfile
常用参数:
- src 只当拷贝文件源地址
- dest 只当拷贝文件的目标地址
- backup 拷贝文件,若源目标文件发生变化,则对文件进行备份
- woner 指定新拷贝文件的所有者
- group指定新拷贝文件的所有组
- mode 指定新拷贝文件的权限
1.拷贝管理节点的a.sh 拷贝到节点上
[root@master ~]# ansible server -i hosts -m copy -a "src=./a.sh dest=/root/"
##-m使用copy src源地址 desr是目标地址
[root@master ~]# ansible server -i hosts -m copy -a "src=./a.sh dest=/root/ backup=yes"
##目标文件改变 需要备份时 则加backup=yes 进行备份
group=nobody 所属组就是noboay
mode=0755 文件权限
常用参数
- name 仓库名称
- description 仓库描述信息 必须要添加的参数
- baseurl yum的存储库 repodata 目录所在目录的url 必须添加的参数
- file 仓库文件把偶才能到本地的文件名 不包含repo 默认是name的值
- state preset确认仓库文件 absent确认删除仓库文件
- gpgcheck 检查gpg yes|no 没有默认值
常用参数
- name 安装软件包名,多软件包逗号隔开
- state 对当前只当的软件安装 移除操作
- present 确认已经安装 ,但不升级
installed 确认已经安装
latest 确保安装,且升级为最新
absent和removed 确认已移除
[root@master ~]# ansible server -i hosts -m yum -a"name=nginx state=installed"
##安装nginx包 只要修改state状态
常用模块
- daemon_reload 重新载入systemd 扫描新的或有变动的单元
- enabled 是否开机自启动 yes|no
- name 必选项 服务名称 比如httpd vsftpd
- state 对档期那服务执行启动,停止,重启等操作(started,stopped,restarted,reloaded)
[root@master ~]# ansible server -i hosts -m systemd -a "name=nginx state=restarted enabled=yes"
group常用参数
- name 组名称
- system 是否系统组 yes|no 默认为no
- state 删除,创建 yes/no 默认是no
user常用参数
- name 必须的参数 指定用户名
- password 设置用户的密码 这里接受的是加密的值,他会直接存到shadow中 默认不设置密码
- update_password 假如设置的密码不同于原始密码吗,则会更新密码,在1,3中被加入
- home 指定用户的家目录
- shell 设置用户的shell
- comment 用户的描述信息
- create_home 创建用户时,是否创建其家目录,默认创建,假如不创建,设置为no
- group设置用户主组
- groups 将用户加入到多个其他组中,多个用逗号隔开,默认会把用户从其他已经加入的组删除
- appednd yes|no 和groups配合使用,yes时不会吧用户从其他已经加入的组删除
- system 设置为yes时 将会创建一个系统长啊后
- 而expires 设置用户的国企时间,值为时间,会转化为天数后,放在shadow的最后第8个字段里面
- generate_ssh_key 设置为yes将会为用户生成密钥,这不会覆盖原来的密钥
- ssh_key_type 那个用户的密钥类型,默认rsa
- state 删除或添加用户 p为添加 absent 为删除 默认值为present
- remove 当于state=absent一起使用 删除一个用户及关联的目录,比如家目录,邮箱目录,可选的值是:yes/no
[root@master ~]# pass=$(echo "1" | openssl passwd -1 -stdin) ##设置变量pass密码值 [root@master ~]# echo $pass $1$BnyMNtTD$Dty.g5lCJLvoCJmzeGINc0 [root@master ~]# ansible server -i hosts -m user -a "name=huawei password=${pass}"
常用参数
- group 定义文件的属组
- mode定义文件的权限
- owner定义文件的属主
- path 必选项 定义文件的路径
- recurs 递归的设置文件的属性,只对目录有效
- src要被软硬原文件的路径 只应用羽state=link的情况
- dest 被连接到的路径只用于state=link的情况
- state
-directory 如果目录不存在 创建目录
-file 文件不存在 则不会被创建爱你 存在则返回文件的信息 常用语文件是否查存在
link 创建软连接
-hard 创建硬连接
-touch 如果文件不存在 则会创建一个新的文件 如果文件或目录已经存在 则更新期最后的修 改时间
-absent 删除目录文件或者取消连接文件
[root@MASTER ~]# ansible all -m file -a "path=/root/ceshi owner=ceshi group=ceshi mode=0777"
cron常用参数
- name 只当一个cron job的名字 便于日后删除
- minute hour day month weekdat 指定分钟 时 日 设置成格式默认是*
- job指定要执行的内容 通常写个脚本
- state 只当这个job砖塔i 可以新增present 或则删除absent 默认为新增
[root@master ~]# ansible master -i hosts -m cron -a "name='ceshi' minute='0' job='ls -alh >/dev/null'" [root@master ~]# crontab -l ##查看任务 #Ansible: ceshi 0 * * * * ls -alh >/dev/null [root@master ~]# ansible master -i hosts -m cron -a "name='ceshi' state=absent" ##删除ceshi这个任务
debug模块
常用参数
- var 直接打印一个指定的变量值
- msg打印一段可以格式化的字符串
template模块
常用参数
- src 指定ansible控制端的文件路径
- dest 只当ansible被控端的文件路径
- owner group mode定制文件的 主 组 权限
- mode 只当文件的权限
- backup 床啊金一个包含时间信息的备份文件 这样如果您已某种方式错误的破坏了原始文件 就可以将其回复 yes|no
常用参数
- path 目标文件路径 必须
- state 可选值absent 删除| present 替换(默认值)
- regexp 在文件的每一行查找正则表达式 对于state=present 只找最后一行替换
- line 在文件插入 替换的行 需要state=present
- create 文件不存是 是否要创建文件并添加内容 yes|no
[root@master ~]# ansible master -i hosts -m lineinfile -a "path=./sudoers regexp='^#' state=absent" ##删除dudoers文件下所有#开头的: [root@master ~]# ansible master -i hosts -m lineinfile -a "path=./sudoers regexp='^34' line='ok' state=present" ##匹配34开头的 并且匹配相关值最后一行修改成ok