基于中国本土的选项,请将以下内容翻译成中文:Ansible的基础知识

在我们上次构建好了环境之后,我再次从官方文档中总结了一些关于Ansible的内容。

The prerequisite

    • 2018/02/28時点の情報つまりAnsible v2.4

 

    • 以降のリンクは最新版(latest)への参照であり、また正式なレビューも受けていないため、本記事と内容が異なる場合は参照先が真

 

    deprecatedなものは記載しない

命令参考指南

首先从常用的(可能的)命令开始。

Ansible(安神)

对主机执行单个任务(playbook)的命令。
单次执行「远程操作(doing ‘remote things’)」。

$ ansible windows -i /etc/ansible/hosts -m win_file -a "path=C:\\\test state=directory"
$ ansible windows -m ping
    • 最初の引数(”windows”)はインベントリのグループ名(”all”を指定すると全部、公式マニュアル上は”host-pattern”)

-iでインベントリファイル(デフォルトは”/etc/ansible/hosts”)を指定

-mで使うモジュール(詳細後述)を指定

-aでモジュールへの引数(argument)を指定

補充說明:庫存文件

直接使用但需要在文件中列出管理对象主机列表。通过使用[groupname]将主机分组。

[groupname]
10.1.1.1
hostname.mydomain.com

[hogeWebServers]
www1.hogehoge.com
www2.hogehoge.com
www3.hogehoge.com

可以用Ansible工具来运行playbook。

这是一个用来创建”playbook”(后述)并执行多个任务的命令。这正是Ansible的真正精髓(应该如此)。

$ ansible-playbook playbook.yml
    • ほとんどの設定(実行サーバ等)はplaybook自体に書くので、実行時は割りとシンプル

-C or –checkをオプション指定すれば実際の変更操作は行わず、起こりうる変更を予測する(try to predict some of the changes that may occur)。

Ansible-保险库

一种用于加密和解密YAML文件的实用工具。Vault是一个地下金库(在《哈利·波特》中也出现过)。如果在Ansible的数据文件(/etc/ansible/group_vars、host_vars文件夹下)中写入了敏感信息(如密码),我们应该对其进行加密。

$ ansible-vault encrypt /etc/ansible/group_vars/windows.yml
    • 暗号化したらansibleやansible-playbook実行時に–ask-vault-passオプションをつけるなりしないと、当然動かない

 

    第一引数にcreateを指定するとエディタが開いて保存時に暗号化

功能定位 : 由Ansible提供的命令行工具
主要用途 : 管理和共享Ansible角色
简化操作 : 提供轻松安装角色的便捷方式
扩展可用性 : 通过从Ansible Galaxy社区下载新角色
高效的角色管理 : 调用、安装、删除和列出角色的支持工具

这个名字很棒。看起来是基于互联网连接(或者自己的共享存储库)的,所以这次不适用。
总之,它似乎是用来管理角色(推测是管理存储库的角色)的实用工具。

Ansible控制台

Ansible的REPL(Read-eval-print loop)是一个控制台实用工具。

$ ansible-console hogeWebServers
-m ping
-m ping

Ansible 配置

显示Ansible配置的命令。

$ ansible-config list
$ ansible-config dump
$ ansible-config view
    • ANSIBLE_CONFIG環境変数でcfgファイルを指定(/etc/ansible/ansible.cfg overrided by ~/.ansible.cfg)

 

    または-c or –configオプションでオーバーライド

ansible-doc → Ansible文档

显示Ansible插件文档的实用工具。

$ ansible-doc -m ping

Ansible-清单

显示库存的实用工具。

$ ansible-inventory --graph all
$ ansible-inventory --list all

Ansible的拉取

从仓库中下载并执行”playbook”的实用工具。

模块

模块是什么?

简单来说,Ansible可以通过模块和参数来执行一些处理,而不需要在控制机上运行本地操作系统命令。这些被称为任务插件、库插件或API。当然,如果有能力的话,也可以开发自己的模块。

简而言之

以下是链接中几乎的翻译。

$ ansible webservers -m service -a "name=httpd state=started"
$ ansible webservers -m ping

使用-m指定模块,-a传递模块参数。大部分模块以”key=value”形式传递参数,当有多个参数时使用空格分隔。也有一些模块像”ping”一样不需要参数。
转换为”playbook”时,可以这样写:

- name: start the webservers
 service:
   name: httpd
   state: started

变成这样。

$ ansible webservers -m command -a "/sbin/reboot -t now"

