1.playbook的核心组件
- Hosts 执行的远程主机列表
- Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最
少元素需包括 name 和 task,一个name只能包括一个task - Variables 内置变量或自定义变量在playbook中调用
- Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
- Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
- ags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此
会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地
长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
1.1ansible命令执行过程
1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
2. 加载自己对应的模块文件,如:command
3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
4. 给文件+x执行
5. 执行并返回结果
6. 删除临时py文件,退出
1.2 ansible常用工具
ansible-vault
ansible-galaxy
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
ansible-vault encrypt hello.yml #加密
ansible-vault decrypt hello.yml #解密
ansible-vault view hello.yml #查看
ansible-vault edit hello.yml #编辑加密文件
ansible-vault rekey hello.yml #修改口令
ansible-vault create new.yml #创建新文件
1.3host组件
1.3.1概念:
aybook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用
于指定要执行指定任务的主机,须事先定义在主机清单中
1.3.2 host文件的书写
[servera] #组名
172.17.8.1
172.17.8.2
172.17.8.3[serverb]
172.17.8.1
172.17.8.4
172.17.8.5[serverc]
servera:serverb #取servera和serverb的并集
#相当于
172.17.8.1
172.17.8.2
172.17.8.3
172.17.8.4
172.17.8.5[serverd]
servera:&server #取servera和serverb组的交集
servera:!serverb #在serevra中但不在serverb中
1.2 task列表和action组件
1.2.1 概念
play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主
机上执行,即在所有主机上完成第一个task后,再开始第二个task,task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致.每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出。
1.2.2 task格式
tasks:- name: install httpdyum: name=httpd#或者
tasks:- name: install httpdyum: name: httpd
2.编写playbook文件
2.1playbook的命令
--syntax-check #语法检查,可缩写成--syntax, 相当于bash -n
-C --check #模拟执行,只检测可能会发生的改变,但不真正执行操作,dry run
--list-hosts #列出运行任务的主机
--list-tags #列出tag
--list-tasks #列出task
--limit 主机列表 #只针对主机列表中的特定主机执行
-i INVENTORY #指定主机清单文件,通常一个项对应一个主机清单文件
--start-at-task START_AT_TASK #从指定task开始执行,而非从头开始,START_AT_TASK为任务的
name
-v -vv -vvv #显示过程
2.2setup变量的调用
查看远程主机默认的setup变量
ansible 172.17.8.11 -m setup
#常用的setup变量
"ansible_facts": {"ansible_all_ipv4_addresses": ["172.17.8.11"],"ansible_default_ipv4": {"address": "172.17.8.11", "alias": "eth0", "broadcast": "172.17.8.255", "gateway": "172.17.8.2", "interface": "eth0", "macaddress": "00:0c:29:87:53:a2", "mtu": 1500, "netmask": "255.255.255.0", "network": "172.17.8.0", "type": "ether"#调用setup中的变量格式:{{ 变量名["变量名下的分支"] }}- hosts: hosttasks:- name: show host ipfile: path: /data/{{ ansible_default_ipv4["address"] }}_{{ ansible_date_time["date"] }}.log state: touch
2.3文件中定义变量
#调用文件中的变量
vim var1.yml
---
- hosts: hostvars: #定义变量user: weng #变量名:定义变量的值group: shiqiangtasks:- name: print debug debug:msg: my name is {{ user }} ,my group is {{ group }} #{{ $name }}引用变量 #文件中的变量相互调用
---- hosts: hostremote_user: rootvars:collect_info: "/data/test/{{ansible_default_ipv4['address']}}/"tasks:- name: create IP directoryfile: name="{{collect_info}}" state=directory#使用变量文件vim vars.yml
---
# variables file
package_name: mariadb-server
service_name: mariadb
vim var5.yml
---
#install package and start service
- hosts: dbsrvs
remote_user: root
vars_files:- vars.yml
tasks:- name: install packageyum: name={{ package_name }}tags: install- name: start serviceservice: name={{ service_name }} state=started enabled=yes
3、实战案例
3.1 基于角色安装mysql5.6
[root@dns-master ansible]# tree
.
├── mysql_role.yml
├── nginx
└── roles └── mysql├── files #存放数据库的配置文件和安装包│ ├── my.cnf #配置文件│ └── mysql-8.0.25-el7-x86_64.tar.gz #mysql的安装包├── tasks #任务列表│ ├── group.yml │ ├── init_data.yml│ ├── install.yml│ ├── linksoft.yml│ ├── main.yml #任务列表│ ├── mysql.conf.yml│ ├── path.yml│ ├── service.yml│ ├── start_file.yml│ ├── unarchive.yml│ └── user.yml└── vars└── main.yml #定义变量参数[root@dns-master tasks]# cat main.yml
- include: group.yml
- include: user.yml
- include: unarchive.yml
- include: linksoft.yml
- include: mysql.conf.yml
- include: init_data.yml
- include: path.yml
- include: start_file.yml
- include: service.yml[root@dns-master tasks]# cat group.yml
- name: create group mysqlgroup:name: mysqlgid: 306[root@dns-master tasks]# cat user.yml
- name: create mysql useruser:name: mysqluid: 306group: mysql[root@dns-master tasks]# cat unarchive.yml
- name: copy tar to remote host and file modeunarchive:src: /data/ansible/roles/mysql/files/{{ mysql_file }}dest: /usr/local/srcgroup: mysqlowner: mysql[root@dns-master tasks]# cat linksoft.yml
- name: create linkfile /usr/local/src/mysqlfile:src: /usr/local/src/mysql-8.0.25-el7-x86_64dest: /usr/local/src/mysqlstate: linkgroup: mysqlowner: mysql[root@dns-master tasks]# cat mysql.conf.yml
- name: create mysql configcopy:src: /data/ansible/roles/mysql/files/my.cnfdest: /etc/my.cnf[root@dns-master tasks]# cat init_data.yml
- name: data dirshell: /usr/local/src/mysql/bin/mysqld --initialize-insecure --user=mysql --datadir=/app/mysql --basedir=/usr/local/src/mysql[root@dns-master tasks]# cat path.yml
- name: PATHcopy:content: 'PATH={{dest_file}}/mysql/bin:$PATH'dest: /etc/profile.d/mysql.sh[root@dns-master tasks]# cat start_file.yml
- name: create start mysql fileshell: /bin/cp {{dest_file}}/mysql/support-files/mysql.server /etc/init.d/mysqld;sed -Ei 's#^(basedir=)$#\1\/usr\/local\/src\/mysql#' /etc/init.d/mysqld;sed -Ei 's#^(datadir=)$#\1\/app\/mysql#' /etc/init.d/mysqld[root@dns-master tasks]# cat service.yml
- name: start mysqlshell: chkconfig --add mysqld;/etc/init.d/mysqld start
关于ansible常用的模块功能,之前做过总结这里就不做总结了,后面还会继续改进,有的案例和内容还没总结好。先凑合这看