架构师的成长之路初片~自动化篇之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.gzcontrol主机的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    //node1abc账户传递秘钥,实现免密

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_userabc,那么这句的含义就是其他主机虽然都用abc连接,但node1root

node1  ansible_ssh_port=2022   //ssh端口号不是22时的修改

 

posted @ 2021-03-07 17:34  樱花泪  阅读(53)  评论(0编辑  收藏  举报