首页 文章

ansible定义时间戳的变量

提问于
浏览
1

在设置带有时间戳的变量时,我遇到麻烦,通过我的剧本使用它 . 我想要实现的是在两个服务器中使用发布文件夹名称,并使用相同的时间戳标记新的数据库 .

我在/ ansibleproject / vars /中名为common.yml的文件中定义这些变量 .

timestamp: "{{lookup('pipe', 'date +%Y%m%d%H%M%SZ')}}"
release_name: '{{ repo_tag }}_{{timestamp}}'
new_db_name: '{{release_name}}'

然后,在任务文件上,我正在创建这样的目录:

- name: "Create new release folder"
  file: path={{new_release_path}} state=directory mode=2775 owner=deployment group=deployment
  become: yes

在一个单独的任务文件中,我正在创建这样的数据库:

- name: "Prepare db user rights"
  shell: echo "CREATE DATABASE \`{{new_db_name}}\` CHARACTER SET utf8 COLLATE utf8_general_ci; " > db_create.sql
  when: inventory_hostname ==  groups['app'][0]

- name: "Create new database for new release"
  shell: mysql -h {{mysql_server}} -u{{mysql_username}} -p{{mysql_password}} < db_create.sql
  when: inventory_hostname ==  groups['app'][0]

在我正在部署的两台服务器上创建的文件夹具有相同的时间戳:

drwxrwsr-x  2 deployment deployment 4096 Mar 14 16:36 test_20170314173640Z/

但db名称具有不同的时间戳 .

mysql> show databases;
+---------------------------------------------------------------+
| Database                                                      |
+---------------------------------------------------------------+
| information_schema                                            |
| dummy                                                         |
| mysql                                                         |
| performance_schema                                            |
| test_20170314173819Z                                          |
+---------------------------------------------------------------+

我正在阅读关于“set_fact”来设置时间戳,但这似乎在主机的基础上工作 .

有没有办法让它在服务器和数据库上保持一致?

问候,

1 回答

  • 5

    这是预期的行为,因为变量在使用时是模板化的,但在"defined"(实际上未定义它们)时则不是 .
    因此,为每个任务执行 date +%Y%m%d%H%M%SZ (在不同的原因时间) .

    如果您需要一致性,请使用 set_fact 来 Build 持久性事实:

    - set_fact:
        timestamp: "{{ lookup('pipe', 'date +%Y%m%d%H%M%SZ') }}"
    

    在此之后 timestamp 是一个带有管道结果的普通字符串,而不是像你的情况那样的Jinja表达式 .

    您可以为每个主机或仅为 localhost 创建此事实,并将其作为 hostvars['localhost'].timestamp 从其他主机访问 .

相关问题