使用ansible脚本、判断力、および役割サイクル

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

この例では、我々はいくつかの技術的なポイントを使用します。

  1. とき、条件付き構文は次のとおりです。
  2. with_itemsは、円形のリストです。
  3. それは、変数に割り当てられたタスクの実行の結果を登録すると述べました。
  4. sudoのを意味しているになります。
  5. コマンド段変速を実行する際に-e USERVAR = gytest --check httpd_v4.yaml、-eを示し、このハンドブックansible-ハンドブックを実行するために使用されてもよいです。

2.ロール階層管理のansible脚本:

1.どのような役割は、現場で使用されるのでしょうか?

  我々は今3ホストを管理している場合は、最初は、第二は、設定するのhttpd PHPサーバー、および第三として設定するには、MySQLサーバを設定することにします。どのように我々は脚本を定義していますか?
  最初は、第二のプレイは、PHPを構築するために使用される第二のホスト、MySQLを構築するために使用される第3のホスト上の第三の遊びを使用して、httpdのを構築するための第1のホストコンピュータ上でプレイを使用しています。脚本における遊びの定義は、将来のコールをブロックに助長されていません、あまりにも面倒で繰り返し転送に助長されていません。例えば、後でミックスにホスト、ホストは、第四のhttpdサーバの両方が、また、PHPサーバーを追加し、我々は、インストールのhttpdと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初段少なくとも1つのファイル、ファイルエントリがハンドブックを行う有し、ロールは、少なくとも1つのディレクトリを持っています。役割ディレクトリが分類を作成したディレクトリで、例えば、私はhttpdのPHPのmysqlの3つのソフトウェアをインストールする必要があり、その後、3つのディレクトリを分け、各ディレクトリのサブディレクトリが固定され、一般的にファイル、ハンドラ、タスクに分割することができ、テンプレートは、varsは、メタ。ファイルディレクトリはテンプレートは、テンプレートファイルは、タスクはタスクファイルで、ハンドラがトリガYAML文書を設定されている、ファイルは一般的にファイルコピーモジュールのローカルパスによって呼び出される入れ、一般的な店舗フォーマット.j2ファイル、 VARSは、変数定義ファイル、メタ依存の定義ファイルです。

次に、私はにすべての設定ファイルの内容を一覧表示し、簡単な説明を行います。

[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、この構成では、ホストグループは、上記のアプリケーションインストールのhttpdをwebsrvs表します。

[root@rainbondmanager gytest]# cat hosts
[websrvs]
10.83.32.130
10.83.32.131

私のホームディレクトリでもよう、また、変数を定義することができhostsファイルに設定されたホストのこの別のリストの使用を指定する方法をホスト-i ansible-脚本を使用し、hostsファイルを定義します

[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]#

のは、インストールされたコンテンツのhttpdサーバーの役割を分析してみましょう

# 第一个是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のアドレスを参照することができ、ここで書くために、ここでansibleシリーズの話題を書くために今日のブログ記事https://github.com/ansible/ansible-examples

更なる詳細は、ボーエンは、修復技術、インターネットの輸送の新しいトレンドを共有するために私の個人的なマイクロチャネル公共番号「クラウド時代のIT運用」、公衆番号に注意してください。共有するためのIT運用保守業界、コンサルティング、運用、技術文書の維持を含みます。DevOpsチームは、そのようなのRedis、MQ等;シェルと運用・保守などのPythonプログラミング言語としてジェンキンス、ZABBIX監視、kubernetes、ELK、ミドルウェアの様々なを使用して、フォーカス;私は十年以上のITの運用・保守に関わる仕事に従事してきました。Linux / Unixシステムの運用・保守業務における2008年のフルタイムので、運用・保守に関する技術の理解のある程度があります。この数は、すべての公共のポストは私の実際の仕事の経験の概要、基本的には元のブログ記事です。私はあなたと共有するI蓄積された経験、技術の共有を体験することは非常に幸せです!そして、私たちはITのキャリアパスの運用・保守に一緒に成長し、進歩したいと考えています。使用ansible脚本、判断力、および役割サイクル

おすすめ

転載: blog.51cto.com/zgui2000/2425425