ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

自动化运维之Ansible

自动化运维之Ansible 所有主机配置解析Ansible安装[rootserver1 ~]# yum install -y ansible-coreAnsible配置文件[rootserver1 ~]# cd /etc/ansible/[rootserver1 ansible]# ansible-config init --disabled ansible.cfg[rootserver1 ansible]# vim hosts[rootserver1 ansible]# ansible-inventory --graphAnsible Ad-hoc语法[rootansible ~]# ansible pattern -m module_name -a arguments参数详解pattern: inventory文件里定义的主机组名,主机名,IP,别名等,all表示所有的主机,支持通配符,正则: -冒号,多个组,组名之间用冒号隔开web-组名或主机名中含web的webservers[0] - webservers组中的第一台主机, -1表示最后一台主机,支持切片(正):[1:2]表示组中的第二台和第三台all所有-m module_name:模块名称,默认为command-a arguments:传递给模块的参数-i file_name:指定inventory文件,默认为/etc/ansible/hosts-k :询问密码.如果没有传密钥到被管理端,必须要接此选项配置过程:1.在控制节点安装ansible2.编辑主机清单文件,加入被管控节点3.在控制节点生成密钥,把公钥传到所有的被控制节点(可选)帮助信息查看# ansible-doc -l #查看所有模块信息# ansible-doc module_name #查看模块帮助信息Ansible Modules1.主机连通性[rootserver1 ansible]# ansible web -m ping -k这样就说明我们的主机是连通状态的。接下来的操作才可以正常进行。2. command模块这个模块可以直接在远程主机上执行shell命令并将结果返回本主机。[rootserver1 ansible]# ansible web -m command -a ss -ntl -k3. shell模块[rootserver1 ~]# ansible web -m shell -a cat /etc/passwd |grep devops4. copy模块这个模块用于将文件复制到远程主机同时支持给定内容生成文件和修改权限等。① 复制文件[rootserver1 ~]# ansible web -m copy -a src~/hello dest/data/hello② 给定内容生成文件并制定权限[rootserver1 ~]# ansible web -m copy -a contentI am keer\n dest/root/name mode666我们现在可以去查看一下我们生成的文件及其权限[rootserver1 ~]# ansible web -m shell -a ls -l /root/③ 关于覆盖我们把文件的内容修改一下然后选择覆盖备份[rootserver1 ~]# ansible web -m copy -a contentI am keerya\n backupyes dest/root/name mode666现在我们可以去查看一下[rootserver1 ~]# ansible web -m shell -a ls -l /root/可以看出我们的源文件已经被备份我们还可以查看一下name文件的内容[rootserver1 ~]# ansible web -m shell -a cat /root/name5. file模块该模块主要用于设置文件的属性比如创建文件、创建链接文件、删除文件等① 创建目录[rootserver1 ~]# ansible web -m file -a path/data/app statedirectory② 创建链接文件[rootserver1 ~]# ansible web -m file -a path/data/bbb.jpg srcaaa.jpg statelink③ 删除文件[rootserver1 ~]# ansible web -m file -a path/data/aaa.jpg stateabsent6. fetch模块该模块用于从远程某主机获取复制文件到本地。有两个选项dest#用来存放文件的目录src#在远程拉取的文件并且必须是一个file不能是目录[rootserver1 ~]# ansible web -m fetch -a src/data/hello.txt dest/root我们可以在本机上查看一下文件是否复制成功。要注意文件保存的路径是我们设置的接收目录下的被管制主机ip目录下7. cron模块该模块适用于管理cron计划任务的其使用的语法跟我们的crontab文件中的语法一致[rootserver1 ~]# ansible web -m cron -a namentp update every 5 min minute*/5 job/sbin/ntpdate 172.17.0.1 /dev/null[rootserver1 ~]# ansible web -m shell -a crontab -lAnsible Playbook剧本基本写法server1上创建devops用户[rootserver1 ~]# useradd devops[rootserver1 ~]# su - devops[devopsserver1 ~]$ mkdir ansible[devopsserver1 ~]$ cd ansible/[devopsserver1 ansible]$ vim apache.ymlserver2上创建devops用户[rootserver2 ~]# useradd devops[rootserver2 ~]# passwd devops配置目标机 sudo 免密[rootserver2 ~]# echo devops ALL(ALL) NOPASSWD: ALL /etc/sudoers.d/devops[rootserver2 ~]# chmod 440 /etc/sudoers.d/devopsserver1上执行[devopsserver1 ansible]$ ansible-playbook apache.yml -k[devopsserver1 ansible]$ curl server2前置配置配置ssh免密[devopsserver1 ~]$ ssh-keygen[devopsserver1 ~]$ ssh-copy-id devops192.168.247.143配置主机清单[devopsserver1 ansible]$ vim hosts生成Ansible 配置模板文件[devopsserver1 ansible]$ ansible-config init --disabled ansible.cfg修改配置文件[devopsserver1 ansible]$ vim ansible.cfg让 Ansible 在执行任务时自动以 root身份运行将 Ansible 的默认主机清单Inventory路径指定为当前工作目录下的./hosts文件[devopsserver1 ansible]$ ansible-inventory --graph[devopsserver1 ansible]$ ansible-playbook apache.yml全局指定 Ansible 连接远程主机时使用的 SSH 登录用户为devops[devopsserver1 ansible]$ vim ansible.cfg修改 Apache 监听端口为 8080[devopsserver1 ansible]$ vim apache.yml[devopsserver1 ansible]$ ansible-playbook apache.ymlhandlers[devopsserver1 ansible]$ vim apache.yml对比项之前的配置现在的配置端口修改后处理❌ 无后续操作端口变更不会立即生效✅ 通过notify触发 handler 重启服务服务重启机制不存在新增handlers段定义重启任务幂等性每次运行都执行所有 taskhandler 仅在 notify 被触发时才执行Ansible 的Facts事实机制[devopsserver1 ansible]$ vim apache.ymlansible_hostname是 Ansible 在连接目标主机时自动采集的内置变量值为该主机的短主机名gather_facts参数指定了在以下任务部分执行前是否先执行setup模块获取主机相关信息这在后面的task会使用到setup获取的信息时用到部署后自动化验证在 web 服务器部署完成后从控制节点本地发起 HTTP 请求验证网站是否可正常访问并输出页面内容[devopsserver1 ansible]$ vim apache.yml[devopsserver1 ansible]$ ansible-playbook apache.yml变量定义及使用vars[devopsserver1 ansible]$ vim apache.yml对不同主机部署不同端口的 Apache 服务[devopsserver1 ansible]$ vim hosts[devopsserver1 ansible]$ vim apache.yml[devopsserver1 ansible]$ ansible-playbook apache.yml[devopsserver1 ansible]$ curl node1:8080从lineinfile改为template[devopsserver1 ansible]$ vim apache.yml[devopsserver1 ansible]$ scp server2:/etc/httpd/conf/httpd.conf .[devopsserver1 ansible]$ mv httpd.conf httpd.conf.j2[devopsserver1 ansible]$ vim httpd.conf.j2[devopsserver1 ansible]$ ansible-playbook apache.ymlgroup variable组变量[devopsserver1 ansible]$ vim hosts[devopsserver1 ansible]$ ansible-playbook apache.yml部署keepalived[rootserver1 ~]# passwd devops[rootserver1 ~]# su - devops[devopsserver1 ~]$ ssh-copy-id 192.168.247.142[rootserver1 ~]# visudo[devopsserver1 ansible]$ vim hosts[devopsserver1 ansible]$ vim keepalved.yml[rootserver2 ~]# yum install -y keepalived[devopsserver1 ansible]$ scp server2:/etc/keepalived/keepalived.conf .[devopsserver1 ansible]$ mv keepalived.conf keepalived.conf.j2[devopsserver1 ansible]$ ansible-playbook keepalived.yml[rootserver1 ~]# systemctl stop keepalived[rootserver2 ~]# tail -f /var/log/messages添加用户[devopsserver1 ansible]$ vim user.yml[devopsserver1 ansible]$ ansible-playbook user.yml添加主机解析[devopsserver1 ansible]$ vim lineinfile.yml[devopsserver1 ansible]$ ansible-playbook lineinfile.yml魔法变量[devopsserver1 ansible]$ vim hosts[devopsserver1 ansible]$ vim groups.yml[devopsserver1 ansible]$ cp /etc/hosts test.j2[devopsserver1 ansible]$ vim test.j2[devopsserver1 ansible]$ ansible-playbook groups.yml[devopsserver1 ansible]$ cat /etc/hostsHaproxy[devopsserver1 ansible]$ vim hosts停掉之前的keepalived服务[devopsserver1 ansible]$ vim keepalived.yml[devopsserver1 ansible]$ ansible-playbook keepalived.yml --tagst1[devopsserver1 ansible]$ cp /etc/haproxy/haproxy.cfg .[devopsserver1 ansible]$ mv haproxy.cfg haproxy.cfg.j2[devopsserver1 ansible]$ vim haproxy.cfg.j2[devopsserver1 ansible]$ vim haproxy.yml---- hosts: haproxy,webserverstasks:- name: deploy haproxyblock:- name: install haproxyansible.builtin.yum:name: haproxystate: present- name: configure the haproxyansible.builtin.template:src: haproxy.cfg.j2dest: /etc/haproxy/haproxy.cfgnotify: restart service haproxy- name: enable service haproxyansible.builtin.service:name: haproxystate: startedenabled: yeswhen: haproxy in group_names- name: deploy apacheblock:- name: Install the Apacheansible.builtin.yum:name: httpdstate: present- name: Ensure the default Apache port is {{ http_port }}ansible.builtin.template:src: httpd.conf.j2dest: /etc/httpd/conf/httpd.confnotify: restart service httpd- name: Start service httpdansible.builtin.service:name: httpdstate: startedenabled: yes- name: create index.htmlansible.builtin.copy:content: {{ ansible_hostname }}\ndest: /var/www/html/index.htmlwhen: webservers in group_nameshandlers:- name: restart service haproxyansible.builtin.service:name: haproxystate: restarted- name: restart service httpdansible.builtin.service:name: httpdstate: restarted[devopsserver1 ansible]$ ansible-playbook haproxy.yml成功之后可以验证负载均衡
返回列表