架构师的成长之路初片~自动化篇之Ansible~Role
[root@control ansible]# mkdir roles //创建放角色的目录
[root@control ansible]# ansible-galaxy init roles/test //创建名字叫test的角色
[root@control ansible]# ls roles/test/ //查看test角色目录
defaults/main.yml:定义变量的缺省值,优先级较低
files目录:存储静态文件的目录,如tar包、音乐、视频等
handlers/main.yml:定义handlers
meta/main.yml:写作者、版本等描述信息
README.md:整个角色(role)的描述信息
tasks/main.yml:定义任务的地方
templates目录:存放动态数据文件的地方(文件中包含了变量的模板文件)
vars/main.yml:定义变量,优先级高
使用test角色 练习1: 1,编写角色中相关文件 vim roles/test/templates/test.txt //随意创建模板文件 sysname is {{ansible_hostname}} //里面随意放入一些常量与变量 test vars {{abc}} vim roles/test/vars/main.yml //在vars目录的main.yml文件创建变量 --- # vars file for roles/test abc: test_roles_vars //定义abc变量 vim roles/test/tasks/main.yml //到tasks目录的main.yml文件写具体任务 --- # tasks file for roles/test - template: //任务文件中直接调用模块即可 src: test.txt //这里的源文件就是上面创建的,直接调用 dest: /opt/test.txt
2,编写剧本调用角色 [root@control ansible]# vim playbook01.yml //编写playbook调用角色 --- - hosts: node1 roles: //调用角色 - test //被调用的角色名称 vim ansible.cfg //修改ansible配置文件 [defaults] inventory=./inventory roles_path=./roles //添加角色目录位置
3,运行剧本跑角色任务 [root@control ansible]# ansible-playbook playbook01.yml //跑剧本,里面会运行 所调用的角色的相关任务 ------------------------------------------------------------------ 练习2:使用角色自动化部署Web集群 首先编写针对node3与node4主机的角色: 1,创建角色,编写相关文件 [root@control ansible]# ansible-galaxy init roles/http //创建名字是http的角色 [root@control ansible]# vim roles/http/tasks/main.yml //定义角色中的任务 --- # tasks file for roles/http - yum: name: httpd - copy: content: "{{ansible_hostname}}" //copy模块的content参数可以将文本信息拷贝到远程主机里,而无需提前准备 dest: /var/www/html/index.html //目的地 - service: name: httpd //开启的服务是httpd state: started enabled: yes //开机自启 - firewalld: service: http //防火墙里针对http协议 state: enabled //放行 permanent: yes //永久生效 immediate: yes //立刻生效
2,编写剧本调用角色 [root@control ansible]# cat playbook02.yml //编写剧本调用角色 --- - hosts: webserver //给node3和node4运行 roles: - http //角色名称是刚刚创建的那个
3,测试 [root@control ansible]# ansible-playbook playbook02.yml //运行 [root@control ansible]# curl node3 //测试node3或者node4只要能看到 对应的主机名即可
然后编写针对node2主机的角色 1,创建角色 [root@control ansible]# ansible-galaxy init roles/proxy [root@control ansible]# vim roles/proxy/files/nginx.sh //编写脚本文件 #!/bin/bash yum -y install gcc make pcre-devel openssl-devel cd /opt tar -xf nginx-1.17.6.tar.gz cd nginx-1.17.6 ./configure make make install 然后将上述脚本放到node1主机跑一下看看(要提前将nginx-1.17.6.tar.gz文件拷贝到node1主机的/opt下),这样可以测试脚本是否正确,再将node1安装好的nginx的配置文件修改成可以调用node3与node4的集群 [root@node1 ~]# vim /usr/local/nginx/conf/nginx.conf
scp /usr/local/nginx/conf/nginx.conf 192.168.4.253:/root/ansible/roles/proxy/files/ //然后再将该配置文件拷贝到control主机的proxy角色文件目录下
[root@node1 ~]# scp nginx-1.17.6.tar.gz 192.168.4.253:/root/ansible/roles/proxy/files //拷贝nginx-1.17.6.tar.gz到control主机的proxy角色文件目录下
[root@control ansible]# vim roles/proxy/tasks/main.yml
---
# tasks file for roles/proxy
- copy: //先将files目录中的nginx安装包拷贝到远程主机
src: nginx-1.17.6.tar.gz
dest: /opt/
- script: nginx.sh //执行之前写的安装脚本
args:
creates: /usr/local/nginx/sbin/nginx //如果该文件存在说明nginx已经安装,则不执行脚本
- copy: //拷贝nginx配置文件到远程主机
src: nginx.conf
dest: /usr/local/nginx/conf/nginx.conf
- shell: /usr/local/nginx/sbin/nginx //开启nginx
args:
creates: /usr/local/nginx/logs/nginx.pid //如果nginx已经开启则不会再开
- firewalld: //防火墙放行http
service: http
state: enabled
permanent: yes
immediate: yes
[root@control ansible]# vim playbook03.yml //编写剧本在node2运行proxy角色
---
- hosts: node2
roles:
- proxy
[root@control ansible]# ansible-playbook playbook03.yml //运行脚本
[root@control ansible]# curl node2 //检测结果
node4[root@control ansible]# curl node2
node3[root@control ansible]# curl node2
node4[root@control ansible]# curl node2
node3[root@control ansible]#
二,使用ansible-vault加密重要数据
echo 123 > abc.txt //创建素材
ansible-vault encrypt abc.txt // ansible-vault 后面跟encrypt是加密,输入
两次密码,完成加密
cat abc.txt //查看文件已经被加密
ansible-vault view abc.txt // view是仅查看实际内容,要输入密码
ansible-vault decrypt abc.txt // decrypt是解密,输入密码
ansible-vault //如果忘记加密、解密等单词拼写方法可以直接回车有提示
ansible-vault rekey abc.txt //修改密码
echo 123456 > pass //将密码放入文件pass中,文件名可以自定义
ansible-vault view abc.txt --vault-id=pass //利用pass文件查看加密的abc.txt
ansible-vault decrypt abc.txt --vault-id=pass //利用pass文件解密
cat abc.txt //查看已经解密
ansible-vault encrypt abc.txt --vault-id=pass //利用pass文件加密
cat abc.txt
-------------------------------------------------------------
三,配置sudo提权
在远程管理被控主机时,可能连接的不是root账户,如果使用普通账户
那么远程主机就无法执行很多指令,比如装包、配置、启动服务,就要先修改配置文件为远程主机中的普通账户提升权限
1,在node1主机创建测试账户abc并且修改配置
useradd abc //创建测试用户
passwd abc //配置密码
abc ALL=(root) /usr/bin/systemctl //在101行添加,本行
的含义是,允许abc账号在任何名称的主机借助root账户执行systemctl
命令
[root@node1 ~]# su - abc //切换到abc账户
[abc@node1 ~]$ sudo systemctl restart sshd //使用sudo提权命令执行
之前无法执行的systemctl命令,然后输入自身密码即可完成
vim /etc/sudoers //再次修改提权配置文件
abc ALL=(ALL) NOPASSWD:ALL
2,在control主机修改ansible配置实现提权
[root@control ansible]# vim ansible.cfg //修改配置文件,添加提权配置
[defaults]
inventory=./inventory
roles_path=./roles
remote_user=abc //添加远程连接的账户名字为abc,从此以后远程管理的机器就不是用root账号了
[privilege_escalation] //从改行往下是关于提权的配置
become=True //要不要提权?True代表要
become_method=sudo //提权方式是sudo
become_user=root //提权时以谁的身份?root
become_ask_pass=False //sudo提权时是否要密码?False是不用
[root@control ansible]# vim /etc/ansible/ansible.cfg //上述配置手写比较麻烦,去默认的配置文件查找找到第340行复制即可
340 [privilege_escalation]
341 #become=True
342 #become_method=sudo
343 #become_user=root
344 #become_ask_pass=False
3,测试
回到node1 关闭nginx
再回到control主机:
ssh-copy-id abc@node1 //给node1的abc账户传递秘钥,实现免密
ansible node1 -m service -a "name=httpd state=restarted" //最后在控制主机
给node1下达指令,重启httpd服务,此时node1使用的就是abc账户了
------------------------------------------
其他了解知识:
如果修改了inventory主机清单
vim inventory
node1 ansible_ssh_pass=123456 //主机名后面加ansible_ssh_pass相当于定义密码,可以在没有秘钥时使用
node1 ansible_ssh_user=root //定义连接的账户,如果配置文件里面写了remote_user是abc,那么这句的含义就是其他主机虽然都用abc连接,但node1用root
node1 ansible_ssh_port=2022 //ssh端口号不是22时的修改