简单几句话了解Ansible-playbook
一、了解Ansible配置文件及优先级问题
- Ansible配置文件
]$ /etc/ansible/ansible.cfg
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #本机的临时执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行是否询问sudo的ssh密码
#ask_pass = True #每次执行是否询问ssh密码
#remote_port = 22 #远程主机端口
host_key_checking = False #跳过检查主机指纹
log_path = /var/log/ansible.log #ansible日志
[privilege_escalation] #如果是普通用户则需要配置提权
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
- Ansible配置文件优先级
项目目录{ansible.cfg} > 当前用户家目录{.ansible.cfg} > /etc/ansible/ansible.cfg
- Ansible 各模块使用——查帮助
ansible-doc module # ansible-doc shell
ansible $group -m $module -a '$CMD' (-i $hosts)
# ansible lingchen -m yum -a "name=nginx state=latest enablerepo=epel exclude=kernel*,foo*" -i hosts
# ansible lingchen -m copy -a "src=./nginx.conf dest=/etc/nginx/conf/nginx.conf owner=lingchen group=lingchen mode=644 backup=yes" -i hosts
- 各模块简单说明
command shell 本质上执行都是基础命令 (command不支持管道技术)
yum模块 安装present 卸载absent 升级latest 排除exclude 指定仓库enablerepo
get_url 下载互联网软件至本地
service 启动服务
…………
二、了解playbook 格式
Playbook 由yaml语法格式文件进行编排,具有结构清晰、可读性强
注意事项:
- 缩进:使用固定的缩进风格表示层级关系,每层层级关系间缩进需相同,默认推荐使用2空格,不能使用Tab.
- 冒号:除去以冒号结尾的,其他所有情况冒号后面必须要有空格隔开.
- 短横线:代表列表项,使用一个短横线加一个空格,上下多个相同缩进级别的短横线为同一列表.
- 简单的playbook ——[Install NFS NGINX]
]$ cat simple.yaml
---
- hosts: 10.8.3.23
tasks:
- name: Install NFS Server
yum:
name: nfs-utils
state: present
- name: Configure NFS server
copy:
src: ./exports.j2
dest: /etc/exports
owner: root
group: root
mode: '0644'
backup: yes
- name: Create NFS Group
group:
name: www
gid: 666
- name: Create NFS User
user:
name: www
uid: 666
group: 666
shell: /sbin/nologin
create_home: no
- name: Create NFS Data
file:
path: /data
state: directory
owner: www
group: www
recurse: yes
- name: Service NFS Server
service:
name: nfs
state: started
enabled: yes
---
- hosts: 10.8.3.24
tasks:
- name: Client Create NFS Data
file:
path: /data/lingchen
state: directory
- name: Client Mount NFS Server
mount:
src: 10.8.3.23:/data
path: /data/lingchen
fstype: nfs
opts: defaults
state: mounted
----
- hosts: lingchen
tasks:
- name: Install Nginx Server
yum:
name: nginx
state: present
- name: Configure Nginx Server
copy:
src: ./nginx.conf.j2
dest: /etc/nginx/conf/nginx.conf
backup: yes
- name: Configure Httpd WebSite
copy:
src: ./lingchen.j2
dest: /var/www/html/lingchen.html
owner: http
group: http
mode: 644
- name: Service Httpd Server
service:
name: httpd
state: started
enabled: yes
- name: Service Firewalld Server
service:
name: firewalld
state: started
- name: Configure Firewalld Server
firewalld:
zone: public
port: 8010/tcp
permanent: yes
immediate: yes
state: enabled
三、Playbook引用变量
引用变量:顾名思义就是简化精简一个playbook项目,从未维护起来更加方便。
比如:需要一个playbook编写完后,在多处使用同一个值,若需要修改时候,则需要从头到尾修改替换,而使用变量相当于高中数学中的X,X可以为任何值,则只需要替换变量值即可。
定义变量及使用:
定义变量有三种方式
- 通过playbook文件中play的定义,通过vars来进行变量定义,或者通过vars_files进行定义
- 通过inventory主机清单进行变量定义,可通过host_vars对主机进行定义,通过group_vars对主机组进行定义
- 通过执行playbook时使用-e参数指定变量
使用变量:
格式:{{ key }} 固定写法
- 在playboo中play定义变量
- hosts: lingchen
vars:
- web_packages: nginx
- mysql_packages: mariadb
tasks:
- name: Installed {{ web_packages }} {{ ftp_packages }}
yum:
name:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
state: present
- 通过vars_files 变量文件定义,并在playbook中引用
]$ cat vars_lingchen.yml
web_packages: nginx
mysql_packages: mariadb
]$ cat lingchen.yml
- hosts: lingchen
vars_files: ./vars_lingchen.yml
tasks:
- name: Installed {{ web_packages }} {{ ftp_packages }}
yum:
name:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
state: present
- 通过inventory主机清单进行变量定义,在项目目录下创建两个变量的目录==host_vars、 group_vars==
1. 创建目录
]$ mkdir host_vars
]$ mkdir group_vars
2. 在group_vars目录中创建一个文件,文件名与inventory清单中的组名称要保持完全一致
]$ cat group_vars/lingchen
web_packages: nginx
mysql_packages: mariadb
3. playbook中引用变量
]$ cat lingchen2.yml
- hosts: lingchen
tasks:
- name: Install Rpm Packages "{{ web_packages }}" "{{ ftp_packages }}"
yum:
name:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
state: present
*******************************************************************************************
默认情况下,group_vars目录中文件名与hosts清单中的组名保持一致.
比如在group_vars目录中创建了lingchen组的变量,其他组是无法使用lingchen组的变量
系统提供了一个特殊组,all,只需要在group_vars目录下建立一个all文件,编写好变量,所有组都可使用
*******************************************************************************************
- 通过hosts_vars 定义主机变量,文件名与inventory清单中的主机名称要保持完全一致,用法与组变量同理,用all都能解决
- 通过执行playbook时使用-e参数指定变量
]$ cat lingchen5.yml
- hosts: "{{ hosts }}" #注意:这是一个变量名称
tasks:
- name: Install Rpm Packages "{{ web_packages }}" "{{ mysql_packages }}"
yum:
name:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
state: present
[root@m01 project1]# #ansible-playbook -i hosts lingchen5.yml -e "hosts=lingchen"
Ansible-playbook 变量优先级
命令行传参 >> playbook中定义的vars_files>vars >> inventory中定义的host_vars > group_vars/group_name > group_vars-all