ansible是什么
ansible是红帽旗下,使用python语言开发,基于ssh协议工作的一款运维工具,与其相似的工具还有puppet、cfengine、chef、func、saltstack,fabric等。
ansible融合了其他自动化运维工具的优点,实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。
ansible的架构
- Ansible:核心引擎
- Modules:包括 Ansible 自带的核心模块(core modules)及自定义模块 (custom modules);
1. 核心模块:ansible执行的任何任务都不是有自身进行完成,而是调用各种核心模块进行完成;管理主机之前,先调用croe modules进中的模块,然后指明Host Inventory中的主机,完成指定的任务。
2.自定义模块:ansible支持使用任务语言进行模块的开发,用于补充核心模块的功能不足。 - Ansible:核心引擎
- HostInventory :ansible中的主机清单
- Playbooks :YAML格式文件,提高ansible使用的复用性
- Plugins:完成模块功能的补充,包括连接插件、邮件插件等
- Connection Plugins :连接管理主机的插件
Inventory:定义 Ansible 管理主机的清单
ansible的特性
- 高度模块化:调用特定的模块,完成特定的任务
- 基于python语言实现
- 部署简单:无需agent端,更轻量级 。
- 支持playbook
- 幂等性(多次运行结果一样)
- 支持非root用户管理操作,支持sudo
ansible安装
环境:
操作系统
centos7.6
IP地址
- ansible: 192.168.44.100
- node1: 192.169.44.101
关闭ansible node1 node2 中的selinux firewalld以防后续干扰使用,如需启用,也可时候再行启动。
注:本次未使用到ansible的最新特性,仅使用yum的进行安装使用,如需要使用最新特性,请上官方网站上进行下载
安装
yum -y install ansible # 请提前配置好epel的yum源
[root@ansible ~]# ansible --version # 本次使用的ansible版本,截止到本次使用时ansible最新版本为2.8
ansible 2.7.10
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
ansible的简单使用
使用前需要配置ansible主机可以直接免密登录被管理主机
配置主机清单
vim /etc/ansible/hosts # 本次使用的是yum安装,默认主机清单路径
[node1]
192.168.44.101
- 可以直接使用命令行工具 ansible
ansible 主机地址or主机组名or all -m 模块名称-a 模块名称 例:[root@ansible ~]# ansible all -m ping 192.168.44.101 | SUCCESS => { "changed": false, "ping": "pong" }
- ansible-doc
ansible中有众多模块,可使用-l命令列出,使用-s查看模块的简要使用说明
[root@ansible ~]# ansible-doc -l
a10_server Manage A10 Networks AX/SoftAX/Th...
a10_server_axapi3 Manage A10 Networks AX/SoftAX/Th...
a10_service_group Manage A10 Networks AX/SoftAX/Th...
a10_virtual_server Manage A10 Networks AX/SoftAX/Th...
aci_aaa_user Manage AAA users (aaa:User)
aci_aaa_user_certificate Manage AAA user certificates (aa...
aci_access_port_to_interface_policy_leaf_profile Manage Fabric interface policy l...
aci_aep Manage attachable Access Entity ...
aci_aep_to_domain Bind AEPs to Physical or Virtual...
aci_ap
···
- ansible-playbook
用于执行ansible的playbook的命令行工具
playbook的核心元素- Hosts 用于执行的主机
- tasks 主要任务
- variables 将需要修改的配置抽取为变量,简化配置
- templates 可以结合facts针对不同的应用场景进行自动修改生成所需的配置文件
- handle 由特定条件出发的任务
- roles 用于提高playbook的复用性
使用playbook进行lnmp的安装
v1本次使用yum进行nmp的安装,后续如果需要使用编译方式安装自行修改yaml文件即可
- hosts: node1
remote_user: root
tasks:
- name: install {{ packages }}
yum: name={{ packages }} state=installed
vars:
packages:
- nginx
- mariadb-server
- php-fpm
- name: create data dir
command: mkdir -p /data/html
- name: nginx template
template: src=/tmp/nginx.conf dest=/etc/nginx/nginx.conf
- name: php test page
copy : src=/tmp/phptest.php dest=/data/html/
notify: restart nginx
- name: start nginx,php-fpm,mariadb
systemd: name={{ item }} state=started
with_items:
- nginx
- php-fpm
- mariadb
handlers:
- name: restart nginx
systemd: name=nginx state=restarted
tmp下的两个文件
phptest.php
<?php
phpinfo();
?>
nginx.conf中的server段修改内容
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /data/html;
index index.php index.html index.htm;
include /etc/nginx/default.d/*.conf;
location / {
}
location ~ .*\.*.(php|php5)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
报错及解决
第一次运行yaml文件时有一个警告
TASK [install {{ item }}] *********************************************************************************************************************************
[DEPRECATION WARNING]: Invoking "yum" only once while using a loop via squash_actions is deprecated. Instead of using a loop to supply multiple items and
specifying `name: "{{ item }}"`, please use `name: ['nginx', 'php-fpm', 'mariadb']` and remove the loop. This feature will be removed in version 2.11.
Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
是因为第一次使用了循环的方式进行安装,后续替换成了上面yaml中的形式后不在有警告,因为在2.7中不建议使用这种方式。
task was:
- name: Install base packages
apt:
name: "{{ item }}"
state: present
update_cache: yes
with_items:
- htop
- zsh
- s3cmd
Very standard.
The new style with Ansible 2.7 should look like:
- name: Install base packages
apt:
name: "{{ packages }}"
state: present
update_cache: yes
vars:
packages:
- htop
- zsh
- s3cmd
v2为提高playbook的可用性,可使用role的方式将playbook进行拆分,并在下次使用时可直接调用相关的yaml文件
Role的默认存放位置在/etc/ansible/roles
可通过修改配置文件修改role的存放位置
以特定的角色名命名目录,子目录命名规则
- files 存放由copy或者script模块等调用的文件
- templates template模块查找所需模板文件目录
- tasks 至少应该包含一个名为main.yaml文件;其他文件需要在此文件中通过include 进行包含
- handles 至少应该包含一个名为main.yaml文件,其他文件需要通过include进行包含
- vars 至少应该包含一个名为main.yaml文件,其他文件需要通过include进行包含,格式 name:value
- meta 至少应该应该包含一个名为main.yaml文件,其他文件通过include进行包含,定义当前角色的特殊设定及其依赖关系
- default 设定默认变量时使用此目录中的main.yaml文件
子目录不一定需要都存在,需要哪一个创建哪一个
使用时写一个playbook将角色应用到主机上
- hosts: HOSTNAME
remote_user: REMOTE_USER
roles:
- ROLER1
- ROLER2
···
playbook
- hosts: node1
remote_user: root
roles:
- install_lnmp
rolers
[root@ansible roles]# tree
.
└── install_lnmp
├── files
│ └── phptest.php
├── handlers
│ └── main.yaml
├── tasks
│ └── main.yaml
├── templates
│ └── nginx.conf
└── vars
└── main.yaml
[root@ansible install_lnmp]# cat handlers/main.yaml
- name: restart nginx
systemd: name=nginx state=restarted
[root@ansible install_lnmp]# cat tasks/main.yaml
- name: install {{ packages }}
yum: name={{ packages }} state=installed
- name: nginx template
template: src=nginx.conf dest=/etc/nginx.conf
notify: restart nginx
- name: create data dir
shell: mkdir -p /data/html
- name: php_test page
copy: src=phptest.php dest=/data/html
- name: start service
systemd: name={{ item }} state=started
with_items:
- nginx
- mariadb
- php-fpm
[root@ansible install_lnmp]# cat vars/main.yaml
packages:
- nginx
- php-fpm
- mariadb-server