文章目录
- 一、构建Anisble
- 1. 安装ansible
- 2. 配置ansible
- 3. 设置免密信息
- 二、不同用户下构建Anisble
- 1. 切换为普通用户
- 2. 切换为root用户
- 三、不同的目录下构建Anisble
- 四、Inventory文件配置
- 1. 嵌套清单
- 2.变量的检索位置
- 3. ansible命令指定清单的正则表达式
- 五、Ad-Hoc命令集
- 1.ansible实现管理的方式
- 2.Ad-Hoc执行方式中如何获得帮助
- 3.ansible命令运行方式及常用参数
- 4.ansible的基本颜色代表信息
- 5.ansible中的常用模块
一、构建Anisble
1. 安装ansible
##1.Ansible对于企业运维的重大意义####
批量管理
####2.Ansible的安装####
ansible --viersion
[root@server1 yum.repos.d]# vi epel.repo
[epelrepo]
name=epelrepo
baseurl=https://mirrors.aliyun.com/epel/8/Everything/x86_64
gpgcheck=0
[root@server1 ~]# dnf install -y ansible
2. 配置ansible
[root@server1 ~]# cd /etc/ansible/
[root@server1 ansible]# ls
ansible.cfg hosts roles
[root@server1 ansible]# cd roles/
[root@server1 roles]# ls
[root@server1 roles]# cd ..
[root@server1 ansible]# ls
ansible.cfg hosts roles
## ansible的基本信息:
/etc/ansible/ansible.conf ##全局配置文件,默认很少修改
/etc/ansible/hosts ##全局主机清单清单文件
3. 设置免密信息
[root@server1 ansible]# vim hosts
##添加在文件最后
[test]
192.168.0.2
[prod]
192.168.0.3
[root@server1 ansible]# ssh-keygen
[root@server1 ansible]# ssh-copy-id 192.168.0.2
[root@server1 ansible]# ssh-copy-id 192.168.0.3
[root@server1 ansible]# ansible all -m ping
[root@server1 ansible]# ansible test -m ping
[root@server1 ansible]# ansible prod -m ping
免密成功
二、不同用户下构建Anisble
ansible 默认情况下首先加载当前目录下的配置文件,然后是用户主目录下的文件,最后才是/etc/ansible下的文件。
当前目录下优先级最高,用户主目录次之,最后是全局/etc下。
1. 切换为普通用户
[root@server1 ~]# useradd westos
[root@server2 ~]# useradd westos
[root@server3 ~]# useradd westos
[root@server3 ~]# passwd westos
[root@server1 ~]# su - westos
[westos@server1 ~]$ mkdir ansible
[westos@server1 ~]$ cd ansible/
[westos@server1 ansible]$ pwd
/home/devops/ansible
[westos@server1 ansible]$ ansible test -m ping -u root ##-u 指定超户
[westos@server1 ansible]$ ansible test -m ping -u root -k ##-k 询问密码
SSH password:
[westos@server1 ansible]$ ansible test -m ping -u westos -k
[westos@server1 ansible]$ ansible all -m ping -u westos -k ##需要缓存192.168.0.3
[westos@server1 ansible]$ ssh 192.168.0.3
[westos@server3 ~]$ logout
Connection to 192.168.0.3 closed.
[westos@server1 ansible]$ ansible all -m ping -u westos -k
[westos@server1 ansible]$ logout
[root@server1 ansible]# ansible all -m ping -k -u westos
[root@server1 ansible]# ansible test -k -u westos -m copy -a "src=/etc/passwd dest=/tmp"
[root@server1 ansible]# ansible all -k -u westos -a "ls /tmp"
192.168.0.2 | CHANGED | rc=0 >>
ansible_command_payload_v7bkqedj
passwd
192.168.0.3 | CHANGED | rc=0 >>
ansible_command_payload_a8en33yb
[root@server2 ~]# ls /tmp/
passwd
[root@server1 ansible]# ansible test -k -u westos -m copy -a "src=/etc/passwd dest=/mnt" ##复制失败
[root@server2 ansible]# ll -d /mnt/ ##other位没有写权限
drwxr-xr-x. 2 root root 6 Aug 12 2018 /mnt/
server2与server1对/mnt 目录的权限一致
[root@server1 ansible]# su - westos
[westos@server1 ~]$ cd ansible/
[westos@server1 ansible]$ ls
[westos@server1 ansible]$ vim hosts
[test]
192.168.0.2
[prod]
192.168.0.3
[westos@server1 ansible]$ logout
[root@server1 ansible]# pwd
/etc/ansible
[root@server1 ansible]# ls
ansible.cfg hosts roles
[root@server1 ansible]# vim hosts ##注释写的内容
[root@server1 ansible]# su - westos
[westos@server1 ~]$ cd ansible/
[westos@server1 ansible]$ ls
hosts
[westos@server1 ansible]$ vim ansible.cfg
[defaults]
inventory = ./hosts
[westos@server1 ansible]$ ssh-keygen
[westos@server1 ansible]$ ssh-copy-id server2
[westos@server1 ansible]$ ssh-copy-id server3
2. 切换为root用户
[root@server2 ~]# ll -d /mnt
drwxr-xr-x. 2 root root 6 Aug 12 2018 /mnt
[root@server2 ~]# visudo
101 westos ALL=(ALL) NOPASSWD:ALL
[westos@server1 ansible]$ ansbible test -m ping -b ##-b 切换成root身份
[westos@server1 ansible]$ vim ansible.cfg ##复制 /etc/ansible/ansible.cfg[privilege_escalation] 模块
[defaults]
inventory = ./hosts
[privilege_escalation]
become=True
become_method=sudo
become_user=root ##切换成root身份
become_ask_pass=False ## 不用密码
[westos@server1 ansible]$ ansbible test -m ping ##以westos身份进入测试端,以root身份运作
[westos@server1 ansible]$ ansible-doc -l ##列出所有模块
[westos@server1 ansible]$ ansible-doc -l | wc -l
3387
[westos@server1 ansible]$ ansible test -m copy -a "src=/etc/passwd dest=/mnt"
[westos@server1 ansible]$ ansible test -a "ls /mnt"
192.168.0.2 | CHANGED | rc=0 >>
passwd
[westos@server1 ansible]$ ansible test -a "rm -fr /mnt/passwd"
[westos@server1 ansible]$ ansible test -a "ls /mnt"
192.168.0.2 | CHANGED | rc=0 >>
三、不同的目录下构建Anisble
Ansible配置文件参数详解
ansible 清单中组名称 -m 模块 -u remote_user
[root@server1 ~]# cp -r /home/westos/ansible/ /mnt/
[root@server1 ~]# cd /mnt/
[root@server1 mnt]# ls
ansible
[root@server1 mnt]# cd ansible/
[root@server1 ansible]# ls
ansible.cfg hosts
[root@server1 ansible]# ssh-copy-id westos@192.168.0.2
[root@server1 ansible]# ssh-copy-id westos@192.168.0.3
[root@server1 ansible]# ansible test -m ping
[root@server1 ansible]# ansible all -m ping
[root@server1 ansible]# pwd
/mnt/ansible
[root@server3 ~]# visudo
westos ALL=(ALL) NOPASSWD:ALL
[root@server1 ansible]# vim ansible.cfg
## inventory= ./hosts ##默认指定全局
[root@server1 ansible]# ansible -i hosts all -m ping ##指定配置文件中的配置清单
[root@server1 ansible]# vim ansible.cfg
inventory= ./hosts
[root@server1 ansible]# ansible all -m ping
四、Inventory文件配置
1. 嵌套清单
## 1.嵌套清单#
[root@server1 ansible]# pwd
/mnt/ansible
[root@server1 ansible]# ls
ansible.cfg hosts
[root@server1 ansible]# vim hosts ##添加行
[webserver:children]
test
prod
[root@server1 ansible]# ansible webserver -m ping
2.变量的检索位置
- Inventory配置文件(默认/etc/ansible/hosts)
- Playbook中vars定义的区域
- Roles中vars目录下的文件
- Roles同级目录group_vars和hosts_vars目录下的文件
3. ansible命令指定清单的正则表达式
匹配所有主机,all或*号功能相同
: ##逻辑或
:& ##逻辑与
:! ##逻辑非
~ ##以关键字开头
~(str1|str2) ##以条件1或者条件2开头
对多台主机或多个组同时执行,相互之间用冒号分隔即可
在test组但不在prod组的主机,用感叹号表示
在test组和prod组中同时存在的主机,用&符号表示
五、Ad-Hoc命令集
1.ansible实现管理的方式
Ad-Hoc ##利用ansible命令直接完成管理,主要用于临时命令使用场景
playbook ##ansible脚本,主要用于大型项目场景,需要前期的规划
2.Ad-Hoc执行方式中如何获得帮助
ansible-doc ##显示模块帮助的指令
#格式
ansible-doc [参数] [模块…]
#常用参数
-l ##列出可用模块
-s ##显示指定模块的playbook片段
[root@server1 ansible]# ansible-doc -l | grep dnf
dnf Manages packages with the `dnf' package manager
[root@server1 ansible]# ansible-doc dnf
3.ansible命令运行方式及常用参数
#格式:
ansible 清单 -m 模块 -a 模块参数
#常用参数
#–version ##显示版本
#-m module ##指定模块,默认为command模块
#-v ##详细过程 -vv -vvv更详细过程
#–list ##显示主机列表,也可以用–list-hosts
#-k ##提示输入ssh连接密码,默认key认证
#-C ##预执行检测
#-T ##执行命令的超时时间,默认10s
#-u ##指定远程执行的用户
#-b ##执行sudo切换身份操作
#-become-user=USERNAME ##指定sudo的用户
#-K ##提示输入sudo密码
4.ansible的基本颜色代表信息
绿色 ##执行成功但为对远程主机做任何改变
黄色 ##执行成功并对远程主机做改变
红色 ##执行失败
5.ansible中的常用模块
copy、service模块
[root@server1 ansible]# ansible test -m dnf -a "name=httpd state=present"
[root@server1 ansible]# ansible test -a "rpm -q httpd"
[root@server1 ansible]# ansible test -m service -a "name=httpd state=started"
[root@server1 ansible]# ansible test -m service -a "name=httpd enabled=yes"
[root@server2 mnt]# systemctl is-enabled httpd
enabled
[root@server1 ansible]# ansible-doc -l | grep firewalld
firewalld Manage arbitrary ports/services with firewalld
[root@server1 ansible]# ansible-doc firewalld
[root@server1 ansible]# ansible test -m firewalld -a "service=http permanent=yes immediate=yes state=enabled"
[root@server1 ansible]# vim index.html
www.westos.org
[root@server1 ansible]# ansible test -m copy -a "src=index.html dest=/var/www/html/"
[root@server1 ansible]# curl 192.168.0.2
www.westos.org
file 、user 模块
[root@server2 tmp]# ls -l passwd
-rw-rw-r-- 1 westos westos 1198 Dec 29 18:00 passwd
[root@server1 ansible]# ansible test -m file -a "dest=/tmp/passwd owner=root group=root" ##修改属性
[root@server2 tmp]# ls -l passwd
-rw-rw-r--. 1 root root 1155 Dec 29 18:06 passwd
[root@server1 ansible]# ansible test -m file -a "dest=/tmp/passwd mode=600" ##修改权限
[root@server2 tmp]# ll passwd
-rw-------. 1 root root 1155 Dec 29 18:06 passwd
[root@server1 ansible]# ansible test -m user -a "name=linux" ##在test主机上调用用户模块创建linux,若加密码,密码是加密密码 "name=wxh password=<加密密码>"
[root@server2 tmp]# id linux
uid=1001(linux) gid=1001(linux) groups=1001(linux)
[root@server1 ansible]# ansible test -m user -a "name=linux state=absent" absent ##删除用户
[root@server2 tmp]# id linux
id: ‘linux’: no such user
mysql_user 模块
[root@server1 ansible]# ansible test -m dnf -a "name=mariadb-server"
[root@server2 tmp]# rpm -q mariadb-server
mariadb-server-10.3.17-1.module+el8.1.0+3974+90eded84.x86_64
[root@server1 ansible]# ansible test -m service -a "name=mariadb state=started"
[root@server1 ansible]# ansible-doc -l | grep mysql
[root@server1 ansible]# ansible-doc mysql_user
[root@server1 ansible]# ansible test -m dnf -a "name=python3-PyMySQL.noarch"
[root@server1 ansible]# ansible test -m mysql_user -a "name=westos password=westos priv='*.*:select' state=present"