翼度科技»论坛 云主机 LINUX 查看内容

ansible Ad-Hoc YAML剧本

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
ansible、Ad-Hoc、YAML剧本

1.简介

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
2.部署

1.dns resolve
ansible服务器:192.168.70.42  配置阿里yum源
ansible客户机:192.168.70.35  192.168.70.36   配置阿里yum源
服务器和客户机都做好域名解析
  1. vim /etc/hosts
  2. 192.168.70.35 host1
  3. 192.168.70.36 host2
  4. 192.168.70.42 ansible
复制代码
2.install ansible  (ansible服务器)
  1. yum install ansible -y
复制代码
3.ssh-key免密连接
  1. ssh-keygen   //一路回车 有yes填yes
  2. ssh-copy-id root@192.168.70.35        //发送公钥
  3. ssh-copy-id root@192.168.70.36
  4. ssh root@192.168.70.35   //测试连接
  5. ssh root@192.168.70.36
复制代码
4.ansible基础

1.自定义主机清单 (ansible机器)
  1. vim /etc/ansible/hosts
  2. host1
  3. host2
复制代码
2.测试连通性
  1. ansible localhost -m ping  //测试host1连通性 -m指定模块
  2. ansible host1 -m ping o  //一行简简洁输出
复制代码
3.know_hosts
  1. ansible host2 -m ping -u root -k -o //没有配置ssh免密可以交互式密码验证登录 如果是第一次连接会报错 需使用ansible host2 -m ping 交互yes之后才能
  2. `去掉(yes/no)的询问`
  3. vim /etc/ssh/ssh_config
  4. StrictHostKeyChecking no
  5. systemctl restart sshd
  6. ansible host2 -m ping -u root -k -o //再次测试
复制代码
4.请注意ping和ssh
ping的通不代表ansible连接的上,ping ICMP:网际消息管理协议
ansible的ping事探测ssh程序是否连接。不是icmp协议,如果关比sshd服务,ping可以成功,ansible测试会依旧失败。
5.Inventory主机清单

1.增加主机组
  1. vim /etc/ansible/hosts
  2. [webserver]
  3. host1 ansible_ssh_user='root'
  4. host2 ansible_ssh_user='root'
  5. ansible webserver -m ping -o
复制代码
2.增加用户名没密码(没设置免密登录,可以增加用户名密码)
  1. vim /etc/ansible/hosts
  2. host1 ansible_ssh_user='root' ansible_ssh_pass='123456'
  3. host2 ansible_ssh_user='root' ansible_ssh_pass='123456'
  4. //或者
  5. host[1:2] ansible_ssh_user='root' ansible_ssh_pass='123456'
复制代码
3.增加端口(host)
  1. vim /etc/ssh/sshd_config
  2. Port 22 改成Port 2222
  3. systemctl restart sshd
  4. 测试连接
  5. ansible host1 -m ping  //会发现失败 ansible默认sshd端口还是22
  6. 回到ansible 修改用户host的端口
  7. vim /etc/ansible/hosts
  8. host1 ansible_ssh_user='root' ansible_ssh_pass='123456' ansible_ssh_port='2222'  //指定ssh端口
  9. 再次测试
  10. ansible host1 -m ping
复制代码
4.组:变量
  1. [webserver]
  2. host1 ansible_ssh_port='2222'
  3. host2 ansible_ssh_port='2222'
  4. [webserver:vars]
  5. ansible_ssh_user='root'
  6. ansible_ssh_pass='123456'
复制代码
5.子分组 (将不同的分组进行组合) 为了实验方便我们先把host的sshd 端口改回默认
  1. vim /etc/ansible/hosts
  2. [apache]
  3. host1
  4. [nginx]
  5. host2
  6. [webserver:children]
  7. apache
  8. nginx
  9. ansible webserver -m ping -o  //测试
复制代码
6.自定义主机列表
  1. vim hostlist
  2. [dockers]
  3. host1
  4. host2
  5. ansible -i hostlist dockers -m ping -o  //测试
复制代码
6.Ad-Hoc点对点模式

