ansible 각본 조건 결정주기 및 계층 적 관리 역할의 제목 III
1. ansible 플레이 북, 루프 구문 분석 :
달성 구문을 결정할 때 재활용 with_items 다음 특정 실시 예를 위해 사용될 수있다 Ansible 각본 :
---
vim httpd_v4.yaml
- hosts: websrvs
remote_user: '{{uservar}}'
vars: #定义变量,变量的值为列表
software:
- python-setuptools
- httpd
- mariadb
tasks:
- name: run this command ans ignore the result
shell: hostname
ignore_errors: True #忽略错误,可以继续执行
register: result #将上面shell的结果赋值给result变量
- debug: msg='{{result.stdout}}'
- name: install mysql and httpd
yum: name={{ software }} state=installed #通过调用循环的变量内容来实现批量安装软件
become: yes
with_items: #循环调用software里面的变量
- '{{software}}'
tags: init
- name: guarantee httpd2 is running
service: name=httpd state=started
become: yes
- name: transfer httpd configfile to remote
template: src=./httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #使用模板,传送jinja2文件,也可以用copy模块传送普通文件
notify:
- restart httpd
when: result.stdout == 'rainbondnode01' #通过判断主机名是'rainbondnode01才执行拷贝模板文件
handlers: #触发器
- name: restart httpd
service: name=httpd state=restarted
become: yes
이 예에서 우리는 몇 가지 기술적 인 포인트를 사용 :
- 경우 조건 구문이고;
- 원형 목록 with_items이고;
- 그것은 변수에 할당 된 태스크의 실행의 결과를 등록한다하는 단계;
- sudo는 의미입니다 될;
- 명령 변속을 수행시 = -e uservar gytest --check httpd_v4.yaml, -e는 나타냄이 각본 ansible-각본을 수행하는데 사용될 수있다;
역할 계층 구조 관리 2. ansible 각본 :
1. 어떤 역할은 현장에서 사용됩니까?
우리는 이제 세 개의 호스트를 관리하는 경우, 첫 번째가, 두 번째는 구성 할 아파치 PHP 서버, 세 번째로 구성 할 수는 MySQL 서버를 구성 할 수 있습니다. 우리는 어떻게 플레이 북을 정의합니까?
첫번째는 아파치를 구축하는 제 1 호스트 컴퓨터에 재생을 사용 번째 플레이 PHP의 구축에 사용 된 두 번째 호스트를 사용하여 세 번째 호스트의 제 플레이는 건물의 MySQL 사용 . 플레이 북에서 연극의 정의는, 미래가 전화를 차단에 도움이되지 않습니다, 너무 많은 문제를 반복해서 전송에 도움이되지 않습니다. 예를 들어, 나중에 믹스에 호스트, 호스트 모두 네 번째 아파치 서버뿐만 아니라 PHP 서버를 추가, 우리는 설치 아파치와 PHP 위에 기록 된 네 번째 경기를 쓸 수 있습니다. 이러한 반복 된 코드를 플레이 북.
코드 중복을 피하기 위해, 역할은 코드 중복 호출 할 때 달성 할 수있다. websrvs라는 역할 phpappsrvs 불리는 제 역할 제 역할 dbsrvs라고 정의한다. 그래서 다음과 같이 전화를 호출 할 때 :
hosts: host1
role:
- websrvs
hosts: host2
role:
- phpappsrvs
hosts: host3
role:
- dbsrvs
hosts: host4
role:
- websrvs
- phpappsrvs
이러한 코드는 재사용 할 수 있으며, 각 역할은 독립적으로 통화를 반복 할 수 있습니다. 다음 예제를 사용하는 방법을 보여줍니다.
2. 램프 + 워드 프레스 포럼을 설치하는 역할을합니다 :
역할이 특정 디렉토리 구조를 필요로 다음과 같이 디렉토리 구조 내 실험 램프는 다음과 같습니다
[root@rainbondmanager gytest]# tree
.
├── group_vars
│ └── websrvs
├── hosts
├── roles
│ ├── mysql
│ │ ├── files
│ │ │ └── mysql_init.sh
│ │ ├── handlers
│ │ │ └── main.yaml
│ │ ├── tasks
│ │ │ ├── configure.yml
│ │ │ └── main.yaml
│ │ ├── templates
│ │ │ └── my.cnf
│ │ └── vars
│ │ └── main.yaml
│ ├── php
│ │ ├── files
│ │ ├── handlers
│ │ ├── meta
│ │ ├── tasks
│ │ │ └── main.yaml
│ │ ├── templates
│ │ └── vars
│ │ └── main.yaml
│ └── webserver
│ ├── files
│ │ └── wordpress.tar.gz
│ ├── handlers
│ │ └── main.yaml
│ ├── meta
│ │ └── main.yaml
│ ├── tasks
│ │ └── main.yaml
│ └── templates
│ └── httpd.conf.j2
└── site.yaml
첫 번째 단계 Site.yml 적어도 하나 개의 파일을, 파일 항목이 작전을 수행, 역할은 하나 이상의 디렉토리가 있습니다. 역할 디렉토리는, 예를 들어, 나는 다음 세 개의 디렉토리를 구분, 아파치 PHP는 MySQL의 세 가지 소프트웨어를 설치할 디렉토리 생성 분류 필요가있다 각 디렉토리의 하위 디렉토리가 고정되어, 일반적으로 파일, 처리기 작업으로 나눌 수 있습니다, 템플릿, 바르, 메타. 파일 디렉토리 템플릿 템플릿 파일이며, 작업은 작업 파일입니다, 핸들러가 트리거 YAML 문서를 구성, 파일은 일반적으로 파일 복사 모듈의 로컬 경로에 의해 호출 넣어, 일반 상점 형식 .j2 파일, 바르 변수 정의 파일, 메타 따라 정의 파일입니다;
다음으로, 모든 구성 파일의 내용을 나열하고 간단한 설명을 할 것입니다 :
[root@rainbondmanager gytest]# cat site.yaml
---
- hosts: websrvs
remote_user: root
roles:
- webserver
- hosts: 10.83.32.130
remote_user: root
roles:
- php
사이트가 항목 문서이며, 사용자에 의해 수행 된 호스트, 원격 실행, 역할은 객체를 호출했다. 10.83.32.130 호스트 어플리케이션이 설치된 PHP,이 구성은 호스트 그룹은 상기 어플리케이션 설치 아파치 websrvs를 나타내고;
[root@rainbondmanager gytest]# cat hosts
[websrvs]
10.83.32.130
10.83.32.131
홈 디렉토리는 또한 호스트 파일을 정의에서와 같은 또한 변수를 정의 할 수 있습니다 호스트 파일에 구성된 호스트의 개별 목록의 사용을 지정하는 방법을 호스팅 -i ansible-플레이 북을 사용하여
[websrvs]
10.83.32.130 http_port=80
10.83.32.131 http_port=8080
개인 키와 방법이없는 경우 호스트가 내부 파일에, 사용자는 등의 포트를 SSH, SSH 암호, SSH를 지정할 수 있습니다
[websrvs]
10.83.32.130 ansible_ssh_user=gytest ansible_ssh_pass=123456
10.83.32.131 ansible_ssh_user=gytest ansible_ssh_pass=123456
홈 디렉토리는 전체 그룹에 대한 적용 변수 값, 당신은 그룹을 호스트하는 데 필요한 파일 이름은 호스트 그룹에 적용 할 수라는 이름의 파일에 그룹 이름이 변수의 설정 디렉토리가
[root@rainbondmanager gytest]# cat group_vars/websrvs
http_port: 8080
[root@rainbondmanager gytest]#
의 설치 내용의 아파치 서버 역할을 분석하자
# 第一个是tasks文件内容,里面的copy文件路径直接写相对路径,就是表明file下面的内容,template模板文件也是同理,使用相对路径
[root@rainbondmanager gytest]# cat roles/webserver/tasks/main.yaml
---
- name: installed httpd
yum: name=httpd state=present
tags: install
- name: keep httpd is running
service: name=httpd state=started enabled=true
tags: install
- name: insert iptables rules
shell: iptables -I INPUT -p tcp --dport {{http_port}} -j ACCEPT
- name: transfer index html
copy: src=wordpress.tar.gz dest=/var/www/html/wordpress.tar.gz
tags: install
- name: unzip wordpress
unarchive: src=/var/www/html/wordpress.tar.gz dest=/var/www/html/ copy=no
ignore_errors: True
tags: install
- name: mv wordpress
shell: mv /var/www/html/wordpress/* /var/www/html/
- name: wait for httpd to start
wait_for: port=8080
tags: install
- name: transfer httpd configure file
template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
tags: conf
notify:
- restart httpd
cat roles/webserver/handlers/main.yaml
- name: restart httpd
service: name=httpd state=restarted
# tasks任务里面调用的notify通知,默认就是handlers目录下面的文件内容;
cat roles/webserver/templates/httpd.conf.j2 |grep "{{"
Listen {{http_port}}
ServerAdmin {{ansible_fqdn}}
# 模板文件里面调用了facts变量和自定义变量
cat roles/webserver/meta/main.yaml
dependencies:
- {role: mysql, echo_wars: hello_mysql}
# meta目录下面定义了依赖关系,也就是安装httpd的时候,先要确定mysql运行
ls roles/webserver/files/wordpress.tar.gz
roles/webserver/files/wordpress.tar.gz
# file目录是wordpress的源码包,通过copy模块拷贝到远程主机,并通过解压模块解压
그럼 우리가 설치 한 파일 MySQL 데이터베이스 서버 역할의 내용을 보면 :
[root@rainbondmanager gytest]# cat roles/mysql/tasks/main.yaml
---
- name: install mariadb databases
yum: name={{software}} state=present
with_items:
- '{{software}}'
tags: install
- name: keep mariadb is running
service: name=mariadb state=started enabled=true
tags: install
- name: insert iptables rules
shell: iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
- name: echo_vars
shell: echo '{{echo_vars}}'
register: result
tags: install
- name: excute mysql init scrpts
script: /data/playbooks/gytest/roles/mysql/files/mysql_init.sh
- include: configure.yml
# tasks定义了安装mariadb服务器,启动服务,设置防火墙,执行数据库初始脚本等;
[root@rainbondmanager gytest]# cat roles/mysql/tasks/configure.yml
---
- name: transfer mysql configure file
template: src=my.cnf dest=/etc/my.cnf
notify:
- restart mysql
tags: configure
[root@rainbondmanager gytest]#
# main.yml包含了这个configure.yml,拷贝mysql配置文件到目标机器
[root@rainbondmanager gytest]# cat roles/mysql/handlers/main.yaml
---
- name: restart mysql
service: name=mysql state=restarted
[root@rainbondmanager gytest]#
# 触发器的配置,配置文件更改之后重启mysql
[root@rainbondmanager gytest]# cat roles/mysql/vars/main.yaml
---
software:
- mariadb
- mariadb-server
echo_vars:
- hello_mysql
mysql_port:
- '3306'
[root@rainbondmanager gytest]#
# 变量文件定义,定义了安装mysql的软件包和其他变量
[root@rainbondmanager gytest]# cat roles/mysql/files/mysql_init.sh
#!/bin/bash
#
mysql -uroot -pwordpress2018 -e "update mysql.user set password=password('wordpress2019') where user='root' and host='localhost';"
mysql -uroot -pwordpress2018 -e "grant all privileges ON *.* TO root@'%';"
mysql -uroot -pwordpress2019 -e "flush privileges;"
mysql -uroot -pwordpress2019-e "create database wordpress"
[root@rainbondmanager gytest]#
# mysql初始化脚本,更改root密码,创建wordpress数据库,并给root账户赋权;
[root@rainbondmanager gytest]# cat roles/mysql/templates/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
# mysql的配置文件内容
마지막으로, 우리는 함께 PHP 설치보고
cat roles/php/tasks/main.yaml
---
- name: installed php-fpm
yum: name={{ software }} state=present
tags: install
# 定义安装php的任务
[root@rainbondmanager gytest]# cat roles/php/vars/main.yaml
---
software:
- php
- php-mysql
- php-gd
- php-imap
- php-ldap
- php-odbc
- php-pear
- php-xml
- php-xmlrpc
# 定义安装php的软件包
여기에 쓸 수있는 오늘의 블로그 게시물, 여기에 쓸 수 ansible 시리즈의 주제는 ansible 플레이 북의 더 많은 예제는 GitHub의 주소 https://github.com/ansible/ansible-examples을 참조 할 수 있습니다