将其转化为”战略手册”

- name: reboot the webservers
 action: command /sbin/reboot -t now

根据playbook的解释,这是一种过时的写法,而现代的方法是这样写的。

- name: reboot the webservers
 command: /sbin/reboot -t now

除非自己编写模块,否则不需要太过在意,模块应返回JSON格式的响应。
模块应具有幂等性,应在执行前检查状态,如果已经达到最终形式,则最好什么都不做。
具体细节可以在实际使用时进行调查,但似乎应该先浏览一下有哪些选项。

    全モジュールリスト

还有一些第三方制造的模块有时存在,有时则不存在。

YAML 语法

已经开始逐渐出现的”playbook”将以YAML格式记录。类似于HTML对Markdown的作用,它声称相比XML或JSON来说更加人性化,但实际效果如何呢,还不得而知。

列表和字典

在Ansible中,几乎所有的YAML文件都以列表形式开始。列表中的每个项目都是键/值对,通常被称为哈希或字典。YAML可以用”—“表示开头和结尾。

列表中的所有项目都具有相同的缩进级别,并且以“-”(破折号+一个空格)开头。

---
# A list
hogeList:
   - listItem1
   - listItem2
   - listItem3
---

字典可以用“key: value”的形式表示(冒号后面必须有一个空格)。

---
# A dictionary
hogeDict:
   name: hogename
   attr: hogeattr
   value: hogevalue
---

列表和字典都可以用缩写形式来编写。

---
hogeList: ['listItem1', 'listItem2', 'listItem3']
hogeDict: {name: hogename, attr: hogeattr, value: hogevalue}
---

跨越多行的指示符的情况。

如果要指定在显示时保留多行文本(类似于HTML中的

标签),或者忽略空行和换行符,,可以分别使用"|"和">"。
# みたままバージョン
asYouCanSee: |
   hogehoge
   the second line
   the third line

# 改行等無視バージョン
ignoreLineBreaks: >
   hogehoge
   hogehoge
   hogehoge

重要事项

如果值中有冒号,需要注意。

test: this is test: which is intended to be meaningless

drive: c:

如果继续这样下去,将会产生语法错误,但是通过使用双引号将其括起来,可以避免这个问题。

test: "this is test: which is intended to be meaningless"

drive: "c:"

然而,也有一些情况下不需要引号(由于没有提及为什么可以这样做,所以详细信息不明)。

windows_path: c:\windows

另外,在Ansible中,变量是以”{{ var }}”的格式保存的,而YAML解析器会将其解释为字典的一行形式,因此在这种情况下也需要使用双引号。此外,还要总结需要引用的其他事项。

hoge: "{{ var }}"
hoge2: "{{ basedir }}/hoge/geho"   # 固定文字列を含む場合は全体をクォート
hoge3: "{{ basedir }}\\hoge\\geho" # バックスラッシュも特殊文字
hoge4: "text which includes white spaces all must be quoted" # スペースを含む文字列も全体をクォート
hoge5: "yes"                       # booleanではなく文字列としての"yes"
hoge6: "1.0"                       # 浮動少数点数ではなく文字列としての"1.0"

剧本

最后,用这个来结束。
如果模块是工具的话,”playbooks”就是操作手册,而清单则是材料(这是一个对于喜欢DIY的人来说比较容易理解的比喻,也许?)。
另外,他说,“先读一下,这些是最佳实践!”

首先,将文档中的示例直接写入。

---
- hosts: webservers
 vars:
   http_port: 80
   max_clients: 200
 remote_user: root
 tasks:
 - name: ensure apache is at the latest version
   yum: name=httpd state=latest
 - name: write the apache config file
   template: src=/srv/httpd.j2 dest=/etc/httpd.conf
   notify:
   - restart apache
 - name: ensure apache is running (and enable it at boot)
   service: name=httpd state=started enabled=yes
 handlers:
   - name: restart apache
     service: name=httpd state=restarted
---

“key=value” 这部分也可以用字典格式表示。

---
- hosts: webservers
 vars:
   http_port: 80
   max_clients: 200
 remote_user: root
 tasks:
 - name: ensure apache is at the latest version
   yum:
       name: httpd
       state: latest
 - name: write the apache config file
   template:
       src: /srv/httpd.j2
       dest: /etc/httpd.conf
   notify:
   - restart apache
 - name: ensure apache is running (and enable it at boot)
   service:
       name: httpd
       state: started
       enabled: yes
 handlers:
   - name: restart apache
     service:
         name: httpd
         state:restarted