临时的,在ansible中是指需要快速执行的单条命令,并且不需要保存的命令。对于复杂的命令则为 playbook。
1.shell模块
  1. ansible webserver -m shell -a 'hostname' -o  //查看主机名称
  2. ansible webserver -m shell -a 'yum install mariadb -y' -o  //安装mariadb
  3. ansible webserver -m shell -a 'touch /tmp/777.txt' -o  //创建文件
复制代码
2.复制模块
  1. ansible-doc copy  //查看帮助文档
  2. ansible webserver -m copy -a 'src=/etc/hosts dest=/tmp/2.txt'  //copy 如果和原先文件一样 不会进行拷贝
  3. ansible webserver -m copy -a 'src=/etc/hosts dest=/tmp/3.txt owner=root group=root mode=777'
  4. ansible webserver -m copy -a 'src=/etc/hosts dest=/tmp/3.txt owner=root group=root mode=777 backup=yes'
复制代码
3.用户模块
  1. ansible-doc user  //查看帮助文档
  2. ansible webserver -m user -a 'name=xux state=present'  //创建用户
  3. echo '123456' | openssl passwd -1 -stdin  //系统存储的是密文 需要将输入的密码转化为加密后的密文
  4. ansible webserver -m user -a 'name=xux password="$1$g93P3CoY$YPuV8anNPa8HBhnfMncB60"'  //修改密码
  5. ansible webserver -m user -a 'name=xux shell=/sbin/nologin append=yes'  //修改用户属性
  6. ansible webserver -m user -a 'name=xux state=absent'  //删除用户
复制代码
4.软件包管理
  1. ansible-doc yum  //查看帮助文档
  2. ansible webserver -m yum -a 'name="*" stale=lastest'  //升级所有包
  3. ansible webserver -m yum -a 'name=vsftpd state=present'  //安装vsftpd
  4. ansible webserver -m yum -a 'name=vsftpd state=absent'  //卸载vsftpd
  5. ansible webserver -m yum -a 'name=vsftpd state=latest'  //升级vsftpd
复制代码
5.服务模块
  1. ansible-doc service  //查看帮助文档
  2. ansible webserver -m service -a 'name=vsftpd state=started'  //开启httpd服务
  3. ansible webserver -m service -a 'name=vsftpd state=stopped'  //关闭httpd服务
  4. ansible webserver -m service -a 'name=vsftpd state=restarted'  //重启httpd服务
  5. ansible webserver -m service -a 'name=vsftpd state=started enabled=yes'  //开启开机自启
  6. ansible webserver -m service -a 'name=vsftpd state=started enabled=no'  //关闭开机自启
复制代码
6.文件模块
  1. ansible-doc file  //查看帮助文档
  2. ansible webservice -m file -a 'path=/tmp/11.txt mode=771 state=touch'  //创建文件
  3. ansible webserver -m file -a 'path=/tmp/asb mode=770 state=directory'  //创建目录
复制代码
7.收集模块
  1. ansible-doc setup  //查看帮助文档
  2. ansible host1 -m setup  //列出常见常熟
  3. ansible host1 -m setup -a 'filter=ansible_all_ipv4_addresses'  //查询ip地址
复制代码
7.YAML

YAML Ain’t Markup Language-非标记语言
示例:通过YAML编写一个简单的剧本,完成web的部署,配置,启动的全过程。
1.准备
  1. ansible all -m yum -a 'name=httpd state=removed' -o  //清理一下环境
  2. yum install -y httpd  //准备配置文件
  3. mkdir apache
  4. cd apache
  5. cp -rf /etc/httpd/conf/httpd.conf .
  6. grep '^Listen' httpd.conf
  7. Listen 8080  //修改端口
复制代码
2.编写剧本
  1. 编写
  2. vim apache.yaml
  3. - hosts: host2
  4.   tasks:
  5.   - name: install apache packages
  6.     yum: name=httpd state=present
  7.   - name: copy apache conf
  8.     copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
  9.   - name: ensure apache is running
  10.     service: name=httpd state=started enabled=yes
  11.    
  12. 测试
  13. ansible-playbook apache.yaml --syntax-check
  14. ansible-playbook apache.yaml --list-tasks
  15. ansible-playbook apache.yaml --list-hosts
  16. 执行
  17. ansible-playbook apache.yaml
