文章目录
ansible 配置文件的优先级 尝试开始进行操作 ansible常用模块 ansible 的playbook 示例 安装php playbook中变量的引用
ansible
yum install -y ansible
测试是否可用 ansible localhost -m ping
/etc/ansible/ansible.cfg :主配置文件,配置 ansible 工作特性
/etc/ansible/hosts :配置主机清单文件
/etc/ansible/roles/ :存放 ansible 角色的目录
主配置文件存在 /etc/anible/ansible.cfg
指定特权用户
[privilege_escalation]
become=True
become_method=sudo
become_user=user
become_ask_pass=False
ansible;adhoc;playbook;tasks;Roles;Roles方式编排web集群架构;
配置文件的优先级
1) 最先查找 $ANSIBLE_CONFIG 变量
2) 其次查找当前项目目录下 ansible.cfg
3) 然后查找用户家目录下的 .ansible.cfg
4) 最后查找 /etc/ansible/ansible.cfg
Inventory 文件主要用来填写被管理主机以及主机组信息;(逻辑上定义);
默认 Inventory 文件为 /etc/ansible/hosts ;
当然也可以自定义一个文件,当执行 ansible 命令时使用 -i 选项指定 Inventory
文件位置;
配置主机清单
[webservers]
172.16.1.7
172.16.1.8 ansible_become=yes
ansible_become=yes 这个的意思是加上sudo
尝试开始进行操作
ad-hoc执行步骤
1.加载自己的配置文件,默认 /etc/ansible/ansible.cfg ;
2.查找对应的主机配置文件,找到要执行的主机或者组;
3.加载自己对应的模块文件,如 command ;
4.通过 ansible 将模块或命令生成对应的临时 py 文件,并将该文件传输至远
程服务器对应执行用户 $HOME/.ansible/tmp/ansible-tmp-number/XXX.PY ;
5.执行用户家目录的 `` 文件;
6.给文件 +x 执行;
7.执行并返回结果;
8.删除临时 py 文件, sleep 0 退出;
使用 ad-hoc 执行一次远程命令,注意观察返回结果的颜色;
绿色: 代表被管理端主机没有被修改
黄色: 代表被管理端主机发现变更
红色: 代表出现了故障,注意查看提示
ansible常用模块
command模块
[root@manger ~]# ansible localhost -m command -a 'chdir=/root
echo $PWD'
ansible localhost -m command -a
'creates=/data/file ifconfig eth0'
shell 模块
参数 选项 含义
chdir chdir /opt 执行ansible时,切换到指定的目录
creates creates /data/file 如果文件存在,则跳过执行
removes removes /data/file 如果文件存在,则执行
ansible localhost -m shell -a "ifconfig eth0|awk
'NR==2' "
scripts 模块
ansible webservers -m script -a "/data/yum.sh"
copy模块
ansible webservers -m copy -a "src=./httpd.conf
dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=644"
file模块
ansible webservers -m file -a
"path=/tmp/foo.conf state=touch mode=666"
ansible webservers -m file -a "path=/tmp/foo
state=directory mode=777"
ansible webservers -m file -a "path=/tmp/foo
state=directory owner=root group=root mode=777 recurse=yes"
等模块,有很多平时用不到,这里做一个大概记录
ansible 的playbook
playbook 是一个 由 yaml 语法编写的文本文件,它由 play 和 task 两部分组
成。
play : 主要定义要操作主机或者主机组
task :主要定义对主机或主机组具体执行的任务,可以是一个任务,也可以是多个
任务(模块)
总结: playbook 是由一个或多个 play 组成,一个 play 可以包含多个 task 任
务。
可以理解为: 使用多个不同的模块来共同完成一件事情。
1) playbook 是对 AD-Hoc 的一种编排方式。
2) playbook 可以持久运行,而 Ad-Hoc 只能临时运行。
3) playbook 适合复杂的任务,而 Ad-Hoc 适合做快速简单的任务。
4) playbook 能控制任务执行的先后顺序。
语法 描述
缩进 YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成, 不能
使用tabs
冒号 以冒号结尾的除外,其他所有冒号后面所有必须有空格。
短横线
表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别
作为同一列表。
示例
$cat installed_httpd.yml
#1.定义play
#2.定义task、(Installed、Configure、Init、Systemd)
- hosts: webservers
tasks:
- name: Installed Httpd Server
yum:
name: httpd
state: present
- name: Configure Httpd Server
copy:
src: ./httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
owner: "root"
group: "root"
mode: '0644'
backup: yes
notify: Restart Httpd Server
- name: Init Httpd Server
copy:
src: ./index.html.j2
dest: /var/www/html/test.html
- name: Systemd Httpd Server
systemd:
name: httpd
state: started
enabled: yes
handlers:
- name: Restart Httpd Server
systemd:
name: httpd
state: restarted
上面是用root 用户执行的
下面是用普通用户执行
- hosts: webservers
become: true
become_user: root
tasks:
- name: Installed Httpd Server
yum:
name: httpd
state: present
- name: Configure Httpd Server
copy:
src: ./httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
owner: "nouser"
group: "nouser"
mode: '0644'
backup: yes
notify: Restart Httpd Server
- name: Init Httpd Server
copy:
src: ./index.html.j2
dest: /var/www/html/test.html
owner: "nouser"
group: "nouser"
mode: '0644'
- name: Systemd Httpd Server
systemd:
name: httpd
state: started
enabled: yes
handlers:
- name: Restart Httpd Server
systemd:
name: httpd
state: restarted
检查语法 :ansible-playbook installed_httpd.yml --
syntax-check
执行命令: ansible-playbook installed_httpd.yml
安装php
cat install_nginx_php.yml
#1.安装nginx
#2.安装php
#3.添加nginx虚拟主机,触发重启
#4.配置php,连接redis;触发重启
#5.部署phpadmin;、
- hosts: webservers
vars:
web_site_directory: /ansible/admin2
tasks:
- name: Installed Nginx PHP Server
yum:
name: "{{ item }}"
state: present
loop:
- nginx
- php71w
- php71w-cli
- php71w-common
- php71w-devel
- php71w-embedded
- php71w-gd
- php71w-mcrypt
- php71w-mbstring
- php71w-pdo
- php71w-xml
- php71w-fpm
- php71w-mysqlnd
- php71w-opcache
- php71w-pecl-memcached
- php71w-pecl-redis
- php71w-pecl-mongodb
tags: Install
- name: Create Nginx Process Runtime Group
group:
name: www
gid: 666
tags: Install
- name: Create Nginx Process Runtime User
user:
name: www
uid: 666
create_home: no
tags:
- Install
- Configure
- name: Configure Nginx Nginx.conf
copy:
src: ./conf/nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: 'root'
group: 'root'
mode: '0644'
notify: Restart Nginx Server
tags: Configure
- name: Configure Nginx VHosts ansible.oldxu.com;
template:
src: ./conf/ansible.oldxu.com.conf.j2
dest: /etc/nginx/conf.d/ansible.oldxu.com.conf
notify: Restart Nginx Server
- name: Check Web Configure
shell:
cmd: /usr/sbin/nginx -t
register: Check_Nginx
changed_when:
- Check_Nginx.stdout.find('successful')
- false
- name: Configure php php.ini
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
mode: "{{ item.mode }}"
loop:
- { src: "./conf/php.ini.j2", dest: "/etc/php.ini" , mode: "0644" }
- { src: "./conf/php-fpm.d.www.conf.j2", dest: "/etc/php-fpm.d/www.conf" , mode: "0644" }
notify: Restart PHP Server
- name: Systemd Nginx And PHP Server
systemd:
name: "{{ item }}"
state: started
enabled: yes
loop:
- nginx
- php-fpm
# download code
- name: Create Web Site Directory
file:
path: "{{ web_site_directory }}"
state: directory
owner: 'www'
group: 'www'
mode: '0755'
- name: Unarchive Myadmin Code
unarchive:
src: file/phpmyadmin.zip
dest: "{{ web_site_directory }}"
owner: 'www'
group: 'www'
handlers:
- name: Restart Nginx Server
systemd:
name: nginx
state: restarted
- name: Restart PHP Server
systemd:
name: php-fpm
state: restarted
playbook中变量的引用
变量提供了便捷的方式来管理 ansible 项目中的动态值。 比如 nginx-1.12 ,可能
后期会反复的使用到这个版本的值,那么如果将此值设置为变量,后续使用和修改都
将变得非常方便。这样可以简化项目的创建和维护;
在 Ansible 中定义变量分为如下三种方式:
1) 通过命令行传递变量参数定义
2) 在play文件中进行定义变量
2.1) 通过vars定义变量
2.2) 通过vars_files定义变量
3) 通过inventory在主机组或单个主机中设置变量
3.1) 通过host_vars对主机进行定义
3.2) 通过group_vars对主机组进行定义
vars 形式的变量
- hosts: webservers
vars:
web_packages: httpd
ftp_packages: vsftpd
tasks:
- name: Output Variables
debug:
msg:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
输出结果为
"msg": [
"httpd",
"vsftpd"
]
在 playbook 中使用 vars_files 指定文件作为变量文件,好处就是其他的
playbook 也可以调用;
[root@ansible project1]# cat vars.yml
web_packages: httpd
ftp_packages: vsftpd
- hosts: webservers
vars_files:
- ./vars.yml
tasks:
- name: Output Variables
debug:
msg:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
playbook 传送多个变量
ansible-playbook f5.yml -i hosts -e
"web_packages=GeoIP" -e "ftp_packages=telnet"