---

那么,哪个更容易阅读(或易于维护,或容易从Excel或其他方式自动生成)呢?

hosts和remote_user

主持人

hosts行是一个包含一个或多个组或主机模式列表的行。如果要指定多个,则使用冒号“:”进行分隔。详细信息参见pattern部分的说明。

远程用户

需要解释的程度非常明显,表示在受管理的服务器上执行”play”命令的用户名。
可以按任务单位进行指定。

---
hosts: webservers
   remote_user: root
   tasks:
       - name: test
       ping:
       remote_user: ec2-user
---

成为

指定用于使用sudo或其他权限升级方式来执行的情况。

---
hosts: webservers
   remote_user: ec2-user
   tasks:
       - name: test
       ping:
       become: root
       become_method: sudo
---

顺序控制

如果有多个主机被涉及,可以使用“order”来控制执行顺序。

存货

 

这是默认选项。按照存货文件中的顺序执行。

 

逆向存货

 

按照存货文件的逆序执行。

 

排序

 

按照执行主机名的字母降序执行。

 

逆向排序

 

按照执行主机名的字母升序执行。

 

随机

 

以随机的顺序执行。

任务清单

每个”play”都包含一个任务列表,并顺序逐个执行。出现错误的主机将被跳过。如果失败,请进行修正并重试(这就是为什么模块的幂等性在”playbook”中很重要,如果在”playbook”中使用的模块具有幂等性,那么整个”playbook”也将具有幂等性)。
给所有任务命名(使用”name”)。结果将以易读的方式输出到日志中。如果未指定,则仅显示”action”。

变量

在中文中用以下方式表达:
可以在”playbook”的vars部分或主机变量或组变量”Host Variables”和”Group Variables”中声明变量,并且可以在操作行中通过”{{varName}}”引用变量。
变量名只能包含字母(a-zA-Z)、下划线(”_”)和数字,并且必须以字母开头。
在YAML中,由于可以使用字典,因此也可以使用”[]”和”.”表示法来引用变量。

---
- hosts: webservers
 vars:
   hoge1: hogevalue1
   hoge2: hogevalue2
 tasks:
   - name: test1
     command: /bin/echo {{ hoge1 }}
   - name: test2
     command: /bin/echo {{ hoge2 }}
   - name: test3
     command: /bin/echo vars.hoge1
   - name: test4
     command: /bin/echo vars['hoge2']

---

以下为给出的中文翻译:
处理器

如果我们想要定义一个任务,用于更改配置文件,并只有在实际发生更改时才重新启动特定的服务,那么我们可以使用处理器来实现。

---
- hosts: webservers
 tasks:
   - name: replace httpd.conf
     template: 
       src: template.conf
       dest: /etc/apache/conf/httpd.conf
     notify:
       - restart memcached
       - restart apache
 handlers:
     - name: restart memcached
       service: 
         name: memcached
         state: restarted
     - name: restart apache
       service:
         name: apache
         state: restarted
---

在”nofify”字段指定的列表中,会有处理程序(handler),在”handlers”部分中会包含实际的操作(与一般的”tasks”几乎相同)。在”handlers”部分的列表中,设置”name”字段为处理程序中定义的字符串(需要在全局中唯一)。
需要注意的是,”handlers”动作的执行顺序是按照定义的顺序进行,而不是按照”notify”的顺序。
另外,还可以将”listen”添加到”handlers”的任务中来实现不同的方法。

---
 tasks:
  - name: replace httpd.conf
    template: src=template.conf dest=/etc/apache/conf/httpd.conf
    nofity: "restart web services"

 handlers:
     - name: restart memecached
       service: name=memcached state=restarted
       listen: "restart web services"
     - name: restart apache
       service: name=apache state=restarted
       listen: "restart web services"
---

此外,如果想要执行所有处理程序,可以通过插入”meta”行来实现。

tasks:
 - shell: /bin/echo executing all handler tasks
 - meta: flush_handlers
 - shell: /bin/echo done

YAML 语法检查

使用ansible-playbook命令时,可以通过添加–syntax-check选项来进行确认。此外,要确认执行的目标主机,请添加”–list-hosts”选项。

$ ansible-playbook playbook.yml --syntax-check
$ ansible-playbook playbook.yml --list-hosts
スクリーンショット 2018-02-28 19.33.17.png

虽然 Ansible 看起来仍然很深奥,或者说底蕴很深,但如果有必要,我愿意再深入学习一些。

bannerAds