复制代码
3.优化
  1. 如果我们在配置文件中修改了apache端口号为9000,那么我们再次重启会发现文件会被拷贝过去,但是服务器并没没有重启。
  2. 因为剧本中写的服务启动,并没有重启服务。需要优化一下剧本代码,如果执行copy语句那么notify会触发,接着会执行handlers中的语句重启服务。
  3. - hosts: webserver
  4.   tasks:
  5.   - name: install apache packges for xux
  6.     yum: name=httpd state=latest
  7.   - name: copy apache conf file for xux
  8.     copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
  9.     notify: restart apache service for xux
  10.   - name: ensure apache si running
  11.     service: name=httpd state=started enabled=yes
  12.   handlers:
  13.   - name: restart apache service for xux
  14.     service: name=httpd state=restarted
复制代码
8.Role-角色扮演
roles则是在ansible中,playbooks的目录组织结构。将代码或文件进行模块化,成为roles的文件目录组织结构,易读,代码可重用,层次清晰。
示例:通过role远程部署nginx并配置
1.准备目录
  1. nginx 角色名
  2. files  普通文件
  3. handlers  触发器程序
  4. tasks  主任务
  5. templates 金甲模板(有变量的文件)
  6. vars 自定义变量
复制代码
  1. [root@localhost ~]# mkdir roles/nginx/{files,handlers,tasks,templates,vars} -p
  2. touch roles/site.yaml roles/nginx/{handlers,tasks,vars}/main.yaml
  3. echo 1234 > roles/nginx/files/index.html
  4. yum install -y nginx && cp /etc/nginx/nginx.conf roles/nginx/templates/nginx.conf.j2
  5. [root@localhost ~]# tree roles/
  6. roles/
  7. ├── nginx
  8. │   ├── files
  9. │   │   └── index.html
  10. │   ├── handlers
  11. │   │   └── main.yaml
  12. │   ├── tasks
  13. │   │   └── main.yaml
  14. │   ├── templates
  15. │   └── vars
  16. │       └── main.yaml
  17. └── site.yaml
复制代码
2.编写任务
  1. vim roles/nginx/tasks/main.yaml
  2. - name: install epel-release packge
  3.   yum: name=epel-release state=latest
  4. - name: install nginx packge
  5.   yum: name=nginx state=latest
  6. - name: copy index.html
  7.   copy: src=index.html dest=/usr/share/nginx/html/index.html
  8. - name: copy nginx.conf template
  9.   template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  10.   notify: restart nginx
  11. - name: make sure nginx service running
  12.   service: name=nginx state=started enabled=yes
复制代码
  1. Template:
  2. Template模板在运用时与copy模块类似,区别在于可以在Ansible的Playbook执行的时候,根据一定的条件灵活的设置要复制文件中的部分关键内容。
  3. 在Ansible中,Templat模板使用jinjia2语言进行配置,模板文件的后缀名为.j2。
复制代码
3.准备配置文件
  1. vim roles/nginx/templates/nginx.conf.j2
  2. worker_processes auto; 改成 worker_processes {{ ansible_processor_cores }};  //ansible内置变量
  3. worker_connections 1024; 改成 worker_connections {{ worker_connections }};  //自定义变量
复制代码
4.编写变量
  1. vim roles/nginx/vars/main.yaml
  2. worker_connections: 10240
复制代码
5.编写处理程序
  1. vim roles/nginx/handlers/main.yaml
  2. ---
  3. - name: restart nginx
  4.   service: name=nginx state=restarted
复制代码
6.编写剧本
  1. vim roles/site.yaml
  2. - hosts: webserver
  3.   roles:
  4.   - nginx
复制代码
7.实施
  1. cd roles
  2. ansible-playbook site.yaml --syntax-check  //测试
  3. ansible-playbook site.yaml  //实施剧本
复制代码
文章内容主要参考:b站磊哥

来源:https://www.cnblogs.com/xuxuxuxuxu/p/17647465.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具